2024.2.25更新:新增剪切板、Airtest1.3.3touch/swipe支持绝对坐标和相对坐标
2023.9.3更新:Airtest1.2.7新增14个断言、断开连接API;Airtest1.2.10.2新增录屏API;
以下基于airtest1.2.0(截止2021.7.12,最新版本)
https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html
修改自以上链接,并更新适配到airtest1.2.0版本,翻译了部分英文说明想熟练使用Airtest,以下API必须熟记
1.init_device(platform='Android', uuid=None, **kwargs)
初始化设备,并设置为当前设备。
参数:
platform – Android, IOS or Windows
uuid – 目标设备的uuid,例如Android的序列号,Windows的窗口句柄,或iOS的uuid
kwargs – 可选的平台相关的参数,例如Android下的 cap_method=JAVACAP
参数
返回:
device对象
示例:
-
init_device(platform="Android",uuid="songzhenhua", cap_method="JAVACAP")
-
init_device(platform="Windows",uuid="123456")
2.connect_device(uri)
用URI字符串来初始化设备,并且设置为当前设备。
参数:
uri – 一个用于初始化设备的URI字符串,例如:
android://adbhost:adbport/serialno?param=value¶m2=value2
返回:
device对象
示例:
-
# 本地安卓设备默认参数
-
connect_device("Android:///")
-
# 本地安卓设备ID为:SJE5T17B17,且使用参数
-
connect_device("Android:///SJE5T17B17?cap_method=javacap&touch_method=adb")
-
# 远程安卓设备 Android://adbhost:adbport/serialno
-
connect_device("Android://127.0.0.1:5037/10.254.60.1:5555")
-
# connect to the desktop
-
connect_device("Windows:///")
-
# Connect to the window with handle 123456
-
connect_device("Windows:///123456")
-
# iOS device
-
connect_device("iOS:///127.0.0.1:8100")
-
connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&udid=00008020-001270842E88002E") # iOS with mjpeg port and udid
3.device()
返回当前正在使用中的设备。
返回:
当前设备实例
示例:
-
dev = device()
-
dev.touch((100, 100))
4.set_current(idx)
设置当前设备。
参数:
idx – uuid或已初始化的设备列表中的编号,从0开始
引发:
IndexError – 当查找不到设备时
返回:
None
支持平台:
Android, iOS, Windows
示例:
-
# 设置设备列表中的第1台设备为当前设备
-
set_current(0)
-
# 设置序列号为qasite的设备为当前设备
-
set_current("qasite")
5.auto_setup(basedir=None, devices=None, logdir=None, project_root=None, compress=None)
自动配置运行环境,如果当前没有连接设备的话,就默认尝试连接Android设备。
参数:
basedir – 设置当前脚本的所在路径,也可以直接传 __file__ 变量进来
devices – 一个内容为 connect_device uri 字符串的列表
logdir – 用于报告的日志目录,默认为None不输出日志, 设置为True时日志目录为/log
project_root – 用于设置PROJECT_ROOT变量,方便 using 接口的调用
compress – 屏幕截图的压缩比率,在[1, 99]范围内的整数,默认是10
示例:
-
auto_setup(__file__)
-
auto_setup(__file__, devices=["Android://127.0.0.1:5037/SJE5T17B17"],
-
logdir=True, project_root=r"D:\test\logs", compress=90)
6.shell(cmd)
在目标设备上运行远程shell指令
参数:
cmd – 需要在设备上运行的指令,例如 ls /data/local/tmp
返回:
shell指令的输出内容
支持平台:
Android
示例:
-
# 在当前默认手机执行adb shell ls
-
print(shell("ls"))
-
# 在指定手机执行adb shell ls
-
dev = connect_device("Android:///device1")
-
dev.shell("ls")
-
# 设置手机列表中的第1台手机为当前手机,并执行adb shell ls
-
set_current(0)
-
shell("ls")
7.start_app(package, activity=None)
在设备上启动目标应用
参数:
package – 想要启动的应用包名package name,例如 com.netease.my
activity – 需要启动的activity,默认为None,意为main activity
返回:
None
支持平台:
Android, iOS
示例:
-
start_app("com.netease.cloudmusic")
-
start_app("com.apple.mobilesafari") # on iOS
8.stop_app(package)
终止目标应用在设备上的运行
参数:
package – 需要终止运行的应用包名 package name,例如 com.netease.my
返回:
None
支持平台:
Android, iOS
示例:
-
stop_app("com.netease.cloudmusic")
9.clear_app(package)
清理设备上的目标应用数据
参数:
package – 包名 package name,例如 com.netease.my
返回:
None
支持平台:
Android
示例:
-
clear_app("com.netease.cloudmusic")
10.install(filepath, **kwargs)
安装应用到设备上
参数:
filepath – 需要被安装的应用路径(PC上的路径)
kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档
返回:
None
支持平台:
Android, iOS
示例:
-
install(r"D:\demo\qasite.apk")
-
# adb install -r -t D:\demo\test.apk
-
install(r"D:\demo\qasite.apk", install_options=["-r", "-t"])
-
# iOS支持ipa包安装
-
install(r"D:\demo\qasite.ipa")
-
# iOS也支持通过下载链接安装APP
-
install("http://www.example.com/test.ipa")
11.uninstall(package)
卸载设备上的应用
参数:
package – 需要被卸载的包名
返回:
None
支持平台:
Android, iOS
示例:
-
uninstall("com.netease.cloudmusic")
12.snapshot(filename=None, msg="", quality=None, max_size=None)
对目标设备进行一次截图,并且保存到文件中。
参数:
filename – 保存截图的文件名,默认保存路径为 ST.LOG_DIR
中
msg – 截图文件的简短描述,将会被显示在报告页面中
quality – 图片的质量,[1,99]的整数,默认是10
max_size – 图片的最大尺寸,例如 1200
返回:
截图文件的绝对路径
支持平台:
Android, iOS, Windows
示例:
-
snapshot(msg="index")
-
# 设置保存文件名
-
snapshot(filename="测试工程师小站.png", msg="test")
-
#可以设置截图的画质和大小
-
ST.SNAPSHOT_QUALITY = 30 # 设置截图质量为30
-
ST.IMAGE_MAXSIZE = 600 # 设置最大尺寸不超过600*600
-
# 此截图质量30,最大不超过600*600
-
snapshot()
-
# 设置了全局参数,又额外设置单语句参数时,单语句优先,此截图质量90
-
snapshot(filename="测试工程师小站.png", msg="test", quality=90)
-
# 设置了全局参数,又额外设置单语句参数时,单语句优先,此截图最大不超1200*1200
-
snapshot(filename="qasite.png", msg="test", quality=90, max_size=1200)
13.wake()
唤醒并解锁目标设备,在部分品牌手机上可能无法生效
返回:
None
支持平台:
Android
示例:
wake()
14.home()
返回HOME界面。
返回:
None
支持平台:
Android, iOS
示例:
home()
15.touch(v, times=1, **kwargs)
在当前设备画面上进行一次点击
参数:
v – 点击位置,可以是一个 Template 图片实例,或是一个坐标(x,y)(相对坐标、绝对坐标均可)
times – 点击次数
kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档
返回:
实际点击位置坐标 (x, y)
支持平台:
Android, Windows, iOS
示例:
-
# 点击绝对坐标:
-
touch((100, 100))
-
# 点击相对坐标:
-
touch((0.1, 0.1))
-
# 点击图片的中心位置:
-
touch(Template(r"测试工程师小站.png", target_pos=5))
-
# 点击两次:
-
touch((100, 100), times=2)
-
# 在Android和Windows下,可以设置点击持续时间:
-
touch((100, 100), duration=2)
-
# 右键点击(Windows):
-
touch((100, 100), right_click=True)
16.click(*args, **kwargs)
touch()的别名,一样
17.double_click(v)
双击
参数:
v – 点击位置,可以是一个 Template 图片实例,或是一个绝对坐标 (x, y)
返回:
实际点击位置坐标 (x, y)
示例:
-
double_click((100, 100))
-
double_click(Template(r"测试工程师小站.png"))
18.swipe(v1, v2=None, vector=None, **kwargs)
在当前设备画面上进行一次滑动操作。
有两种传入参数的方式
-
swipe(v1, v2=Template(...)) # 从 v1 滑动到 v2
-
swipe(v1, vector=(x, y)) # 从 v1 开始滑动,沿着vector方向。
参数:
v1 – 滑动的起点,可以是一个Template图片实例,或是坐标 (x, y)(相对坐标、绝对坐标均可)
v2 – 滑动的终点,可以是一个Template图片实例,或是坐标 (x, y)(相对坐标、绝对坐标均可)
vector – 滑动动作的矢量坐标,可以是绝对坐标 (x,y) 或是屏幕百分比,例如 (0.5, 0.5)
**kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档
引发:
Exception – 当没有足够的参数来执行滑动时引发异常
返回:
原点位置和目标位置
支持平台:
Android, Windows, iOS
示例:
-
swipe(Template(r"测试工程师小站.png"), vector=[-0.0316, -0.3311])
-
swipe((100, 100), (200, 200))
-
#自定义滑动持续时间1s和经过6步到达终点:
-
swipe((100, 100), (200, 200), duration=1, steps=6)
19.pinch(in_or_out='in', center=None, percent=0.5)
在设备屏幕上执行一个双指pinch捏合操作
参数:
in_or_out – 向内捏合或向外扩大,在[“in”, “out”] 中枚举一个值
center – pinch动作的中心位置,默认值为None则为屏幕中心点
percent – pinch动作的屏幕百分比,默认值为0.5
返回:
None
支持平台:
Android
示例:
-
# 两指向屏幕中心点捏合:
-
pinch()
-
# 将(100, 100)作为中心点,向外扩张两指:
-
pinch('out', center=(100, 100))
20.keyevent(keyname, **kwargs)
在设备上执行keyevent按键事件
参数:
keyname – 平台相关的按键名称
**kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档
返回:
None
支持平台:
Android, Windows, iOS
示例:
-
# 在Android上相当于执行了 adb shell input keyevent KEYNAME
-
# 内部调用的android.adb.keyevent()
-
# Android Keyevent详细文档:
-
# https://developer.android.com/reference/android/view/KeyEvent#constants_1
-
keyevent("HOME")
-
keyevent("3") # same as keyevent("HOME")
-
keyevent("BACK")
-
keyevent("KEYCODE_DEL")
-
# 在Windows上内部调用的pywinauto.keyboard 进行按键点击
-
# Windows Keyevent详细文档:
-
# https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html
-
keyevent("{DEL}")
-
keyevent("%{F4}") # close an active window with Alt+F4
-
# iOS只支持 home/volumeUp/volumeDown:
-
keyevent("HOME")
-
keyevent("volumeUp")
21.text(text, enter=True, **kwargs)
在目标设备上输入文本,文本框需要处于激活状态。
参数:
text – 要输入的文本
enter – 是否在输入完毕后,执行一次 Enter ,默认是True
返回:
None
支持平台:
Android, Windows, iOS
示例:
-
text("公众号:测试工程师小站") # 输入完毕后点回车
-
text("公众号:测试工程师小站", enter=False)
-
# 在Android上,有时你需要在输入完毕后点击搜索按钮:
-
text("公众号:测试工程师小站", search=True)
-
# 如果希望输入其他按键,可以用这个接口, code详情:
-
# https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#constants_1
-
text("公众号:测试工程师小站")
-
device().yosemite_ime.code("3") # 3 = IME_ACTION_SEARCH
22.sleep(secs=1.0)
设置一个等待sleep时间,它将会被显示在报告中
参数:
secs – sleep的时长
返回:
None
支持平台:
Android, Windows, iOS
示例:
sleep(1)
23.wait(v, timeout=None, interval=0.5, intervalfunc=None)
等待当前画面上出现某个匹配的Template图片
参数:
v – 要等待出现的目标Template实例
timeout – 等待匹配的最大超时时长,默认为None即默认取 ST.FIND_TIMEOUT 的值
interval – 尝试查找匹配项的时间间隔(以秒为单位)
intervalfunc – 在首次尝试查找匹配失败后的回调函数
引发:
TargetNotFoundError – 在超时后仍未找到目标则触发
返回:
匹配目标的坐标
支持平台:
Android, Windows, iOS
示例:
-
wait(Template(r"测试工程师小站.png")) # timeout after ST.FIND_TIMEOUT
-
# 每3秒查找一次, 120秒超时
-
wait(Template(r"测试工程师小站.png"), timeout=120, interval=3)
-
# 你可以在每次查找目标失败时,指定一个回调函数:
-
def notfound():
-
print("No target found")
-
wait(Template(r"测试工程师小站.png"), intervalfunc=notfound)
24.exists(v)
检查设备上是否存在给定目标
参数:
v – 要检查的目标
返回:
如果未找到目标,则返回False,否则返回目标的坐标
支持平台:
Android, Windows, iOS
示例:
-
if exists(Template(r"测试工程师小站.png")):
-
touch(Template(r"测试工程师小站.png"))
-
# 因为 exists() 会返回坐标,我们可以直接点击坐标来减少一次图像查找
-
pos = exists(Template(r"测试工程师小站.png"))
-
if pos:
-
touch(pos)
25.find_all(v)
在设备屏幕上查找所有出现的目标并返回其坐标列表
参数:
v – 寻找目标
返回:
结果列表
[{‘result’: (x, y), ‘rectangle’: ( (left_top, left_bottom, right_bottom, right_top) ), ‘confidence’: 0.9}, …]
支持平台:
Android, Windows, iOS
示例:
-
find_all(Template(r"测试工程师小站.png"))
-
[{'result': (218, 468), 'rectangle': ((149, 440), (149, 496), (288, 496), (288, 440)),'confidence': 0.9999996423721313}]
26.assert_exists(v, msg="")
设备屏幕上存在断言目标
参数:
v – 要检查的目标
msg – 断言的简短描述,它将被记录在报告中
引发:
AssertionError – 如果断言失败
返回:
目标坐标
支持平台:
Android, Windows, iOS
示例:
assert_exists(Template(r"测试工程师小站.png"), "assert exists")
27.assert_not_exists(v, msg="")
设备屏幕上不存在断言目标
参数:
v – 要检查的目标
msg – 断言的简短描述,它将被记录在报告中
引发:
AssertionError – 如果断言失败
返回:
None.
支持平台:
Android, Windows, iOS
示例:
assert_not_exists(Template(r"测试工程师小站.png"), "assert not exists")
28.assert_equal(first, second, msg="")
断言两个值相等
参数:
first – 第一个值
second – 第二个值
msg – 断言的简短描述,它将被记录在报告中
引发:
AssertionError – 如果断言失败
返回:
None
支持平台:
Android, Windows, iOS
示例:
assert_equal(1, 1, msg="assert 1==1")
29.assert_not_equal(first, second, msg="")
断言两个值不相等
参数:
first – 第一个值
second – 第二个值
msg – 断言的简短描述,它将被记录在报告中
引发:
AssertionError – 如果断言异常
返回:
None
支持平台:
Android, Windows, iOS
示例:
assert_not_equal(1, 2, msg="assert 1!=2")
30.Airtest1.2.7新增14个断言
都是基于assert衍生出来的,这里就不过多介绍了,详细可看
Airtest1.2.7新增的14个断言API解析
-
assert_true
-
assert_false
-
assert_is
-
assert_is_not
-
assert_is_none
-
assert_is_not_none
-
assert_in
-
assert_not_in
-
assert_is_instance
-
assert_not_is_instance
-
assert_greater
-
assert_greater_equal
-
assert_less
-
assert_less_equal
31.start_recording()
开始录屏
参数
由于Android和iOS参数有细微差别,就不再列出,详细用法可看:
Airtest1.2.10.2版本Android录屏功能
Airtest新增iOS、Windows录屏功能,真香!
示例
-
dev = device()
-
save_path = dev.start_recording(output="test.mp4")
-
sleep(30)
-
dev.stop_recording()
32.stop_recording()
结束录屏
33.disconnect()
airtest1.2.7新增接口,主要是解决脚本长时间运行,反复切换横屏和竖屏应用时,会有概率 出现屏幕有一半内容变成黑屏 的问题。
使用方法为在脚本最后添加device().disconnect(),让设备创建出的所有adb连接都强制释放掉。
最好是用在try…except…finally,写在finally里面,这样即使失败也会清理
34.set_clipboard(content)
设置剪切板内容
参数:
content– 要设置的内容
支持平台:
Android, Windows, iOS
35.get_clipboard()
获取剪切板内容
返回:
剪切板内容
支持平台:
Android, Windows, iOS
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
-
文档获取方式:
-
加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)
这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取