基于tidevice实现iOS app自动化使用详解

目录

1、IOS自动化工具概述

2、tidevice工具的原理和使用

2.1、tidevice的原理

2.2、tidevice实现的功能

2.3、tidevice的安装

2.4、tidevice的使用

2.4.1、设备管理

1、查看已连接的设备的列表

2、检测设备连接状态

3、等待设备连接,只要有就连接就结束监听

4、等待指定设备连接

5、实时获取设备操作日志

6、获取设备信息

7、查看设备电源信息

8、系统信息

9、关机

10、重启设备

11、截屏保存在当前目录

12、截屏保存在指定目录

13、设备文件管理

14、应用文件管理

2.4.2、应用管理

1、安装应用

2、卸载应用

3、启动应用

4、关闭应用

5、查看已安装应用列表

2.4.4、fps 数据采集

背景:没有Mac OS设备,需要使用Windows完成iOS app自动化测试,这个过程是如何完成的呢,又是借助什么工具呢。

1、IOS自动化工具概述

  • 首先需要知道在iOS设备上是谁在执行发送过去的指令,它就是XCUITest,下面介绍它的由来和作用:
    • XCTest和XCUITest是 iOS 开发中常用的两个测试框架,它们之间存在一定的区别和联系。
    • XCTest:是苹果官方提供的测试框架,可以在 Objective-C 和 Swift 语言中使用。它提供了很多功能强大的测试工具,包括单元测试、性能测试、UI 测试等。使用 XCTest 可以帮助开发者快速编写和运行各种类型的测试用例,并得到详细的测试报告。
    • XCUITest:是 XCTest 框架的扩展,是苹果官方提供的用于 iOS 应用程序 UI 测试的框架。它支持 Objective-C 和 Swift 语言,并提供了一组 API,用于操作 iOS 应用程序的用户界面元素。使用 XCUITest 可以模拟用户对应用程序的操作,如点击按钮、输入文本、滑动屏幕等,并验证应用程序的行为是否符合预期。
  • 从上面可知XCUITest只是一个在iOS设备上执行指令的工具,它并不具备通信能力,所以也就不能和类似appium和wda这些框架进行交互;所以我们还需要一个用于和外部通信的工具,它就是WebDriverAgent,它的作用如下:
    • WebDriverAgent(简称WDA)是一个开源的工具,由 Facebook 提供,用于在 iOS 设备上进行自动化测试。它是基于 WebDriver 协议的实现,通过与客户端的交互来控制 iOS 设备上的应用程序。
    • WebDriverAgent 的主要功能是提供一个接口,使客户端可以发送各种命令和请求,操作 iOS 设备上的应用程序。这些命令和请求可以包括点击按钮、输入文本、滑动屏幕、获取元素信息等等。客户端可以使用各种编程语言、测试框架或测试工具与 WebDriverAgent 进行通信,以实现自动化测试。
    • WebDriverAgent 使用 XCTest 框架来运行测试,并且需要通过 Xcode 进行构建和安装到 iOS 设备上。它通过与设备上的 WebDriverAgentRunner 应用程序进行通信来执行测试。WebDriverAgentRunner 是一个特殊的应用程序,用于启动和管理 WebDriverAgent,以及与客户端进行通信。
    • WebDriverAgent 功能强大且灵活,可以支持各种类型的自动化测试,如 UI 测试、性能测试、功能测试等。它也提供了丰富的 API,用于与 iOS 应用程序进行交互和验证应用程序的行为。
  • WebDriverAgent是基于XCTest框架的,所以需要使用xcodebuild来启动WebDriverAgent,可以很容易的运行在Mac电脑上;可是我们现在没有Mac电脑,那么需要如何才能在Windows或是Linux上执行IOS自动化测试呢,于是tidevice就出现了,它是由阿里开源的可以实现在Windows和Linux上也能执行IOS的自动化测试。

2、tidevice工具的原理和使用

  • 要使用tidevice完成iOS的自动化测试,首先需要确保手机上已经安装有WebDriverAgent,并且知道bundleId,安装WebDriverAgent教程推荐:https://tester-joe.blog.csdn.net/article/details/133134348

