【更新公告】Airtest更新至1.3.0.1版本
1. 前言
本次更新为Airtest库更新,版本提升至1.3.0.1版本,主要新增了一些iOS设备相关的装包等接口,以及封装了一些tidevice常用接口。更多更新详情,详见我们下文的描述。
2. 新增iOS设备接口
1)iOS安装接口:install
、install_app
对于 本地USB连接的iOS设备 ,新版本支持装包功能:
# 可以直接使用install接口,支持通过本地.ipa文件安装APP,也支持通过下载链接安装APP
install(r"D:\demo\test.ipa")
install("http://www.example.com/test.ipa") # 也可以先获取当前设备,用device().install_app的方式装包
dev = device()dev.install_app(r"D:\demo\test.ipa")
dev.install_app("http://www.example.com/test.ipa")
2)iOS卸载接口:uninstall
、uninstall_app
对于 本地USB连接的iOS设备 ,新版本支持卸载功能:
# 可以直接使用uninstall接口卸载包体
uninstall("com.netease.cloudmusic")# 也可以先获取当前设备,用device().uninstall_app的方式卸载包体
dev = device()dev.uninstall_app("com.netease.godlike")
3)列出iOS设备所有APP的接口:list_app
对于 本地USB连接的iOS设备 ,新版本支持列出APP列表的功能:
在 list_app("user")
里传入要列出的app类型,我们可以得到相应的app列表。
参数可选 user/system/all
, 分别表示列出用户安装的app/系统app/全部app。
返回值示例:[('com.apple.mobilesafari', 'Safari', '8.0'), ...]
。
dev = device()#列出并打印全部APP
all_app = dev.list_app("all")
print(all_app)#打印系统APP
print(dev.list_app("system"))#列出并打印用户安装的APP
user_app = dev.list_app("user")
print(user_app)
4)iOS剪切板功能:get_clipboard
、set_clipboard
对于iOS设备(本地、远程均可),新版本支持剪切板功能:
#获取剪切板内容
text = get_clipboard()
print(text)#设置剪贴板内容
set_clipboard("content")
注意:当iOS设备为 远程设备 、或者 安装了不止一个wda 时,需要指定具体的 wda_bundle_id
才能使用:
#获取剪切板内容
text = get_clipboard(wda_bundle_id="com.WebDriverAgentRunner.xctrunner")#设置剪贴板内容
set_clipboard("content", wda_bundle_id="com.WebDriverAgentRunner.xctrunner")
3. 新增tidevice相关接口
针对本地USB接入的iOS设备,Airtest结合tidevice的能力,封装了一个 TIDevice
对象,提供了几个常用接口如下:
devices
:列出USB连接的所有设备的UDID
列表list_app
: 列出手机上安装的应用列表,支持对类型进行筛选,包括user/system/all
list_wda
: 列出手机上安装的所有WDA的bundleID
device_info
:获取手机信息install_app
:安装ipa包,支持本地路径或URLuninstall_app
:卸载bundle_id
对应的包体start_app
:启动bundle_id
对应的包体stop_app
:停止bundle_id
对应的包体ps
: 获取当前的进程列表ps_wda
: 获取当前启动中的WDA列表xctest
:启动WDA
可以参考:https://github.com/AirtestProject/Airtest/blob/master/tests/test_tidevice.py 。
代码执行效果示例:
>>> from airtest.core.ios.ios import TIDevice
>>> devices = TIDevice.devices()
>>> print(devices)
['10da21b9091f799891557004e4105ebab3416cb9']
>>> udid = devices[0]>>> print(TIDevice.list_app(udid))
[ ('com.230316modified.WebDriverAgentRunner.xctrunner', 'wda-Runner', '1.0'),]>>> print(TIDevice.list_app(udid, "system"))
[('com.apple.calculator', 'Calculator', '1.0.0'),]>>> print(TIDevice.list_wda(udid))
['com.test.WebDriverAgentRunner.xctrunner']>>> print(TIDevice.device_info(udid))
{'productVersion': '12.4.8', 'productType': 'iPhone7,2', 'modelNumber': 'MG472', 'serialNumber': 'DNPNW6EJG5MN', 'timeZone': 'Asia/Shanghai', 'uniqueDeviceID': '10da21b9091f799891557004e4105ebab3416cb9', 'marketName': 'iPhone 6'}>>> TIDevice.start_app(udid, "com.apple.mobilesafari")>>> TIDevice.stop_app(udid, "com.apple.mobilesafari")>>> print(TIDevice.ps(udid))
[ {'pid': 215, 'name': 'MobileMail', 'bundle_id': 'com.apple.mobilemail', 'display_name': 'MobileMail'}]>>> print(TIDevice.ps_wda(udid))
['com.test.WebDriverAgentRunner.xctrunner']
另外,TIDevice.xctest
接口的执行示例如下:
import threading
wda_bundle_id = TIDevice.list_wda(udid)[0]
# 创建一个线程,执行xctest
t = threading.Thread(target=TIDevice.xctest, args=(udid, wda_bundle_id), daemon=True)
t.start()
time.sleep(5)
ps_wda = TIDevice.ps_wda(udid)
print(ps_wda)
time.sleep(5)
# 终止线程
t.join(timeout=3)
4. 新增错误类型NoDeviceError
如果当前未连接任何设备,但是又调用了某些需要连接设备才可以调用的接口时,抛出异常 NoDeviceError("No devices added.")
:
5. using接口的改动
using
接口的作用是,支持在脚本中引用另外一个脚本,同时还能够让Airtest正确地读取到其他脚本中的图片路径。
假设目录结构如下:
demo/foo/bar.airbaz.airmain.py
如果我们希望在 main.py
中引用 foo/bar.air
和 baz.air
,可以将项目根路径设置到 ST.PROJECT_ROOT
,或者确保项目根路径是当前工作目录:
# main.py
from airtest.core.api import *
ST.PROJECT_ROOT = r"D:\demo" # This line can be ignored if it is the current working directory
using("foo/bar.air")
using("baz.air")
如果我们希望在 foo/bar.air
中引用 baz.air
,可以这样写:
# foo/bar.air
from airtest.core.api import *
using("../baz.air")
6. 其它优化与改动
- 当Airtest脚本引发了
assert
异常时,退出码为20
,以便和其他报错区分 - 更新了
Yosemite.apk
,修复了一些稳定性问题 - windows平台新增接口
set_focus
,与原先的set_foreground
功能相同
7. 如何更新
因本次更新仅更新了Airtest库,所以同学们目前只能在自己本地python环境中,将Airtest更新到最新版本:
pip install -U airtest
对于使用AirtestIDE的同学,可以等我们发布1.2.16版本的IDE,或者在旧版本AirtestIDE中设置使用本地python环境,然后将本地python环境的Airtest库升级到最新版本即可。
8. 更新常见问题
如同学们在使用新版的Airtest时遇到了一些问题无法解决,特别是iOS新增接口相关的问题,可以通过此网站向我们的开发者快速提单:https://airtest.netease.com/issue_create 。
可以在标题中加入“Airtest1.3.0.1”之类的字眼,方便我们快速筛选和排查。
相关文章:

