前言
上一篇分享了 Windows环境Appium自动化测试环境搭建 但是由于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及环境变量配置
- 安装完成后输入如下命令进行验证
atxdeMac-mini:~ atx$ java -version
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2 10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2 10, mixed mode, sharing)
Node.js
使用brew
安装Nodejs,安装命令如下
brew install nodejs
安装后使用如下命令安装是否成功
代码语言:javascript复制atxdeMac-mini:~ atx$ npm -v
6.4.1
atxdeMac-mini:~ atx$ node -v
v8.16.0
Android SDK
使用brew安装Android SDK命令如下
代码语言:javascript复制brew install android-sdk
安装完成后使用如下命令验证是否安装成功
代码语言:javascript复制atxdeMac-mini:~ atx$ adb version
Android Debug Bridge version 1.0.41
Version 29.0.1-5644136
Installed as /usr/local/bin/adb
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镜像
镜像设置
代码语言:javascript复制npm install -g cnpm --registry=https://registry.npm.taobao.org
安装命令
使用如下命令来执行安装:
代码语言:javascript复制#安装最新版本
cnpm install -g appium
#安装指定版本
cnpm install appium@1.7.2 -g
Appium-Python-Client 安装
由于我们使用Python来写脚本,所以需要安装Appium-Python-Client客户端。
代码语言:javascript复制pip install Appium-Python-Client
安装校验
appium-doctor可以检测Appium整体依赖环境配置情况。
代码语言:javascript复制cnpm install appium-doctor -g
安装好之后输入appium-doctor
可以查看环境配置情况
atxdeMac-mini:~ atx$ appium-doctor
info AppiumDoctor Appium Doctor v.1.11.1
info AppiumDoctor ### Diagnostic for necessary dependencies starting ###
info AppiumDoctor The Node.js binary was found at: /usr/local/bin/node
info AppiumDoctor Node version is 8.16.0
info AppiumDoctor Xcode is installed at: /Applications/Xcode 10.3.app/Contents/Developer
info AppiumDoctor Xcode Command Line Tools are installed in: /Applications/Xcode 10.3.app/Contents/Developer
info AppiumDoctor DevToolsSecurity is enabled.
info AppiumDoctor The Authorization DB is set up properly.
info AppiumDoctor Carthage was found at: /usr/local/bin/carthage. Installed version is: 0.33.0
info AppiumDoctor HOME is set to: /Users/atx
info AppiumDoctor ANDROID_HOME is set to: /Users/atx/Library/Android/sdk
info AppiumDoctor JAVA_HOME is set to: /Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home
info AppiumDoctor adb exists at: /Users/atx/Library/Android/sdk/platform-tools/adb
info AppiumDoctor android exists at: /Users/atx/Library/Android/sdk/tools/android
info AppiumDoctor emulator exists at: /Users/atx/Library/Android/sdk/tools/emulator
info AppiumDoctor Bin directory of $JAVA_HOME is set
info AppiumDoctor ### Diagnostic for necessary dependencies completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor ### Diagnostic for optional dependencies starting ###
libimobiledevice
libimobiledevice用于连接iOS设备,类似于Android
的adb
。使用如下命令进行安装:
brew install libimobiledevice --HEAD
安装后我们使用可以常用命令来检测是否安装成功
1.获取设备的udid
atxdeMac-mini:~ atx$ idevice_id -l
6dd5e55bf4204cd5ad8042dc4ecb2b703bbxxxxx
2.查看设备已经安装的应用bundleID
atxdeMac-mini:~ atx$ ideviceinstaller -l
Total: 7 apps
com.hunantv.imgotv.interinhouse - 芒果TV国际 6.2.13.1911231710
hk.itools.apper - 应用兔 4.1.1.3
com.mgtv.noah - 茄子短视频 20191029001
com.hunantv.dmsdk.bigdataDemo - BDSDK-iPhone-Demo 4.1.0.1838
com.hunantv.imgotv - 芒果TV 6.5.2.1912111010
com.hunantv.dmsdk.demo - MGTV-DownloadSDK-Demo 1
com.apple.test.WebDriverAgentRunner-Runner - WebDriverAgentRunner-Runner 1
更多资料: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路径如下
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/
- 命令安装路径如下
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/
初始化WDA
进入到WDA
目录,使用如下命令初始化WDA
,该脚本会使用Carthage
下载所有的依赖,使用npm
打包响应的js
文件
brew 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上。
代码语言:javascript复制 iproxy 8100 8100
2.打开浏览器输入http://localhost:8100
可以看到页面如下信息,说明WDA连接成功。
{
"value" : "Unhandled endpoint: / -- http://localhost:8100/ with parameters {n wildcards = (n ""n );n}",
"sessionId" : "D33BB641-B7ED-42AE-A4A2xxxxxx",
"status" : 1
}
命令连接WDA
Xcode虽然可以使设备连接WDA,但是每次只能连接一台设备,而且该软件运行占用内存比较大,所以我们需要使用命令终端来运行WDA,这样方便我们进行自动化或持续集成。
注意:每台设备使用命令连接WDA时需要在xcode上面注册。
1.首先我们获取iOS设备的udid
atxdeMac-mini:~ atx$ idevice_id -l
6dd5e55bf4204cd5ad8042dc4ecb2b703bbxxxxx
2.然后执行如下命令来运行WDA
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调试。
代码语言:javascript复制from 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端口被占用
[debug] [W3C] Encountered internal error running command: Error: Couldn't start port forwarding on port 8100. Please provide a different port using 'wdaLocalPort' capability
[debug] [W3C] at WebDriverAgent.createIProxy (/usr/local/lib/node_modules/appium/node_modules/_appium-xcuitest-driver@2.129.0@appium-xcuitest-driver/lib/wda/webdriveragent.js:263:13)
解决方案:使用命令kill -9 $(lsof -i:8100 -t)
关闭8100端口,然后重新启动appium和iproxy 8100 8100
- bundleID错误
Encountered internal error running command: Error: App with bundle identifier 'com.xxx.xxxx' unknown.
解决方案:输入正确的BundleID,可以使用ideviceinstaller -l
查看正确的BundleID。
- WDA未启动
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
- 设备未信任
An unknown server-side error occurred while processing the command. Original error: Unexpected data: {"Error":"InvalidHostID","Request":"StartSession"}
解决方案:打开xcode
,弹出设备信任弹窗,点击信任即可。
参考资料
- https://segmentfault.com/a/1190000016888385
- https://www.jianshu.com/p/cff879e5ca65
- https://www.cnblogs.com/dreamhighqiu/p/10989962.html