AirtestIDE用法
包括airtest和poco
1. airtest
安装python3.7.9 64
python3 -m pip install -U airtest
或者:
git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest
无界面的airtest用法:
打开手机中的 开发者选项 , 以及 允许USB调试
adb devices
命令看到设备
在代码和命令行中,使用手机序列号连接手机
执行测试:
D:\Python37\python.exe -m airtest run "D:\ljx\light_lmt\autoTest\autoRun.py.air" --device "android://127.0.0.1:5037/320716742833?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH" --log "D:\ljx\light_lmt\autoTest\log"
生成报告:
D:\Python37\python.exe "D:\ljx\light_lmt\AirtestIDE-win-1.2.17\AirtestIDE\sample\report_launcher.py" "D:\ljx\light_lmt\autoTest\autoRun.py.air" --log_root "D:\ljx\light_lmt\autoTest\log" --outfile "D:\ljx\light_lmt\autoTest\log\log.html" --static_root "D:\ljx\light_lmt\AirtestIDE-win-1.2.17\AirtestIDE\airtest\report" --lang zh --plugin "poco.utils.airtest.report"
在代码中使用手机:
python -m airtest run untitled.air --device Android:///手机序列号 --log log/ Android://<adbhost>:<adbport>/<serialno>
-
adbhost
是adb server所在主机的ip,默认是本机,也就是localhost
或127.0.0.1
-
adb port
默认是5037 -
serialno
是android手机的序列号,例如刚才的c2b1c2a7
# 什么都不填写,会默认取当前连接中的第一台手机 Android:/// # 连接本机默认端口连的一台设备号为c2b1c2a7的手机 Android://127.0.0.1:5037/c2b1c2a7 # 用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno Android://127.0.0.1:5037/10.254.60.1:5555
当我们使用命令行运行脚本时,可以使用--device Android:///
来为它指定脚本运行的Android设备
airtest run untitled.air --device Android:///手机序列号 --log log/
Android手机支持在运行脚本过程中对屏幕进行录制,在运行脚本的命令行中加入--recording
参数即可:
airtest run "Airtest_example.air" --device android:/// --log logs/ --recording
运行完毕后,可以在指定的log目录中找到录制完毕的mp4文件。
当我们想在代码里连接手机时,可以使用connect_device
接口
from airtest.core.api import * connect_device("Android:///手机序列号")
可以额外添加cap_method=JAVACAP
的参数来强制指定屏幕截图方式为JAVACAP
# 连接了模拟器,勾选了`Use javacap`模式 Android://127.0.0.1:5037/127.0.0.1:7555?cap_method=JAVACAP
无法连接可以尝试参数:
我们还有另外两个参数,分别是用于指定设备画面旋转模式的ori_method=ADBORI
,以及指定点击画面方式为ADB指令点击的touch_method=ADBTOUCH
# 所有的选项都勾选上之后连接的设备,用&&来连接多个参数字符串
# --device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI 在windows下不可用 --device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP^&^&ori_method=ADBORI # windows命令行添加^转义后效果 --device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP\&\&ori_method=ADBORI # mac命令行添加\转义
Android接口调用
所有在airtest.core.api
中定义的接口,都可以在Android平台上使用,直接在脚本中调用即可:
from airtest.core.api import * touch((100, 200)) # 启动某个应用 start_app("org.cocos2d.blackjack") # 传入某个按键响应 keyevent("BACK")
可以查阅airtest.core.api文档获得API列表。
除了在airtest.core.api中提供的跨平台接口之外,Android设备对象还有很多内置的接口可以调用,我们可以在airtest.core.android.android module这个文档中查阅到Android设备对象拥有的方法,然后像这样调用:
dev = device() # 获取到当前设备的Android对象 print(dev.get_display_info()) # 查看当前设备的显示信息 print(dev.list_app()) # 打印出当前安装的app列表
ADB指令调用
利用Android设备接口,我们可以这样调用adb指令:
# 对当前设备执行指令 adb shell ls print(shell("ls"))# 对特定设备执行adb指令 dev = connect_device("Android:///device1") dev.shell("ls")# 切换到某台设备,执行adb指令 set_current(0) shell("ls")
Airtest之python本地环境安装、独立IDE运行
下载AirtestIDE
安装与启动 - Airtest Project Docs
Airtest Project
2.2 Android连接常见问题 - Airtest Project Docs
Airtest自动化测试——Airtest进阶和图像识别算法(上)_截图_的图片_按钮
用airTestIDE 自带的adb配置到环境变量
D:\ljx\light_lmt\AirtestIDE-win-1.2.17\AirtestIDE\airtest\core\android\static\adb\windows
python可以配置成自己安装的3.7
1.2.1 脚本代码修改属性
假如直接使用文本编辑器打开我们所编辑的Airtest脚本目录里的同名py文件,可以看到,每张图片都由类似这样的语句组成:
Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264))
直接在里面加入需要修改的值即可
Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6, target_pos=5, rgb=False)
图像识别阈值threshold(浮点类型):
threshold是用来判定一张图片识别是否成功的阈值,例如一张图片识别到的匹配度是0.65,
而我们设置的threshold为0.7的话,Airtest会认为匹配失败,从而进行下一次匹配。
通常来说,threshold设置得越高,图像识别的精度越高,但成功率也会有所降低,请根据自己的实际情况酌情设置。
取值范围为0~1之间,[0, 1],默认值是0.7。
图像点击位置target_pos(整型):
当识别出一张图像后,Airtest将会默认去点击图像的正中心位置,
有时我们希望它识别出图片后点击其他位置,可以通过修改target_pos属性来实现
在上图中,我们希望点击中间选项的“升级”按钮,不希望点到别的选项去,而只截出升级按钮不能满足我们的需求。
此时我们可以考虑将截图范围扩大到红色虚线框选的区域,截图后将这张方形图片视为一个九宫格,
方框上的每一个暗色红点都代表一个数字,将希望被点击的位置设置为target_pos的值即可。
在这个例子中,我们可以让截图区域的底部正好放在“升级”按钮上,然后设置target_pos=8即可正好点击到该按钮。
target_pos取值范围是1~9,[1, 9],且必须为整数,默认值是5(图像正中心)
切换彩色与灰度识别rgb(布尔值):
在识别图像时,Airtest会先将图像转为灰度图再进行识别。
因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。
通过勾选rgb选项,或在代码中加入rgb=True,可以强制指定使用彩色图像进行识别
1.4 输入文字
在脚本中,如果想要实现文字输入,一般需要这样的流程:
1. 点一下你需要输入的位置,激活输入光标
2. 调用airtest的 text() 接口来输入内容
如图,在这个脚本里 先点击了需要输入的位置 ,然后调用了text接口进行输入,在运行时手机将会自动被安装一个名为 yosemite.apk 的应用,然后启用 yosemite输入法来进行输入。
而且需要注意的是,在使用过text接口后,手机输入法会被切换为yosemite输入法,因此看不到正常键盘了(无需惊慌)。如果需要手工输入,可以在系统的输入法设置中,把输入法切换回系统输入法即可恢复。同时我们也提供了 安卓手机助手功能 ,在手机助手中可以简单地点击鼠标来切换输入法。
3、坐标介绍
Airtest框架-绝对坐标
Airtest是基于图片识别的框架,讲究所见即所得,所以其坐标都是使用的屏幕绝对坐标,如:touch([500,500])、swipe([100,100],[500,500]) 假如手机屏幕就是1000*1000,[500,500]就是屏幕的中心点,这就是屏幕的绝对坐标;
poco框架-相对坐标
假如图中左右是两个手机屏幕,一个是100*100,一个是200*200。小手机左上有个按钮,其中心点绝对坐标是[25,25],那么这个点相对于整个屏幕百分比大小就是[25/100,25/100]=[0.25,0.25];同理,大手机左上按钮的中心点绝对坐标是[50,50],那么这个点相对于整个屏幕百分比大小就是[50/200,50/200]=[0.25,0.25];
所以同一APP运行在这2个手机上,我们想利用坐标点击左上的按钮,如果用Airtest框架就要分别写成:touch([25,25]) 和 touch([50,50])而如果是用Poco框架,则只要写成poco.click([0.25,0.25])即可通用;