【更新公告】Airtest更新至1.3.0.1版本
1. 前言 本次更新为Airtest库更新,版本提升至1.3.0.1版本,主要新增了一些iOS设备相关的装包等接口,以及封装了一些tidevice常用接口。更多更新详情,详见我们下文的描述。 2. 新增iOS设备接口 1)iOS安装接口…...
SQL语句集锦
题记:SQL语句就是一种编程语言,我们平时项目中我们需要从数据库种调取数据,然后通过增删改查的接口对数据库进行操作,当然我们也可以用数据库自己的编程语言进行数据库里边数据的操作。 1.select * from users; 从use…...

【多线程中的线程安全问题】线程互斥
1 🍑线程间的互斥相关背景概念🍑 先来看看一些基本概念: 1️⃣临界资源:多线程执行流共享的资源就叫做临界资源。2️⃣临界区:每个线程内部,访问临界资源的代码,就叫做临界区。3️⃣互斥&…...

抖音seo短视频矩阵系统源代码开发技术分享
抖音SEO短视频矩阵系统是一种通过优化技术,提高在抖音平台上视频的排名和曝光率的系统。以下是开发该系统的技术分享: 熟悉抖音平台的算法 抖音平台的算法是通过分析用户的兴趣爱好和行为习惯,对视频进行排序和推荐。因此,开发人员…...
flutter实战(01)windows桌面版 修改应用logo、名称、显示位置、显示大小
说明:该系列文章主要为flutter在windows桌面平台实战中遇到的一些坑。 1 修改logo 只需要在flutter项目/windows/runner/resources目录下替换原来的应用图标 app_icon.ico即可。 2 修改应用名称、显示位置、显示大小 修改flutter项目/windows/runner/main.cpp 文…...