2.1、tidevice的原理

  • tidevice 的底层原理主要基于libimobiledevice库和usbmux通信协议。libimobiledevice是一个用于与iOS设备进行通信的开源库,而usbmux通信协议则实现了Mac/Windows/Linux与iOS设备服务间的通信。通过模拟xcodebuild与手机进行通信,tidevice向手机发送特定的指令,启动WDA,从而实现了在Linux和Windows上运行iOS自动化的功能。

2.2、tidevice实现的功能

  • 获取设备信息
  • 应用安装、卸载、启动、停止、查看应用信息、已安装应用列表
  • 设备截图、获取设备日志
  • 启动 WebDriverAgent (跨平台:Mac、Windows、Linux)
  • 性能数据采集

2.3、tidevice的安装

  • Python环境:Python 3.6+
  • tidevice 安装
    • 方式一:

pip install -U "tidevice[openssl]" (推荐)

  • 方式二

pip install -U tidevice (缺少设备配对功能)

  • 查看是否安装成功

tidevice -v

2.4、tidevice的使用

2.4.1、设备管理

1、查看已连接的设备的列表
  • cmd

tidevice list

  • python
from tidevice import Usbmux 
print(Usbmux().device_list())
2、检测设备连接状态

说明:该功能是实时获取,已连接设备、断开设备的状态,所以运行该命令/程序 会挂起阻塞后面的流程,如果不想阻塞后面进程,使用subprocess模块开启子进程完成监测。

  • cmd

tidevice watch

  • python
    • watch_device()函数返回的是一个生成器对象,所以需要使用循环的方式获取数据,获取的数据是字典类型,所以可以根据字段MessageType的值判断设备的连接情况。
from tidevice import Usbmux
for data in Usbmux().watch_device():print(data)
3、等待设备连接,只要有就连接就结束监听
  • cmd
    • 如果已经存在设备连接,检测到后自动结束该命令;如果没有设备连接直到等到有设备连接,再结束该命令

tidevice wait-for-device

4、等待指定设备连接
  • cmd:
    • 等待指定设备连接,如果指定设备有连接,则结束该命令,否则一直挂起等待指定设备连接
    • 注意:tidevice -u $UDID watch 改命令并不具备上面功能,作用还是监测设备的连接情况

tidevice -u $UDID wait-for-device

5、实时获取设备操作日志
  • cmd
    • 该命令会实时打印设备的操作日志,类似 adb logcat 的作用

tidevice -u $UDID syslog

  • Python
from tidevice import Device
device = Device("$UDID")
# 开启 com.apple.syslog_relay服务 它的作用是用于记录系统日志
socket_proxy = device.start_service("com.apple.syslog_relay")
while True:print(socket_proxy.get_socket().recv(1024).decode('utf-8'))
6、获取设备信息
  • cmd
    • 获取设备型号、设备名、系统版本、手机号、序列号、时区、蓝牙地址、Wifi地址等

tidevice info

  • Python
from tidevice import Device
print(Device("$UDID").device_info())
7、查看设备电源信息
  • cmd

tidevice info --domain com.apple.mobile.battery --json

  • Python
from tidevice import Device
import json
domain_info = Device("$UDID").device_info("com.apple.mobile.battery")
print(json.dumps(domain_info))
8、系统信息
  • cmd

tidevice sysinfo

  • Python
from tidevice import Device
Device("$UDID").instruments.system_info()
9、关机
  • cmd

tidevice shutdown

  • Python
from tidevice import Device
Device("$UDID").shutdown()
10、重启设备
  • cmd

tidevice reboot

  • Python
from tidevice import Device
Device("$UDID").reboot()
11、截屏保存在当前目录
  • cmd

tidevice screenshot

  • Python

from tidevice import Device
filename = "screenshot.jpg"
Device("$UDID").screenshot().convert("RGB").save(filename)
12、截屏保存在指定目录
  • cmd

tidevice screenshot /xxx/xxx/screenshot.png

  • Python
from tidevice import Device
file_path = "/xxx/xxx/screenshot.png"
Device("udid").screenshot().convert("PNG").save(file_path)
13、设备文件管理
  • cmd

tidevice -u $UDID fsync

