**1、【常规】**常规情况下,ios自动化需要mac机器,如果强行使用linux运行,过程会提示Xcodebuild Failure,也就是强依赖Xcode。
失败图如下:
**2、【思路】**那有没有什么方法可以绕过xcode的限制呢,还是有的。usbmuxd+tidevice
首先得介绍一下阿里开源的工具tidevice:tidevice官方链接,
能力通俗说就是:该工具能够用于与iOS设备进行通信。能力大致介绍:
介绍中有写到,能模拟Xcode运行XCTest,好了,就是使用使用该能力来进行appium控制ios模拟通信。
usbmuxd协议,能力大致可以理解为:USB协议上实现多路TCP连接,将USB通信抽象为TCP通信媒介。
1、【appium安装】:
1.1、由于appium自己安装依赖过多,需要用到npm、node等依赖,具体见:安装appium服务
1.2、由1.1分析可知,直接看一下docker有没有现成的镜像可用,直接拉下来使用是最方便的方式,先docker search appium一下,发现官方源,好了圈出来的就是我们的使用源。
1.3、docker拉下来
docker pull appium/appium
执行以上命令后,过一会去查看镜像,发现已经拉取成功
**2、【容器化appium镜像】**由于需要跟ios通讯,故需要把ios挂载进去,需要用到usbmuxd协议。
sudo docker run -it --name env_ios_02 -d -v /var/run/usbmuxd:/var/run/usbmuxd -e TZ="Asia/Shanghai" --network host --privileged appium/appium
3、【安装python3.9】
3.1、【进入容器分析】进入上面启动的env_ios容器
sudo docker exec -it env_ios_02 bash
进入容器后,可以发现,官方appium源是基于ubuntu18.04LTS版本搭建的,默认python版本为3.6.9
如果正常使用python3.6.9去安装tidevice,过程会发现一堆乱七八糟的问题,大致为:
a、python cannot import name ‘sysconfig’ from ‘distutils’
b、AttributeError: ‘HTMLParser’ object has no attribute ‘unescape’
等等,用起来超级麻烦,所以需要升级到3.9,笔者用的是Python 3.9.15
3.2、【卸载python3.6及安装python3.9】
具体参考:ubuntu18.04下安装python3.9.2
以上操作完,发现python3出来的还是python3.6.9这是咋回事呢,原来系统只是装了python3.9,但是默认的python3还是python3.6.9,并不会覆盖。
将python3的原来的软连接删除后,再通过python3.9映射一个新的软连接到python3即可解决,
软链接使用方法:ln -s 原文件名 链接文件名
思路:先找到原来的软链接路径,然后建立映射
root@iottest-CR160:~# ln -s /usr/bin/python3.9 /usr/bin/python3
可以发现,已经链接成功了
3.3、【安装tidevice】
pip3 install -U "tidevice[openssl]" # Recommend
安装过程如果报错Attributeerror: htmlparser object has no attribute unescape ( Solved ),可以参考:
Attributeerror: htmlparser object has no attribute unescape ( Solved )解决方案
直接使用方案2即可解决:
pip3 install --upgrade setuptools
pip3 install --upgrade
pip pip3 install --upgrade distlib
如果报错python cannot import name ‘sysconfig’ from ‘distutils’:参考
python cannot import name ‘sysconfig’ from 'distutils’解决方案
装包的过程发现速度好慢,咋整,换个匹配ubuntu18.04LTS国内源即可,参考:
ubuntu21.04 apt镜像源 pip镜像源
清华镜像源
以上都解决后,就可以执行装tidevice的命令了。
安装成功后,自己熟悉一下tidevice的用法,见tidevice官方链接,
插上苹果手机,查看是否连接上
tidevice list
如果这里没有出来任何设备,有可能是宿主机本身就没有安装usbmuxd协议,直接在宿主机层面安装usbmuxd,然后重启linux,ps查看一下协议是否起来即可,过程参考命令
ps -ef | grep usbmuxd
sudo apt install usbmuxd
sudo reboot
4、【启动wdaproxy监听对应设备的wda端口】
tidevice -u 00008020-### wdaproxy -B com.###.WebDriverAgentRunner.###.xctrunner.xctrunner --port 8100
单机情况,可以不用指定设备,指定特定设备时则使用-u参数,参考:
tidevice -u 00008020-## wdaproxy ...
然后启动appium服务,这里只做调试用,固定一个4725端口
然后使用Appium Inspector测试:
配置参考:
{
"appium:deviceName": "iPhone 11",
"platformName": "iOS",
"appium:udid": "00008020-##",
"appium:bundleId": "com.###",
"appium:platformVersion": "15.2",
"appium:webDriverAgentUrl": "http://10.33.##.##:8100",
"appium:noReset": false,
"appium:usePrebuiltWDA": false,
"appium:useXctestrunFile": false,
"appium:skipLogCapture": true
}
可以发现,投屏连接成功:
python代码测试参考以上即可实现。
5、【多机同时运行思路】启动多个appium端口、多个proxy映射,然后匹配连接即可。
5.1、针对每个设备指定转发proxy即可;注意,设备序列号和端口要对应,不能重复!
tidevice -u 00008020-## wdaproxy -B com.###.WebDriverAgentRunner.###.xctrunner.xctrunner --port 8100
tidevice -u 00008030-## wdaproxy -B com.###.WebDriverAgentRunner.###.xctrunner.xctrunner --port 8102
5.2、针对每个设备指定启动不同appium端口
appium -p 4725
appium -p 4727
6、【代码接口提供】
6.1、python可以借助django、flask、websocket等将以上过程封装即可。略
6.2、以上运行的容器,可以打包成新的镜像上传harbor(相当于docker镜像库缓存)即可开箱即用。