校园基础设施资源管理
背景 自2017年起,为响应两会提出的“数实融合”“数字经济”“数字中国”的中国经济发展新动向,满足“中国教育现代化2030”战略部署,进一步推动“教育信息化十三五规划”的落实。这五年时间,各大高校致力于深化信息技术与教育教…...

Github git clone 和 git push 特别慢的解决办法
1.在本地上使用 SSH 命令无法git push 上传 github 项目 2.使用 git clone 下载项目特别慢总是加载不了 解决办法1 将 *** 的连接模式换成:D-i-r-e-c-t(好像不太有用) 后面再找找能不能再G-l-o-b-a-l 下解决该问题 解决办法 2 mac下直接设…...

【计网】TCP在可靠传输中都干了啥
文章目录 1、概述2、校验和3、序列号和确认应答机制4、重传机制4.1、介绍4.2、超时重传4.3、快速重传 5、滑动窗口协议5.1、介绍5.2、发送方的滑动窗口5.3、接收方的滑动窗口 6、流量控制7、拥塞控制7.1、介绍7.2、慢开始7.3、拥塞避免7.4、快重传和快恢复 1、概述 TCP 是面向…...

windows下载安装FFmpeg
FFmpeg是一款强大的音视频处理软件,下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本࿰…...

SwipeDelMenuLayout失效:Could not find SwipeDelMenuLayout-V1.3.0.jar
一、问题描述 最近在工作上的项目中接触到SwipeDelMenuLayout这个第三方Android开发库,然后我就根据网上的教程进行配置。这里先说一下我的开发环境:Android Studio版本是android-studio-2020.3.1.24-windows,gradle版本是7.0.2。 首先是在se…...

C++ 类和对象篇(零) 面向过程 和 面向对象
目录 一、面向过程 二、面向对象 三、两种编程思想的比较 四、C和C 一、面向过程 1.是什么? 是一种以解决问题的过程为中心的编程思想。即先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。 2.为什么? 面向过程就纯粹是分析…...
列表list
列表 列表是将数据组织在一个一维集合中,从这个组织方式来看,它与c()函数是相似的。但是,列表并不是将具体的值组织起来,而是组织R对象,如列表、数据框、矩阵、函数、向量等等。 列表非常好用,因为列表可…...
gcc编译出现bar causes a section type conflict with foo问题解决
这里bar是变量名,foo是函数名。 如下是charGPT给出的答复,结论是:bar和foo放在同一个section内,但是它们的类型不同,函数应该放置在一个可执行(executable)类型的section,而变量应该…...

12. Mybatis 多表查询 动态 SQL
目录 1. 数据库字段和 Java 对象不一致 2. 多表查询 3. 动态 SQL 使用 4. if 标签 5. trim 标签 6. where 标签 7. set 标签 8. foreach 标签 9. 通过注解实现 9.1 查找所有数据 9.2 通过 id 查找 1. 数据库字段和 Java 对象不一致 我们先来看一下数据库中的数…...

