UI自动化-基于AirTest+Python的ios自动化测试

使用Airtest框架如何在IOS上做UI自动化?

Airtest介绍

AirtestProject是由网易游戏推出的UI自动化测试解决方案,项目构成如下:

  1. Airtest框架
    Airtest 是一个跨平台的、 基于图像识别 的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS:

  2. Poco框架
    Poco 是一款 基于UI控件识别 的自动化测试框架,目前支持Android原生、iOS原生、Unity3D、cocos2dx、UE4和Egret等平台,也可以在其他引擎中自行接入poco-sdk来使用。

  3. AirtestIDE
    AirtestIDE 是一款跨平台的 UI自动化测试编辑器 ,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码。

  4. 手机集群解决方案-DeviceFarm
    DeviceFarm 是网易推出的自动化测试集群解决方案,它是软硬件一体化方案,包含设备集群建设、集群设备批量维护管理、监控报警和云端真机等功能,可以为您在企业内部搭建稳定高效的设备管理平台, 提升设备利用率,赋能自动化测试流程搭建:

  5. Airlab云测试平台
    Airlab云测试平台支持用例管理、脚本管理、任务预约、任务调度、云端报告等功能,可以快速构建企业自动化测试全流程,支持ios和安卓的回归测试及兼容测试。

Airtest文档:https://airtest.doc.io.netease.com/

WebDriverAgent 是什么?

WebDriverAgent是Facebook 推出的一款iOS 移动测试框架,WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备。你可以启动、杀死应用,点击、滚动视图,或者确定页面展示是否正确。
官方github:https://github.com/facebook/WebDriverAgent (官方版本目前已不进行维护)
特点:

  1. 支持真机+模拟机
  2. 简单易上手

在做iOS自动化测试的时候,一般都需要确保手机上已经安装有WebDriverAgent应用,这个WDA应用可以是Airtest修改版、Appium修改版也可以是Facebook原版,本文以Appium修改版为例来进行说明,其他版本同样适用。

  1. Appium对 WebDriverAgent工具进行了封装
  2. Airtest的 iOS-Tagent工具也对WebDriverAgent工具进行了封装。
  3. 既可以使用Appium的 WebDriverAgent 工具来部署iOS真机
  4. 也可以使用Airtest底下的 iOS-Tagent 工具来部署iOS真机。
  5. 对于低版本的iOS(iOS11以下),建议使用Airtest的 iOS-Tagent 工具。
  6. 高版本的使用Appium的 WebDriverAgent 工具。

安装部署

环境准备

注意:尽量升级Xcode到最新版本,iPhone版本大于14,我这里使用的版本情况如下:
Xcode版本:13.4.1
iPhone版本:15.6.1
MacOS版本:12.4
Python版本:3.8+

安装Airtest的iOS-Tagent

参考:https://github.com/AirtestProject/iOS-Tagent/blob/master/Introduction/README_zh.md

安装Appium的WebDriverAgent工具

拉取代码

1
git clone https://github.com/appium/WebDriverAgent

Xcode设置

  1. 进入WebDriverAgent项目根目录,双击打开WebDriverAgent.xcodeproj,然后在Xcode中的TARGETS里选中WebDriverAgentLib,按照下图数字序号依次点击,注意步骤4要开启自动管理签名。
    Xcode设置

  2. 在Team选项那里添加账户然后选中,这里的账户可以是个人免费账户也可以是付费开发者账户,区别在下面会提及。

Xcode设置

  1. 接着在TARGETS里面选中WebDriverAgentRunner,用步骤1、2中同样的方法设置好证书。
    Xcode设置

  2. 如果是个人免费版的证书,还需要修改下WebDriverAgent的BundleID,随便加后缀,不要跟别人重复就好,如果是付费版开发者证书则不需要这步操作。
    Xcode设置

  3. 运行测试

    1. iPhone通过usb连接电脑,在设备里如果可以看到自己的手机即可: Xcode设置
    2. xcode和ios版本需要对应,可在这查看对应关系:https://xcodereleases.com/
    3. 按照下图中提示,分别选择WebDriverAgentRunner和目标设备:Xcode设置
    4. 然后点击Product菜单下的Test,这时候会提示输入本机电脑的密码,输入完成后点击始终允许即可。
    5. 如果是个人免费版证书还会弹出下面的提示:Xcode设置
    6. 这是因为WDA应用没有被信任,需要进入手机设置-> 通用-> 描述文件与设备管理,点击开发者APP信任一下就可以了
    7. 然后再次运行Test,就可以在Xcode控制台看到下面的输出信息:Xcode设置
    8. 通过上面给出的IP和端口,加上/status合成一个url地址,例如http://127.0.0.1:8100/status
    9. 然后浏览器打开,如果出现下图的输出,就说明WDA安装成功了。 Xcode设置
    10. 但是有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上,这个时候执行下面的命令即可:
      1
      2
      brew install --HEAD usbmuxd
      iproxy 8100 8100

连接Airtest

上述步骤执行完成没有问题后就可以用Airtest连接iPhone进行case编写
Airtest设置

写自动化case

iOS 的测试和其他设备差不多,支持图像识别和UI检索,下面简单介绍一个iOS测试例子:

  1. 连接设备
  2. 点击home键
  3. 截屏
  4. 执行滑动操作
  5. 使用poco点击app Safari
  6. 使用poco点击浏览器的搜索框,获取焦点
  7. 在搜索框输入“airtest”
  8. 在搜索页面往下滑动
  9. 判断是否存在airtest官网地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from airtest.core.api import *
from poco.drivers.ios import iosPoco

# 连接设备
auto_setup(__file__)
connect_device("ios:///http://127.0.0.1:8100")

# 初始化iOS原生poco
poco = iosPoco()
# 点击Home键
keyevent("HOME")
# 截屏
snapshot()
# 滑动操作
swipe(Template(r"xxx.png", record_pos=(0.356, -0.174), resolution=(750.0, 1334.0)), vector=[-0.685, 0.0481])

# 点击app Safari
poco("Safari").click()
# 点击浏览器的搜索框
poco("URL").click()
# 输入“airtest”
text("airtest")

# poco的滑动
poco("People also search for").swipe([-0.0541, -0.4206])
# 判断是否存在某个截图目标
exists(Template(r"xxx.png", record_pos=(-0.292, 0.688), resolution=(x, y)))

poco入门
airtest使用

重复执行

  1. 拔掉手机后重新连接usb需要做
    1. 打开WebDriverAgent工程,选择WebDriverAgentRunner,运行菜单栏Product->Test
    2. 执行
      1
      2
      iproxy 8100 8100 
      浏览器访问:127.0.0.1:8100/status或者localhost:8100/status 看到手机信息即表示连接成功
    3. 编写运行自动化case

Airtest技巧

iOS自动化实操–设备基本信息获取与计算器案例详解

局部截图

  1. 打开airtest设置
    Airtest设置
  2. 鼠标放到手机上会自动显示该点的坐标
  3. 实例代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*- encoding=utf8 -*-

    from airtest.core.api import *
    from poco.drivers.ios import iosPoco
    from airtest.aircv import *

    # file_path未文件保存路径,比如:/Users/Desktop/test.png
    file_path="xxx"
    screen = G.DEVICE.snapshot()
    # crop_image的参数:1. 图片,2. 截图坐标(0,270)是左上角坐标,(1284,2650)是右下角坐标
    screen = aircv.crop_image(screen, (0, 270, 1284, 2650))
    aircv.imwrite(file_path, screen, 99)
    print("截图完成..")