以下是一些常见的文件同步操作及其对应的命令和参数示例:
列出指定路径下的文件: tidevice fsync ls /path/to/directory
删除文件: tidevice fsync rm /path/to/file
查看文件内容: tidevice fsync cat /path/to/file
将文件从设备上拉取到本地: tidevice fsync pull /path/to/device/file /path/to/local/destination
将文件推送到设备上: tidevice fsync push /path/to/local/file /path/to/device/destination
查看文件或目录的详细信息: tidevice fsync stat /path/to/file_or_directory
列出指定路径下的文件和目录树: tidevice fsync tree /path/to/directory

  • Python
from tidevice import Device 
# 示例:获取目录"/"下的文件信息 
print(Device("$UDID").sync.listdir_info("/"))
14、应用文件管理
  • cmd

tidevice -u $UDID fsync -B bundle_id

该命令需要提供两个参数:command 和 arguments。
command:指定要执行的文件同步操作,如 ls、rm、cat 等。
arguments:根据所选的文件同步操作,提供相应的参数。

以下是一些常见的文件同步操作及其对应的命令和参数示例:
列出指定路径下的文件: tidevice fsync -B com.kingdee.MyMoney ls /path/to/directory
删除文件: tidevice fsync -B com.kingdee.MyMoney rm /path/to/file
查看文件内容: tidevice fsync -B com.kingdee.MyMoney cat /path/to/file
将文件从设备上拉取到本地: tidevice fsync -B com.kingdee.MyMoney pull /path/to/device/file /path/to/local/destination
将文件推送到设备上: tidevice fsync -B com.kingdee.MyMoney push /path/to/local/file /path/to/device/destination
查看文件或目录的详细信息: tidevice fsync -B com.kingdee.MyMoney stat /path/to/file_or_directory
列出指定路径下的文件和目录树: tidevice fsync -B com.kingdee.MyMoney tree /path/to/directory

  • Python
from tidevice import Device
# 示例:获取目录"/"下的文件信息
print(Device("$UDID").app_sync(bundle_id).listdir_info("/"))

2.4.2、应用管理

1、安装应用
  • cmd
    • file_or_url:表示本地的.ipa文件地址路径或.ipa包的下载路径
    • 使用url安装的底层原理:先在本地生成一个临时空的.ipa文件,路径为: C:\Users\Admin\AppData\Local\Temp\tmp42jr_gnw\_tmp.ipa ;然后请求下载链接,一边下载一边把下载的内容写入到_tmp.ipa文件中,最后使用_tmp.ipa安装。

tidevice --udid $UDID install file_or_url

tidevice -u $UDID install file_or_url

  • Python
from tidevice import Device
device = Device("$UDID")
device.app_install(file_or_url)
2、卸载应用
  • cmd
    • bundle_id:类比于Android的包名

tidevice --udid $UDID uninstall bundle_id

  • Python
from tidevice import Device
device = Device("$UDID")
device.app_uninstall(bundle_id)
3、启动应用
  • cmd
    • 注意:该命令执行每次都是冷启动,也就是如果应用是打开的会先把应用kill掉,然后再启动。

tidevice --udid $UDID launch bundle_id

  • Python
    from tidevice import Device
    # 注意此方式是强制的冷启动,如果应用已打开则先kill旧进程,然后再启动
    pid = Device("$UDID").app_start(bundle_id)

    • 如果想实现:
    • 已启动且最上层应用,则保持不变;
    • 已启动且退到后台,把应用拉起;
    • 如果未启动,冷启动
  • 则需要改变源码中app_launch()函数下的KillExisting变量,将其改为False,但是请注意,设置KillExisting为False,调用60次以上,instruments服务将崩溃,原因是:多次启动相同的应用程序实例并且不终止旧的进程会导致系统资源耗尽或冲突。这可能会导致 "instruments" 服务无法正常运行,并最终崩溃。

4、关闭应用
  • cmd
    • pid_or_name:表示进程ID或包名(bundle_id)

tidevice --udid &UDID kill pid_or_name

  • Python
from tidevice import Device
Device("$UDID").app_stop(pid_or_name) 
5、查看已安装应用列表
  • cmd

# 查看指定设备的应用列表
tidevice --udid &UDID applist
# 只有一个设备连接的情况,可直接查看
tidevice applist

  • Python