操作系统专栏1-内存管理from 小林coding
操作系统专栏1-内存管理 虚拟地址内存管理方案分段分页页表单级页表多级页表TLB 段页式内存管理Linux内存管理 malloc工作方式操作系统内存回收回收的内存种类 预读失败和缓存污染问题预读机制预读机制失效解决方案缓存污染 内核对虚拟内存的表示内核对内核空间的表示直接映射区…...
SpringCloud远程服务调用
下面介绍在SpringCloud中如何使用openfeign实现远程服务调用 1.在字典服务中有这么2个接口 Api(tags "数据字典接口") RestController RequestMapping("/admin/cmn/dict/") CrossOrigin public class DictController {Autowiredprivate DictService dic…...

Arcgis通过模型构建器计算几何坐标
模型 模型中,先添加字段,再计算字段 计算字段 模型的计算字段中,表达式是类似这样写的,其中Xmin表示X坐标,Ymin表示Y坐标 !Shape.extent.Xmin!...
java设计模式-工厂模式(下)
接java设计模式-工厂模式(上) 抽象工厂模式 针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机&a…...

深蓝学院C++基础与深度解析笔记 第13章 模板
1. 函数模板 ● 使用 template 关键字引入模板: template<typename T> //声明:T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…...

装饰器模式——扩展系统功能
1、简介 1.1、概述 对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装…...

软件工程:如何做好软件产品
1、什么是产品 从项目到产品 产品:满足行业共性需求的标准产品。即要能够做到配置化的开发,用同一款产品最大限度地满足不同客户的需求,同时让产品具有可以快速响应客户需求变化的能力。 好的产品一定吸收了多个项目的共性,一定是…...
VBA清空数据
列数转字母 Function CNtoW(ByVal num As Long) As String CNtoW Replace(Cells(1, num).Address(False, False), "1", "") End Function 字母转列数 Function CWtoN(ByVal AB As String) As Long CWtoN Range("a1:" & AB & &…...

[蓝桥杯]兰顿蚂蚁
兰顿蚂蚁 题目描述 兰顿蚂蚁,是于 1986 年,由克里斯兰顿提出来的,属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为:上下左右其中一方。 蚂蚁的移…...
C++.OpenGL (7/64)摄像机(Camera)
摄像机(Camera) 摄像机系统核心组件 #mermaid-svg-lmysTXAyyzKytiOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lmysTXAyyzKytiOC .error-icon{fill:#552222;}#mermaid-svg-lmysTXAyyzKytiOC .error-text{fi…...

STL解析——list的使用
目录 1.简介 2.构造函数 3.迭代器 3.1封装 3.2迭代器分类 4.排序性能 4.1链式与数组 4.2缓存读取 1.简介 STL容器中提供的list容器也是一种顺序容器,底层实现方式是带头双向链表,这种实现方式能比单链表更高效的访问数据。 下面围绕部分重要接口…...

量子比特实现方式
经典计算机是通过电子电路运转起来的。使用硅制半导体制成的名为晶体管的小元件发挥了开关的作用,将其与金属布线组合起来即可实现逻辑门,再将逻辑门集成起来就能制造出经典计算机。量子计算机的制造过程则要复杂许多,因为量子计算机既需要量…...
Lua和JS的垃圾回收机制
Lua 和 JavaScript 都采用了 自动垃圾回收机制(GC) 来管理内存,开发者无需手动释放内存,但它们的 实现机制和行为策略不同。下面我们从原理、策略、优缺点等方面来详细对比: 🔶 1. 基本原理对比 特性LuaJa…...

Visual Studio问题记录
程序"xxx dotnet.exe"已退出,返回值为-2147450730 问deepseek:visual studio输出程序dotnet.exe已退出,返回值为-2147450730 dotnet.exe 编译时退出并返回错误代码 **-2147450730**(十六进制 0x80008076)&…...
gvim比较两个文件不同并合并差异
使用 gvim 比较两个文件的不同: 方式一,使用 gvim 同时打开两个待比较的文件。 比较通用方式是采用 gvim -d 选项,具体命令,如下: gvim -d <file1> <file2>方式二,先用 gvim 打开一个文件&am…...
App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
引入webview的页面添加safeAreaInsets,对weview的webviewStyles做处理 在myApp中改造 entry.vue代码如下 template><view class"entry-page" :style"{ paddingTop: safeAreaInsets.top px }"><web-view :webview-styles"we…...