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

news2024/9/17 8:39:07

一、原理

**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镜像库缓存)即可开箱即用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建SpringBoot项目的几种方式

使用 spring boot 提供的初始化器。 向导的方式,完成 spring boot 项目的创建: 使用 方便.(需要联网)就是下图这个,在pom.xml里 选择依赖,选择些单体SpringBoot需要用到的一些 Spring Web包含SpringMVC Tomcat SQL 基本的JDBC MysqlDriver Mybatis 第…

发电控制系统面临的主要安全威胁

电力行业 工控安全解决思路保障框架从电力行业对工控安全需求看,电力企业在主要是以合规性建设为主,在 2004 年原电监会 5 号令颁布开始,大部 分的电厂控制系统安全 建设已经按照 5 号令的要求进行了整改,形成“安全分区、网络专…

再手写线程池以及性能分析

文章目录前言一、为什么要用线程池线程池的作用线程池的使用场景二、线程池的构成以及相关API的实现线程池中的相关变量类型线程池的创建任务线程实现获取任务线程池的销毁线程池的使用前言 以前写的线程池文章请参考:线程池的简单实现 本次文章是对线程池的再次学…

使用Egg调用mysql实现增删改查接口操作

市场上数据库可视化工具很多,笔者更多时间使用的是 Navicat ,但是因为它是收费的,一些伙伴可能没发使用,所以笔者在这里推荐一款 工具 名为: DBevaer,它所展现出来的能力,与navicat 类似,并且还…

玩RTOS这么久,一问原子操作,蒙了~

已剪辑自: https://mp.weixin.qq.com/s/kvxcOHT-xHtMAjQqJu7Y2g [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3f9Rrei-1668695258073)(https://res.wx.qq.com/mmbizappmsg/zh_CN/htmledition/js/images/icon/audio/icon_qqmusic_source6201b5.sv…

代码随想录——钥匙和房间(图论)

题目 有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。 在形式上,对于每个房间 i 都有一个钥匙列表 rooms[…

tft lcd spi 驱动

tft lcd spi 驱动参考驱动uc1701SPI设备树配置背光控制IO设备树配置SPI控制引脚配置参考驱动uc1701 linux-4.1.15-imx6ul/drivers/staging/fbtftSPI设备树配置 根据原理图修改对应引脚 linux-3.10/arch/arm/boot/dts/sun8iw11p1-pinctrl.dtsi 蔽掉引脚冲突功能 linux-3.10/ar…

如何注册公司网站?【注册公司网站】

公司网站是很多公司的必备品,哪怕公司并不依赖线上业务,也会有自己的公司网站。随着互联网的发展成熟,其实现在注册公司网站基本上都是比较简单的,那么如何注册公司网站呢?下面给大家说一说。 一、注册公司网站前准备…

英伟达发布526.98 WHQL 显卡驱动,支持RTX 4080,三款即将上线游戏

11月16日,英伟达发布了526.98 WHQL 新驱动,支持最新发布的RTX 4080显卡。 新驱动为《蜘蛛侠:迈尔斯莫拉莱斯》、《战锤40k:暗潮》和《魔兽世界:巨龙时代》提供支持。此外,还支持《怪物猎人崛起》的DLAA更新和WRC世代-国际汽联WRC…

【FFmpeg】ffmpeg+nginx-rtmp实现视频流转发

1.应用场景 目前的摄像头厂家能提供出来的视频流格式有限,且chrome已经禁止了对flash的支持,导致像硬盘录像机这种只能提供rtsp格式流地址的摄像头无法接入Web应用,所以不得不对视频的流地址进行分发,通过代码对流地址中的数据进…

数仓开发之DWD层(三)

(附:由于篇幅原因,这里就不在展示代码了,直接告诉大家思路) 目录 五:交易域订单预处理表 5.1 主要任务 5.2 思路分析 5.3 图解 六:交易域下单事务事实表 6.1 主要任务: 6.2 …

泰克AFG31152函数信号发生器Tektronix AFG31152介绍

泰克AFG31152函数信号发生器Tektronix AFG31152 AFG31152 是 Tektronix 的 50 MHz 任意函数发生器。 特征: 的 InstaView™ 技术使工程师能够实时查看被测设备 (DUT) 的实际波形,而无需示波器和探头,从而消除了由阻抗不匹配引起的不确定性…

linux C.UTF-8和en-US.UTF-8语言环境有什么区别?(中文乱码问题)locale命令 centos、ubuntu修改编码集(没搞定!)

文章目录问题背景查看C.UTF-8和en-US.UTF-8语言环境差异关于locale修改编码集centos(没验证)ubuntu问题背景 我在ubuntu16.04虚拟机和英伟达盒子ubuntu18.04上分别部署了ngrest服务 用postman请求,ubuntu16.04虚拟机返回的中文是乱码&#…

软件测试职场焦虑之我对35岁危机的看法

目录 前言 如何理解35岁失业? 本质的原因是什么? 应对35岁失业的策略 总结 前言 这几年关于“35岁失业”的讨论甚嚣尘上,特别是进入疫情时代,身边也越来越多的人开始讨论这个话题。 一方面是疫情带来的巨大变革,…

SpringCloud——微服务介绍+系统架构

目录 1. 微服务介绍 2.系统架构演变 3. 单体应用架构 3.1优点: * 项目架构简单,小型项目的话, 开发成本低* 项目部署在一个节点上, 维护方便 3.2缺点: * 全部功能集成在一个工程中,对于大型项目来讲…

Data Catalog3.0:Modern Metadata for the Modern Data Stack

从2020年开始,在数据领域中,有一个比较流行的术语:The Modern Data Stack(现代数据堆栈),简单理解就是汇集了处理海量数据的最佳工具集。这包括在最好的工具上建立数据基础设施,如用于数据仓库的Snowflake,…

传奇外网架设常见的问题及解决办法-传奇创建人物失败/不开门/PAK显示密码错误/脚本错误

传奇外网架设常见的问题及解决办法-传奇创建人物失败/不开门/PAK显示密码错误/脚本错误 在架设传奇的时候是否有遇到无法创建人物、pak密码错误等一系列情况呢?咱们都知道是架设不对的问题,但是具体是哪部分的问题,很多同学都不清楚&#xff…

JDK与cglib动态代理

JDK动态代理 接口类 public interface Subject {void doSomething(); }接口实现 public class RealSubject implements Subject {Overridepublic void doSomething() {System.out.println("RealSubject do something");} }InvocationHandler类 package daili;imp…

随笔记:计算机基础及进制计数法

随笔记:计算机基础及进制计数法 记录一下最近接触的基本的概念,便于想看的时候随时来翻看一下。 基础理论还是比较重要滴,基础理论还是比较重要滴,基础理论还是比较重要滴 现代计算机是用 0 和 1 来表示信息的,使用的…

6、行为型模式-责任链模式

一、责任链模式描述 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者…