from tidevice import Device
device = Device("$UDID")
# 结果包含设备上全部的应用信息;包括用户应用('Type': 'User'),系统应用('Type': 'System'),插件('Type': 'PluginKit')
apps = device.connect_instruments().app_list()

6、获取指定应用详情应用信息

  • cmd
    • 可以获取:详细信息,如版本、构建版本、安装日期、所需最低操作系统版本等

tidevice appinfo bundle_id

  • Python
from tidevice import Device
device = Device("$UDID")
app_info = device.installation.lookup(bundle_id)
print(app_info)

2.4.3、执行自动化测试

1、启动WebDriverAgent服务

  • cmd
    • WebDriverAgent_bundle_id:表示WebDriverAgent的bundle_id

tidevice wdaproxy -B WebDriverAgent_bundle_id --port 8100

# 指定设备启动WebDriverAgent tidevice -u &UDID wdaproxy -B WebDriverAgent_bundle_id --port 8100

  • 命令详解:
    • tidevice -u &UDID:连接到指定 UDID 的 iOS 设备。UDID 是设备的唯一标识
    • wdaproxy -B WebDriverAgent_bundle_id:启动 WebDriverAgent,并将其绑定到指定的 WebDriverAgent_bundle_id。WebDriverAgent 是一个允许远程控制 iOS 设备的工具,它需要一个唯一的标识符来与设备进行通信。
    • --port 8100:指定将 WebDriverAgent 代理到本地的 8100 端口。这样,你可以通过访问本地的 8100 端口来控制设备上的 WebDriverAgent。
  • 启动后通过访问http://127.0.0.1:8100/status,检测WebDriverAgent服务是否成功启动。

2.4.4、fps 数据采集

  • cmd

tidevice dumpfps

  • Python
from tidevice import Device
device = Device("$UDID")
for data in device.connect_instruments().iter_opengl_data():print(data)

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

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

相关文章

2024-01-06-AI 大模型全栈工程师 - 如何训练百亿参数大模型

摘要 2024-01-06 周六 杭州 晴 本节内容: 讲座模式,学习大模型训练的相关流程。 课程内容 1. Transformer 回顾 2. 模型架构-生成式 3. 预训练数据的构建 4. 中文字典的构建 4. 预训练目标的构建 5. 预训练相关-预训练策略 6. 预训练相关-并行化训练 7. 预训练…

搭建高效企业培训平台:教育系统源码开发详解

为了更好地满足企业培训的需求,许多组织纷纷转向数字化教育,搭建高效的企业培训平台成为当务之急。本篇文章,小编将为您讲解教育系统源码的开发细节,为搭建一个功能强大、灵活高效的企业培训平台提供详尽的指南。 一、教育系统的…

Django响应(一)

一、HttpResponse与JsonResponse 1.1、HttpResponse 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/request-response/#django.http.HttpResponse 返回给浏览器端的响应对象 from django.http import HttpResponse response = HttpResponse("Heres the text o…

程序的内存模型

师从黑马程序员 内存分区模型 内存大方向划分为4个区域 1、代码区:存放函数体的二进制代码,由操作系统管理的 2、全局区:存放全局变量环和静态变量以及常量 3、栈区:由编译器自动分配释放,存放函数的参数值&#…

H12-811_503

503.如下图所示,下列说法正确是?( ) A.主机A和主机B的广播地址相同 B.主机A可以ping通主机B C.主机A和主机B不能获取对方的MAC地址 D.主机A的ARP缓存中存在如下条目10.0.12.5 MAC-B 答案:C 注释: 两个主机IP地址的网…

四大组件 - ContentProvider

参考&#xff1a;Android 这 13 道 ContentProvider 面试题&#xff0c;你都会了吗&#xff1f; 参考&#xff1a;《Android 开发艺术探索》 第 9.5 节&#xff08;ContentProvider 的工作过程&#xff09; 参考&#xff1a;内容提供者程序 参考&#xff1a;<provider>&g…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

SpringMVC处理ajax请求之@ResponseBody注解,将后端数据响应到浏览器

