背景
在前面的文章中,我分享了《开源云真机平台-Sonic应用实践》、《开源云真机平台Sonic跨版本升级实践》。目前sonic版本已经升级到了最新的2.0.5,但我接入的都是些Android设备,iOS设备之前也尝试过接入,但没有成功,因为我用的是CentOS系统。这两天又用Windows系统重新试了一下,终于成功接入了。下面简单分享一下实践过程以及其中的一些注意事项。
一、准备工作&注意事项
1.Agent必须部署在Mac/Ubuntu/Windows系统,CentOS系统不支持接入iOS设备(这也是我之前一直尝试失败的原因);
2.必须得有一台Mac系统的电脑,且Mac电脑中安装了Xcode,因为前期要构建WebDriverAgent包到iOS设备中,后面可以脱离Mac使用;
3.必须得有个苹果开发者账号,且当前iOS设备的UDID已添加到此开发者账号下,这样才能构建WDA(WebDriverAgent);
4.如果iOS设备准备接入在Windows或Ubuntu系统的Agent上,需要安装:
- usbmux: 这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。所以Windows上可以通过直接安装iTunes来解决,Ubuntu需要单独安装;
- sib:即sonic-ios-bridge,sonic与iOS设备之间的通信桥梁,类似于ADB(Android Debug Bridge)。当然安装淘宝开源的tidevice也就可以,方便查看设备状态以及调试;
二、Mac端工作
有了以上条件,我们就可以执行iOS接入Sonic的相关工作了。接入过程主要分为以下步骤:
- 克隆WebDriverAgent项目到Mac电脑;
- 在Xcode中打开克隆的WebDriverAgent项目,并修改相关信息(后面会具体提到);
- 构建WebDriverAgent包到iOS设备;
1.克隆项目
git clone https://github.com/appium/WebDriverAgent 或 git clone https://github.com/SonicCloudOrg/sonic-ios-wda.git
2.修改WebDriverAgent相关信息
在Mac电脑的Xcode中打开克隆的WebDriverAgent项目,按照如下修改:
① 修改WebDriverAgentLib
Team选择你自己的或者公司的开发者账号,Bundle Identifier改成你自己的名字,不要用原来的,名字任意,例如:com.appium8888.WebDriverAgentLib
② 修改WebDriverAgentRunner
Team仍然选择你自己的或者公司的开发者账号,Bundle Identifier改成你自己的名字,与前面一步修改的保持一致,例如:com.appium8888.WebDriverAgentRunner
③ 选择要构建的包以及iOS设备
记住,一定选的是WebDriverAgentRunner,而不是IntegrationAPP或其他!
我一开始就是默认选了IntegrationAPP导致后面能连接上Server,前台也能看到手机,但是使用不了,一直卡在准备图像中。此时Agent控制台能看到一句提示“com.dagangtest.WebDriverAgentRunner.xctrunner is not in your device!”,如果有这句报错提示,就表明你在选择构建包的时候选择错了!接入Mac再重新选择WebDriverAgentRunner打包构建即可。
④ 构建
顶部Product--Build,成功的话Xcode会提示Build Successed!
⑤ 运行测试
顶部Product--Test,首次运行的话可能会失败,需要在手机上弹出的提示框中点击“信任”设备,再次运行即可。运行成功的话,Xcode会自动将WebDriverAgentRunner包打进iOS设备:
手机上会出现WebDriverAgentRunner APP以及“Automation Running”的浮动水印提示。
三、Windows(Agent端)工作
我之前就是用CentOS端的Agent来接入iOS设备,所以屡屡碰壁。如果你也有这个想法,劝你尽早放弃!我现在已转投Windows怀抱来接入iOS。不过也不用那么悲观,一个Server可以连接多个Agent,CentOS端的Agent用来接入Android设备是完全没问题的。
所以特此声明:以下演示均以Windows为案例,Ubuntu系统未具体尝试,仅提供部分参考思路。
上面打包好WebDriverAgentRunner到iOS手机后,iOS就可以脱离Mac运行,在Windows以及Ubuntu系统上也可以丝滑地开展自动化测试了!Windows/Ubuntu端工作主要分为以下步骤:
- 安装iTunes;
- 安装sib工具;
- Agent配置:修改Agent配置文件,填写WebDriverAgent的bundle-id(包名),插上iOS设备,重启Agent容器;
- 检查前台页面是否成功显示以及能否正常使用;
1.安装iTunes;
安装iTunes的目的主要是为了安装usbmux以及相关的依赖环境,前面已经提到usbmux这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。所以Windows上可以通过直接安装iTunes来解决(通过爱思助手之类的应该也可以),Ubuntu需要单独安装usbmux;
连接手机打开iTunes
首次连接,在手机的提示框中选择信任设备,随后即可连接成功:
2.安装Sib
sib和tidevice两个安装任意一个即可。sib安装比较简单,直接从官网下载下来解压即可,如果想要全局运行就配置个环境变量。
项目地址:https://github.com/SonicCloudOrg/sonic-ios-bridge
下载下来,解压后得到如下文件:
cmd命令行,进入sib.exe所在文件夹,执行以下命令,即可查看当前电脑连接的iOS设备,设备若在线,显示为online。
c:\sonic-ios-bridge>sib devices 00008020-000E74E622BA002E online
3.Agent配置
修改Agent配置文件
主要是修改iOS模块的wda-bundle-id,改为前面在Xcode中修改后的名称,例如:
com.appium8888.WebDriverAgentRunner sonic: agent: # 替换为部署Agent机器的ipv4 host: 192.168.1.188 # 替换为Agent服务的端口,可以自行更改 port: 7777# 替换为前端新增Agent生成的key key: 774ed0c0-b8d6-4bcb-8a68-36bb67d51691 server: # 改成server的SONIC_SERVER_HOST host: 192.168.1.20 # 改成server的SONIC_SERVER_PORT port: 3000modules: android: # 是否开启安卓模块 enable: true# 是否开启sonic-android-supply远程adb调试功能 use-sas: true ios: # 如果不需要连接iOS设备,请将true改为false。开启的windows用户请确保本机已安装iTunes enable: true# 替换为你自己使用的wda的bundleId,如果没有.xctrunner后缀会自动补全,建议使用公司的开发者证书 wda-bundle-id: com.dagangtest.WebDriverAgentRunner sgm: # 是否开启sonic-go-mitmproxy网络抓包功能 enable: true
重启Agent
windows用户,要先在控制台输入 chcp 65001 并回车,再输入以下指令:
java -Dfile.encoding=utf-8 -jar sonic-agent-windows-x86_64.jar
4.前台访问使用
可以看到,两台iOS设备:iPhone XR和iPhone 7已经接入成功:
分别使用两台设备,操作正常
四、iOS使用过程中的一些问题
尽管sonic已经成功接入了iOS设备,但在使用过程中,还是存在诸多问题,远没有Android设备体验流畅。
1.连接超时、拖拽反应过慢
有时候点击事件正常,但拖拽事件会卡半天,然后突然反应过来、把之前积压的事件全部执行了一遍。不知道是不是连接超时的问题。
2.设备连接异常
忘记当时是怎么操作的了
3.无法进入使用页面,设备被占用
点击“马上使用”,打开了一个新标签页,随后该标签页立马消失,但列表中该设备处于被占用状态,导致无法再进入使用页。只能重启Agent或是重新插拔设备。在Android设备上也遇到过,退出使用界面,刷新后,设备仍处于被占用,能不能加一个“强制关闭”按钮操作呢?
4.初始化时间略长
每次退出再进入设备,都要初始化一遍,初始化时间略长,不知道这个能不能优化一下。
附:
1.Ubuntu(Agent端)解决方法
Ubuntu系统因资源限制,未具体尝试,仅提供部分参考思路。
Ubuntu也是属于Linux系统的一种,我当时是用CentOS试的,出现过下列问题,试了很多种方法,始终没有连成功,最终放弃了。但我看过一些帖子,据说Ubuntu按照以下方法解决后是可以连接成功的。
宿主机安装sib
Ubuntu系统的Agent一般是用docker方式部署的,docker容器中是有sib工具的,但在宿主机上也要安装sonic-ios-bridge
下载后解压,进入sib所在目录,执行sib,即可查看相关帮助命令:
宿主机安装usbmuxd、挂载iOS设备
若Agent容器所在的宿主机连接iOS设备后,没有挂载上,执行sib devices命令,可能会出现如下提示:
解决办法:宿主机和容器里面分别安装一遍usbmuxd,并赋予该目录最大权限,重启agent容器
apt-get install usbmuxd chmod777-R /var/run/usbmuxd docker restart sonic-agent_sonic-agent_1
如果还不行,就kill掉然后重启usbmuxd进程,或是直接重启系统。
解决方法参考:
https://sonic-cloud.wiki/d/1754-dockerv150-releaseagentiosios-ios
https://sonic-cloud.wiki/d/1402-v141ioswdaagentwda-bundle-iddocker-composeios/15
2.tidevice安装方法
tidevice相比sib安装起来确实麻烦一些,首先要确保当前系统已安装Python3环境,然后才能安装tidevice。目前 tidevice 库仅支持安装在 python3.7及以上版本中
pip3 install -U"tidevice[openssl]"
安装过程中可能会出现如下报错:
通过上图可以看出,是因为tidevice在安装过程中,安装一个名为cryptography的包时,报错了,cryptography编译失败,因为系统中缺少pep517。
安装pep517
pip install pep517
再次安装cryptography
pip install cryptography
但是还是报错上述同样错误,系统提示pip版本过低。于是升级pip。
升级pip
pip3 install -U pip
pip升级到22.3.1
安装cryptography
再次安装cryptography,安装成功
安装tidevice
再次执行pip3 install -U "tidevice[openssl]" 安装tidevice,安装成功
查看tidevice版本:
[root@sonic bin]# tidevice versiontidevice version 0.9.12
tidevice查看设备列表
tidevice list
总结
以上就是Windows端Agent接入iOS设备的全过程,提供了Ubuntu系统接入过程中出现问题的参考解决方案,以及tidevice的安装方法。下面作个简单总结:
连接iOS设备的前提
关键步骤
- 克隆WebDriverAgent项目到Mac电脑;
- 在Xcode中打开克隆的WebDriverAgent项目,并修改相关信息;
- 构建WebDriverAgent包到iOS设备;
- Windows安装iTunes;
- Windows安装sib工具;
- Windows端Agent配置:修改Agent配置文件,填写WebDriverAgent的bundle-id(包名),插上iOS设备,重启Agent容器;
- 前台访问使用;