Appium+Mac环境搭建

前言

最近开始负责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

1
2
3
4
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,安装命令如下

1
brew install nodejs

安装后使用如下命令安装是否成功

1
2
3
4
atxdeMac-mini:~ atx$ npm -v
6.4.1
atxdeMac-mini:~ atx$ node -v
v8.16.0

Android SDK

使用brew安装Android SDK命令如下

1
brew install android-sdk

安装完成后使用如下命令验证是否安装成功

1
2
3
4
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镜像

镜像设置
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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设备,类似于Androidadb。使用如下命令进行安装:

1
brew install libimobiledevice --HEAD

安装后我们使用可以常用命令来检测是否安装成功

1.获取设备的udid

1
2
atxdeMac-mini:~ atx$ idevice_id -l 
6dd5e55bf4204cd5ad8042dc4ecb2b703bbxxxxx

2.查看设备已经安装的应用bundleID

1
2
3
4
5
6
7
8
9
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)是适用于iOSWebDriver服务器实现,可用于远程控制iOS设备允许启动和终止应用程序,点击和滚动视图或确认屏幕上的视图存在。

这使其成为应用端到端测试或通用设备自动化的完美工具。它的工作原理是链接XCTest.framework和调用AppleAPI直接在设备上执行命令。WebDriverAgentFacebook上开发并用于端到端测试,并被Appium成功采用。

WDA路径

WDA路径其实就是WebDriverAgent.xcodeproj文件所在路径,这里需要注意的是使用Appium-desktop安装和命令安装的WDA文件路径不一样。

  1. Appium-desktop路径如下
1
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/
  1. 命令安装路径如下
1
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/

初始化WDA

进入到WDA目录,使用如下命令初始化WDA,该脚本会使用Carthage下载所有的依赖,使用npm打包响应的js文件

1
2
brew install carthage
./Scripts/bootstrap.sh

执行完成后,使用Xcode直接双击打开WebDriverAgent.xcodeproj这个文件。

设置证书

因为安装到真机上都是需要证书签名的,所以需要准备苹果开发者证书,可以使用公司的企业证书或者个人开发者证书(99美刀一年)

1.首先在TARGETS里面选中WebDriverAgentLib设置好证书

WDAlib_sign

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

WDA-runner-sign

3.如果是免费版的个人证书,还需要修改下WebDriverAgentBundleID,随便加点后缀,只要不跟其他人的重名就好。

bundle_change

运行测试

1.菜单栏选择目标设备

wad_devices

2.Scheme选择WebDriverAgentRunner

WDA-runner

3.最后运行 Product -> Test一切正常的话,手机上会出现一个无图标的WebDriverAgent应用

WDA-iphone

注意:UI Testing需要iOS9.0以上系统版本,所以连接WDA的设备最好是iOS9以上系统版本。

4.此时Xcode控制台界面可以看到设备的IP。如果看不到的话,依次点击Xcode菜单 View->Debug Area->Activity Console

WDA-console

端口转发

1.有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。

1
iproxy 8100 8100

2.打开浏览器输入http://localhost:8100 可以看到页面如下信息,说明WDA连接成功。

1
2
3
4
5
{
"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

1
2
atxdeMac-mini:~ atx$ idevice_id -l 
6dd5e55bf4204cd5ad8042dc4ecb2b703bbxxxxx

2.然后执行如下命令来运行WDA

1
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=1d2c746769435ce0749f7f87b56f80abxxxxxx" test

3.最后还是运行端口转发命令iproxy 8100 8100

WDA运行常见问题

1.安装失败

issue1

解决方法:遇到这个问题,说明手机上已经有一个WebDriverAgent的应用了,只是BundleID不一致,需要先将手机上的卸载掉,重新运行 Product -> Test

2.设备未信任

issue2

解决方案:进入 设置->通用->设备管理->开发者应,然后点击信任,之后再重新运行一遍 Product -> Test

运行调试

可以使用如下代码进行启动iOS app调试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

常见问题

  1. 8100端口被占用
1
2
[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

  1. bundleID错误
1
Encountered internal error running command: Error: App with bundle identifier 'com.xxx.xxxx' unknown.

解决方案:输入正确的BundleID,可以使用ideviceinstaller -l查看正确的BundleID。

  1. 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

参考资料