• linux 不依赖xcode成功运行appium+ios自动化


    一、原理

    **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
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    执行以上命令后,过一会去查看镜像,发现已经拉取成功

    **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
    
    
    • 1
    • 2

    3、【安装python3.9】
    3.1、【进入容器分析】进入上面启动的env_ios容器

     sudo docker exec -it env_ios_02 bash
    
    • 1

    进入容器后,可以发现,官方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 
    
    • 1

    在这里插入图片描述

    可以发现,已经链接成功了
    在这里插入图片描述
    3.3、【安装tidevice】

    pip3 install -U "tidevice[openssl]"   # Recommend
    
    • 1

    安装过程如果报错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
    
    • 1
    • 2
    • 3

    如果报错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
    
    • 1

    在这里插入图片描述
    如果这里没有出来任何设备,有可能是宿主机本身就没有安装usbmuxd协议,直接在宿主机层面安装usbmuxd,然后重启linux,ps查看一下协议是否起来即可,过程参考命令

    ps -ef | grep usbmuxd
    sudo apt install usbmuxd
    sudo reboot
    
    • 1
    • 2
    • 3

    4、【启动wdaproxy监听对应设备的wda端口】

    tidevice -u 00008020-### wdaproxy -B com.###.WebDriverAgentRunner.###.xctrunner.xctrunner --port 8100
    
    
    • 1
    • 2

    单机情况,可以不用指定设备,指定特定设备时则使用-u参数,参考:

    tidevice -u 00008020-## wdaproxy ...
    
    • 1

    在这里插入图片描述
    然后启动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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以发现,投屏连接成功:

    在这里插入图片描述
    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
    
    • 1
    • 2

    5.2、针对每个设备指定启动不同appium端口

    appium -p 4725
    appium -p 4727
    
    • 1
    • 2

    6、【代码接口提供】
    6.1、python可以借助django、flask、websocket等将以上过程封装即可。略
    6.2、以上运行的容器,可以打包成新的镜像上传harbor(相当于docker镜像库缓存)即可开箱即用。

  • 相关阅读:
    项目管理之合同管理
    【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】
    Github上都在疯找的京东内部“架构师进阶手册”终于来了
    使用del语句删除名称对引用计数的影响
    Dockerfile 简介
    《Redis基础篇》带你走进Redis的世界 ~ ⭐必看必看⭐
    B树、B+树与磁盘读取的关系
    Redis群集
    Ubuntu 安装Nacos
    JavaScript-Ajax-axios-Xhr
  • 原文地址:https://blog.csdn.net/LiXueFu727224204/article/details/127907226