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

2024-02-02 08:12

本文主要是介绍基于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)

这篇关于基于tidevice实现iOS app自动化使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670042

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程