前言
最近开始负责iOS App UI自动化,之前做Android UI自动化时 分享了 Appium+Win环境搭建 但是由于Win环境不支持iOS设备测试,因此这里再分享Appium+Mac环境搭建,值得一提的是:在Mac环境既可以进行Android也可以进行iOS App自动化测试。
系统环境
设备类型 | 系统版本 |
---|---|
Mac-mini | Mac OS 10.14.6 |
iPhone6 | iOS 12.4.3 |
环境搭建
Xcode
Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。可以在AppStore中安装最新版本,后续我们配置WebDriverAgent
会用到此工具。
JDK
- 点击 JDK下载地址 下载
jdk-xxx_osx-x64_bin.dmg
文件安装。 - 详细安装配置请参考: MAC安装JDK及环境变量配置
- 安装完成后输入如下命令进行验证
1 | atxdeMac-mini:~ atx$ java -version |
Node.js
使用brew
安装Nodejs,安装命令如下1
brew install nodejs
安装后使用如下命令安装是否成功
1 | atxdeMac-mini:~ atx$ npm -v |
Android SDK
使用brew安装Android SDK命令如下
1 | brew install android-sdk |
安装完成后使用如下命令验证是否安装成功
1 | atxdeMac-mini:~ atx$ adb version |
Appium安装
Appium安装有两种方式,一种是通过Appium-desktop
安装,另外是通过npm
命令安装,通过命令安装其实安装的是appium-server
版本,可以通过appium
命令启动服务。任选择一种安装方式即可。
Appium-desktop
可以在官方Github下载对应的软件包下载.dmg
后缀名结尾的包: appium-desktop/releases
通过官网下载速度非常感人,所以我这里提供一个网盘版本的下载地址: Appium-mac-1.15.0-1.dmg 下载安装后启动即可。
命令安装
通过命令 npm install -g
appium来安装。不过由于众所周知的网络原因,直接使用这样安装会非常非常慢,甚至会安装失败,所以我们可以使用国内镜像来安装。
选用的镜像是 淘宝NPM镜像
镜像设置
1 | npm install -g cnpm --registry=https://registry.npm.taobao.org |
安装命令
使用如下命令来执行安装:1
2
3
4
5#安装最新版本
cnpm install -g appium
#安装指定版本
cnpm install appium@1.7.2 -g
Appium-Python-Client 安装
由于我们使用Python来写脚本,所以需要安装Appium-Python-Client客户端。
1 | pip install Appium-Python-Client |
安装校验
appium-doctor可以检测Appium整体依赖环境配置情况。
1 | cnpm install appium-doctor -g |
安装好之后输入appium-doctor
可以查看环境配置情况
1 | atxdeMac-mini:~ atx$ appium-doctor |
libimobiledevice
libimobiledevice用于连接iOS设备,类似于Android
的adb
。使用如下命令进行安装:
1 | brew install libimobiledevice --HEAD |
安装后我们使用可以常用命令来检测是否安装成功
1.获取设备的udid
1 | atxdeMac-mini:~ atx$ idevice_id -l |
2.查看设备已经安装的应用bundleID
1 | atxdeMac-mini:~ atx$ ideviceinstaller -l |
更多资料:ios命令行调试工具libimobiledevice
WebDriverAgent
WDA简介
WDA(WebDriverAgent)是适用于iOS
的WebDriver
服务器实现,可用于远程控制iOS
设备允许启动和终止应用程序,点击和滚动视图或确认屏幕上的视图存在。
这使其成为应用端到端测试或通用设备自动化的完美工具。它的工作原理是链接XCTest.framework
和调用Apple
的API
直接在设备上执行命令。WebDriverAgent
在Facebook
上开发并用于端到端测试,并被Appium
成功采用。
WDA路径
WDA路径其实就是WebDriverAgent.xcodeproj
文件所在路径,这里需要注意的是使用Appium-desktop
安装和命令安装的WDA
文件路径不一样。
- Appium-desktop路径如下
1 | /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/ |
- 命令安装路径如下
1 | /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/ |
初始化WDA
进入到WDA
目录,使用如下命令初始化WDA
,该脚本会使用Carthage
下载所有的依赖,使用npm
打包响应的js
文件1
2brew install carthage
./Scripts/bootstrap.sh
执行完成后,使用Xcode
直接双击打开WebDriverAgent.xcodeproj
这个文件。
设置证书
因为安装到真机上都是需要证书签名的,所以需要准备苹果开发者证书,可以使用公司的企业证书或者个人开发者证书(99美刀一年)
1.首先在TARGETS
里面选中WebDriverAgentLib
设置好证书
2.接着在TARGETS
里面选中WebDriverAgentRunner
,用同样的方法设置好证书。
3.如果是免费版的个人证书,还需要修改下WebDriverAgent
的BundleID
,随便加点后缀,只要不跟其他人的重名就好。
运行测试
1.菜单栏选择目标设备
2.Scheme
选择WebDriverAgentRunner
3.最后运行 Product -> Test
一切正常的话,手机上会出现一个无图标的WebDriverAgent
应用
注意:UI Testing
需要iOS9.0
以上系统版本,所以连接WDA
的设备最好是iOS9
以上系统版本。
4.此时Xcode
控制台界面可以看到设备的IP
。如果看不到的话,依次点击Xcode菜单 View->Debug Area->Activity Console
端口转发
1.有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。
1 | iproxy 8100 8100 |
2.打开浏览器输入http://localhost:8100
可以看到页面如下信息,说明WDA连接成功。
1 | { |
命令连接WDA
Xcode虽然可以使设备连接WDA,但是每次只能连接一台设备,而且该软件运行占用内存比较大,所以我们需要使用命令终端来运行WDA,这样方便我们进行自动化或持续集成。
注意:每台设备使用命令连接WDA时需要在xcode上面注册。
1.首先我们获取iOS设备的udid
1 | atxdeMac-mini:~ atx$ idevice_id -l |
2.然后执行如下命令来运行WDA
1 | xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=1d2c746769435ce0749f7f87b56f80abxxxxxx" test |
3.最后还是运行端口转发命令iproxy 8100 8100
WDA运行常见问题
1.安装失败
解决方法:遇到这个问题,说明手机上已经有一个WebDriverAgent
的应用了,只是BundleID
不一致,需要先将手机上的卸载掉,重新运行 Product -> Test
2.设备未信任
解决方案:进入 设置->通用->设备管理->开发者应
,然后点击信任,之后再重新运行一遍 Product -> Test
运行调试
可以使用如下代码进行启动iOS app调试。1
2
3
4
5
6
7
8
9
10
11
12
13
14from appium import webdriver
def appium_iOS_test():
desired_caps = {}
desired_caps['automationName']='XCUITest' #Xcode8.2以上无UIAutomation,需使用XCUITest
desired_caps['platformName'] = 'iOS'
desired_caps['platformVersion'] = '12.4.1'
desired_caps['deviceName'] ='iphone6'
desired_caps['udid'] = 'xxxxx'
desired_caps['bundleId'] = 'xxxx'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
appium_iOS_Test()
常见问题
- 8100端口被占用
1 | [debug] [W3C] Encountered internal error running command: Error: Couldn't start port forwarding on port 8100. Please provide a different port using 'wdaLocalPort' capability |
解决方案:使用命令kill -9 $(lsof -i:8100 -t)
关闭8100端口,然后重新启动appium和iproxy 8100 8100
- bundleID错误
1 | Encountered internal error running command: Error: App with bundle identifier 'com.xxx.xxxx' unknown. |
解决方案:输入正确的BundleID,可以使用ideviceinstaller -l
查看正确的BundleID。
- WDA未启动
1 | An unknown server-side error occurred while processing the command. Original error: Unable to start WebDriverAgent session because of xcodebuild failure: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to remote server. Original error: Error: read ECONNRESET Make sure you follow the tutorial at https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md. Try to remove the WebDriverAgentRunner application from the device if it is installed and reboot the device. |
解决方案:重新启动WDA
- 设备未信任
1 | An unknown server-side error occurred while processing the command. Original error: Unexpected data: {"Error":"InvalidHostID","Request":"StartSession"} |
解决方案:打开xcode
,弹出设备信任弹窗,点击信任即可。