上一篇文章讲到SpringMVC处理ajax请求用到的RequestBody注解SpringMVC处理ajax请求&#xff08;RequestBody注解&#xff09;&#xff0c;ajax向后端传递的数据格式详解-CSDN博客&#xff0c;这个注解帮我们解决了如何将客户端的数据通过json数据传递到服务器&#xff0c;简单说…

数据探索与可视化:可视化分析数据关系-中

目录 一、前言 二、介绍 Ⅰ.一个分类变量和一个连续变量 Ⅱ.两个分类变量的一个连续变量 Ⅲ.两个分类变量和两个连续变量 Ⅳ.一个分类变量和多个连续变量 ①.平行坐标轴 ②.矩阵散点图 三、结语 一、前言 在做数据分析的时候&#xff0c;很少会遇到连续变量和分类变量…

PyTorch如何支持 GPU 加速计算

在 PyTorch 中&#xff0c;torch.Tensor 是核心的数据结构&#xff0c;它与 NumPy 的 ndarray 类似&#xff0c;用于存储和操作多维数据。但与 NumPy 不同的是&#xff0c;PyTorch 的 Tensor 除了能在 CPU 上运行之外&#xff0c;还能够无缝地利用 GPU 进行计算加速。 GPU 加速…

读千脑智能笔记01_新皮质

作者简介 1988年至1992年&#xff0c;创造了平板电脑GridPad&#xff0c;它属于第一批平板电脑 1992年&#xff0c;成立了Palm公司&#xff0c;之后在长达10年的时间内&#xff0c;设计了一些最早的掌上电脑和智能手机&#xff0c;如PalmPilot和Treo 在2002年创立了红木神经科学…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1&#xff1a;创建一个结构化的博客页面9.1.3 案例 2&#xff1a;使用新的表单元素创建事件注册表单9.1.4 案例 3&#xff1a;创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

VScode注释快捷键,RStudio注释快捷键, Texmaker注释快捷键

VScode&#xff1a;一款界面简单的代码编辑器&#xff1b;RStudio: R语言的IDE&#xff0c;包含代码编辑器&#xff0c;运行&#xff0c;绘图窗口等&#xff1b;Texmaker&#xff1a;Latex编译器&#xff08;编辑编译&#xff09;&#xff0c;界面简单&#xff0c;个人认为比Te…

揭秘远程控制APP的便捷之美!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

Kore.ai获10亿元融资,提供定制化类ChatGPT助手

1月31日&#xff0c;生成式AI和企业对话平台Kore.ai在官网宣布&#xff0c;获得1.5 亿美元&#xff08;约10.7亿元&#xff09;融资。本次由FTV Capital 领投&#xff0c;英伟达等跟投。 Kore.ai主要提供银行、医疗、零售、营销、人力资源等多种领域的&#xff0c;定制化类Cha…

【动态规划】【C++算法】1340. 跳跃游戏 V

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 LeetCode1340跳跃游戏 V 给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到&#xff1a; i x &#xff0c;其中 i x < arr.length 且 0 < x…

zsh: command not found: mysql (mac通过安装MySQL后终端cmd找不到mysql命令)

考虑是mysql环境变量没有配置的问题 1.查找mysql安装路径 ps -ef|grep mysql 2.先启动上安装的mysql 3. 查看 .bash_profile 文件 ls -al 查看是否有(.bash_profile)文件 如果没有就输入以下命令创建一个&#xff0c;再查看 touch .bash_profile 4.打开 .bash_profile 文件 …

kubekey网页版安装k8s集群操作流程

kubekey可以一键拉起k8s集群并完成kubesphere的部署&#xff0c;以后kubekey简称kk。kk 3.2版本以前都是在宿主机上完成对应的创建集群、添加节点、升级等操作的&#xff0c;3.2版本后开始往页面操作的方向演进&#xff0c;kk 3.2版本现在还是alpha&#xff0c;所以不推荐在生产…

SpringBoot使用Rabbit详解含完整代码

1. 摘要 本文将详细介绍如何在Spring Boot应用程序中集成和使用RabbitMQ消息队列。RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;用于通过轻量级和可靠的消息在应用程序或系统之间进行异步通信。本文将通过步骤说明、代码示例和详细注释&#xff0c;指导读者在Spring…

【数据分享】1929-2023年全球站点的逐年最高气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…