ATX2 iOS设备管理平台搭建

ATX2简介

前面分享了STF Andriod设备远程管理平台的搭建和使用,但是STF不支持iOS设备连接,虽然现在社区有了STF集成iOS设备的开源方案,但是经过实践不太稳定,后面在Testerhome社区发现了一个新的框架ATX2同时支持AndroidiOS设备远程管理,经过实践设备连接非常稳定,所以这里分享下这个平台的搭建和使用。

ATX2是一款可以远程控制AndroidiOS设备的设备管理平台。该平台使用的技术栈为:Python3+NodeJS+RethinkDB 项目目前已经开源,作者是阿里的一位大牛:codeskyblue

image

环境准备

系统环境:Mac Os 10.14(因为要使用iOS设备连接WDA,所以需要Mac Os环境)

python3安装

1
brew install python3

rethinkdb安装

1
brew install  rethinkdb

服务部署

启动ATX2服务有2种方式:

  • Docker部署
  • 源码部署

Docker部署

  1. 使用Docker部署需要安装Docker,具体安装步骤见:Docker安装
  2. 下载项目文件:https://github.com/openatx/atxserver2
  3. 打开命令终端进入该项目目录
  4. 执行如下命令即可启动服务
1
docker-compose up

源码部署

1.启动rethinkdb服务器

1
2
3
4
5
6
7
8
9
10
11
12
atxdeMac-mini:~ atx$ rethinkdb
Running rethinkdb 2.3.6 (CLANG 10.0.0 (clang-1000.10.43.1))...
Running on Darwin 18.2.0 x86_64
Loading data from directory /Users/atx/rethinkdb_data
Listening for intracluster connections on port 29015
Listening for client driver connections on port 28015
Listening for administrative HTTP connections on port 8080
Listening on cluster addresses: 127.0.0.1, ::1
Listening on driver addresses: 127.0.0.1, ::1
Listening on http addresses: 127.0.0.1, ::1
To fully expose RethinkDB on the network, bind to all addresses by running rethinkdb with the `--bind all` command line option.
Server ready, "atxdeMac_mini_local_c34" ea7cf4a5-88fc-49f7-94b6-9c6b55323b04

2.下载ATX2项目文件到本地: https://github.com/openatx/atxserver2

3.打开命令终端切换到该目录下,然后执行命令pip3 install -r requirements.txt安装依赖。

4.启动服务,命令如下:

1
2
3
4
5
6
7
8
#默认方式启动,使用默认的登录方式,默认端口
python3 main.py

# 指定认证方式
python3 main.py --auth simple #默认是一个非常simple的认证,输入邮箱就可以

# 设置监听端口
python3 main.py --port 4000 # 默认监听4000端口

打开页面

启动之后,浏览器打开 http://localhost(本机ip也可以):4000,登录之后就可以顺利的看到设备列表页了,由于还没有接入设备所以设备列表为空。

atx_index.png

设备接入

ATX2可以支持连接AndroidiOS设备,关于Android设备连接这里不细讲,可以参考:https://github.com/openatx/atxserver2-android-provider, 这里我们重点讲解iOS设备的连接。

libimobiledevice

libimobiledevice用于连接iOS设备,类似于Androidadb。使用如下命令进行安装:

1
brew install libimobiledevice

WebDriverAgent

WDA简介

WDA(WebDriverAgent)是适用于iOSWebDriver服务器实现,可用于远程控制iOS设备允许启动和终止应用程序,点击和滚动视图或确认屏幕上的视图存在。

这使其成为应用端到端测试或通用设备自动化的完美工具。它的工作原理是链接XCTest.framework和调用AppleAPI直接在设备上执行命令。WebDriverAgentFacebook上开发并用于端到端测试,并被Appium成功采用(做过Appium iOS自动化的同学相信对这个工具比较熟悉吧)。

这里需要下载ATX2fork版本:https://github.com/openatx/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
6
{
"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
2
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=1d2c746769435ce0749f7f87b56f80abxxxxxx" test

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

WDA运行常见问题

安装失败

issue1

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

设备未信任

issue2

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

ios-provider

下载安装atxserver2-ios-provider,进入到该目录,执行如下命令即可连接iOS设备。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#安装相关依赖
pip3 install -r requirements.txt


# 避免命令行运行出错,运行一次即可
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer


# 解锁keychain,防止签名权限不足问题
security unlock-keychain ~/Library/Keychains/login.keychain


SERVER_URL="http://localhost:4000" # 这里修改成atxserver2的地址
python3 main.py -s $SERVER_URL

连接成功后,如下图所示可以看到连接的iOS设备,点击立即使用即可远程控制。

atx2_iOS_action

证书签名问题
1
2
3
4
5
6
7
8
9
10
11
CodeSign /Users/atx/Library/Developer/Xcode/DerivedData/WebDriverAgent-ciegwgvxzxdrqthilmrmczmqvrgu/Build/Products/Debug-iphoneos/WebDriverAgentLib.framework (in target 'WebDriverAgentLib' from project 'WebDriverAgent')
cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate

Signing Identity: "Apple Development: shuqing@mgtv.com (953S5US289)"

/usr/bin/codesign --force --sign 74EC2787A30C28FBB60BE808F4851E5C1D81211B --timestamp=none /Users/atx/Library/Developer/Xcode/DerivedData/WebDriverAgent-ciegwgvxzxdrqthilmrmczmqvrgu/Build/Products/Debug-iphoneos/WebDriverAgentLib.framework

74EC2787A30C28FBB60BE808F4851E5C1D81211B: no identity found
Command CodeSign failed with a nonzero exit code

参考资料