搭建iOS App自动化环境
一、测试结构介绍
- 手机端的WDA Runner(WebDriverAgent)类似于appium测试框架中的 UIAutomator Server,将从客户端接收到的控制命令转换为XCUITest 相关API操作,实现对应用界面的控制。WebDriverAgent应用需要通过xcode编译安装。
- usbmuxd是苹果提供的一个服务,用于USB和TCP协议之间的转换,实现在没有网络的情况下也可以连接设备,iTunes和Xcode就使用到了这个服务,所以在环境安装中需要在windows上安装一个iTunes。
- WDA的启动使用阿里开源的tidevice工具。
- Language Bindings为不同语言的测试脚本,比如基于python语言的facebook-wda,基于go语言的gwda等。
WebDriverAgent原理分析
WebDriverAgent是Facebook 在2015年的 SeleniumConf 大会上推出了一款iOS移动测试框架。它在 iOS 端实现了一个 WebDriver server ,通过这个 server 来实现远程控制 iOS 设备。它主要通过连接XCTest.framework来调用Apple的API实现对设备的操作。
WebDriverAgent采用C/S架构,集成appium使用的WebDriver协议规范,通信协议使用Mobile JSON Wire Protocol。
WDAClient:WDA的客户端,测试库facebook-wda 就是 WDA 的 Python 客户端库,通过HTTP协议(Mobile JSON Wire Protocol)与WebDriverAgent进行通信。
WebDriverAgentRunner:运行在手机上的WDA server,默认监听端口为8100,主要功能包括①接收WDAClient的请求并将操作命令发送给XCTest.framework。②将响应发送给WDA Client
tidevice原理分析
前面介绍了iOS的自动化需要通过WebDriverAgent来实现,一种常见的解决方案是使用xcodebuild来启动WebDriverAgent,而xcode需要Mac系统,也就是必须在MAC上进行iOS自动化测试。
tidevice是阿里开源的一个基于Python的iOS自动化工具,通过逆向iOS通信协议,模拟xcodebuild与手机进行通信,向手机发送特定的指令,来启动WDA,从而可以脱离Mac电脑,能够在Linux、Windows上运行iOS自动化。tidevice基于python实现了libimobiledevice中的功能。
tidevice通过usbmuxd与手机通信来启动WDA,通过建立一个TCP连接到usbmuxd的/var/run/usbmuxd TCP端口,然后usbmuxd将请求发送到USB连接的iPhone上。上面提到的libimobiledevice就是一个跨平台的用于与iOS设备进行通信的库。
以上的测试框架介绍摘自这位老哥的内容: 测试开发小记
二、准备环境
工具及系统 | 版本信息 | 描述 |
---|---|---|
macOS | 12.4 | macOS系统 |
Xcode | 13.4 | macOS开发工具 |
iOS设备 | iPhone 6 12.1 | iOS测试设备 |
WebdriverAgent | v3.14.0 | iOS通信服务 |
tidevice | 0.7.14 | Windows逆向通信iOS工具 |
facebook-wda | 1.4.6 | iOS测试框架 |
weditor | 0.6.5 | 查看UI元素工具 |
iTunes | 12.12.4 | Windows连接苹果设备工具 |
下载WebDriverAgent
打开以下链接,下载WebdriverAgent,由于我们这里的测试设备和编译工具版本限制,这里 选择3.14版本
Download WebDriverAgent
安装Xcode
打开app store然后搜索Xcode进行安装
安装完成后给Xcode,添加开发者账户Xcode–>Preference–>Accounts,添加一个开发者账号
开打苹果官网开发网站苹果开发官网,登录该开发者账号->Certificates, Identifiers & Profiles->Devices,确保要测试的Device的IDENTIFIER已添加,如果没有需要添加
连接iOS测试设备
将iPhone连接到windows机器,这个时候虚拟机会弹出将当前的USB设备连接到主机还是虚拟机,这里我们选择虚拟机,然后点击确定
连接成功后会如下显示
编译WebDriverAgent
将下载好的WebDriverAgent拷贝到macOS后然后直接双击WebDriverAgent.xcodeproj文件
第一步选择WebDriverAgent->Info,设置iOS Development Target,由于测试iPhone系统是12.5.5,这里我们选择12.0即可
Build Settings->Deployment (unnamed domain)->iOS Deployment Target->iOS 12.0,此处可能不太准确
Build Settings->Packaging->Product Bundle Identifier->设置唯一的Bundle Identifier(后续都使用这个Bundle)
第二步选择WebDriverAgentLib->General, Bundle Identifier为刚刚设置唯一的Bundle,Deployment Info设置为iOS 12.0
WebDriverAgentLib->Signing&Capabilities,勾选Automatically manage signing, Team选择开发者账户,Bundle Identifier填写之前设置的唯一Bundle
WebDriverAgentLib->Build Settings,设置Deployment和Packaging
第三步设置WebDriverAgentRunner,首先打开Signing&Capabilities
然后同样设置Build Settings当中的Deployment和Packaging
WebDriverAgentRunner->Info->Bundle Identifier,继续填写保持一致的Bundle
第四步设置Build程序
第五步选择要build的设备
第六步,点击Build
Build成功后查看状态
Build成功后点击Test,这个时候测试设备上WebDriverAgentRunner-Runner已成功安装
设置WebDriverAgentRunner-Runner
打开iPhone设置->通用->设备管理->信任开发者App
Windows安装iTunes
访问官网下载iTunes: Download iTunes,选择Windows10 64位下载并安装
安装完成后点击左上角的手机图标,确认windows已连接成功
安装tidevice
该工具要求python环境3.6+
切换到你的项目目录,使用pip3命令来安装tidevice,安装成功后设置全局环境变量
pip3 install -U "tidevice"
使用以下命令查看tidevice是否安装成功
tidevice version
tidevice version 0.7.14
查看当前设备是否可以列举出
tidevice list
UDID NAME MarketName ProductVersion ConnType
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx iPhone6 iPhone 6 12.5.5 usb
查看安装应用
tidevice applist
使用tidevice启动WDA
tidevice -u [设备 udid] wdaproxy -B [wda BundleID通过tidevice applist读取] --port 8100
运行成功后打开浏览器访问: http://127.0.0.1:8100/status
这个时候可以测试一下tidevice功能 ,打开iOS的设置
tidevice launch com.apple.Preferences
运行以上命令如果可以打开设置则通信成功
获取UI元素
使用和Android一样的元素捕捉工具weditor,项目内安装weditor
pip3 install -U "weditor"
安装完成后,项目内直接运行weditor,如果未设置项目路径为全局环境变量,则无法在其他路径运行
facebook-wda自动化
facebook-wda基于python语言,没有像appium那样启动一个中间服务appium server,这也是appium支持多语言的原因。facebook-wda相比appium更加简洁,功能也比较多,appium有的功能基本都提供了。
安装
pip3 install -U facebook-wda
测试:
import wdac = wda.Client('http://localhost:8100') # 8100为启动WDA设置的端口号
c.session().app_activate("com.apple.Preferences") # 打开设置
如果这两行代码运行完iPhone的设置被打开了,则成功
以上iOS的自动化测试环境搭建完成
PS:之前也试过使用Appium进行自动化,但是使用过程中发现Appium的捕捉UI工具Start Session始终连接不上,同时WDA is not response in 30 second, check again after 1s,折腾好久也没找到解决办法,也许是WDA安装的还是有问题吧,如果有知道的也可以告诉我一声