Airtest--自动化测试的新篇章
官网:Airtest Project (netease.com)
教程:5分钟上手自动化测试——Airtest+Poco快速上手 - Airtest Project Docs (netease.com) 文档:airtest.core.api module — airtest 文档
Airtest是一套跨平台的测试框架,它提供了跨平台的API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位UI元素,你无需嵌入任何代码即可进行自动化测。测试脚本运行后可以自动生成详细的HTML测试报告,让你迅速定位失败的测试点,适用于游戏和App,支持平台有Windows、Android和iOS。
Airtest 集成的多个测试框架,基于web自动化测试的selenuim框架,基于Chrome Devtools Protocol协议,自动录制生成selenium脚本,精确定位与操作界面元素,支持多浏览器(Chrome、Safari、Firfox等主流浏览器);Poco基于UI控件识别的自动化框架,目前支持Unity3D/cocos2dx-/Android原生app/iOS原生app/微信小程序,也可以在其他引擎中自行接入poco-sdk来使用。
AirtestIDE 是一个强大的GUI工具,是网易配套推出的跨平台UI自动化测试编辑器,它内置了Airtest和Poco的相关插件功能,可以帮助你快速简单地完成录制/编写测试脚本。
安装
进入官网安装Airtest IDE即可。
python需要使用pip安装,命令为:
pip install airtest
第一个airtest程序
AirtestIDE中新建脚本,后缀都为 .air
,但实际上我们在运行的时候, 运行的是.air目录下的同名.py文件 。因此,就像一个普通的python脚本那样,当我们需要使用airtest的接口时(例如touch指令),我们需要在.py脚本的最前面import airtest的api。我们可以在AirtestIDE里新建一个脚本,就能看到默认的初始化代码:
# -*- encoding=utf8 -*-
__author__ = "user"
from airtest.core.api import *
# 从api中import接口后,就能直接使用airtest的各个接口了
auto_setup(__file__) # 自动初始化设备
在Airtest中,需要编写大量的截图语句,像这样:
touch(Template("image_of_a_button.png"))
其中的 Template("xx.png")
即为一个图片对象,如果要手工进行截图和代码编写,工作量会比较大,因此这里推荐大家使用专用的 AirtestIDE 进行截图语句的开发,会使脚本的编写事半功倍。
在 官网 下载AirtestIDE,解压后即可使用,里面附带的Airtest辅助窗对于编写Airtest的脚本语句来说十分便捷:
鼠标放在Airtest辅助窗的按钮上能看到相关接口参数信息,直接点击按钮就能生成对应的语句,或是可以直接在当前连接的设备画面上进行截图,截取完成后将会在脚本窗口生成带截图的语句。
以下贴上官方的DEMO:
from airtest.core.api import *
# 通过ADB连接本地Android设备
connect_device("Android:///")
#安装待测软件apk,路径信息。
install("path/to/your/apk")
#开始运行app
start_app("com.pingan.certicationApp")
#点击某个图片,Airtest中基于图像识别语法,图片自己提供。
touch(Template("image_of_a_button.png"))
#滑动语音,开头图片跟结尾图片
swipe(Template("slide_start.png"), Template("slide_end.png"))
#添加断言的图片
assert_exists(Template("success.png"))
#点击Android上的返回键
#keyevent("BACK")
#点击Android上的Home键返回
#home()
#uninstall("package_name_of_your_apk")
API(Android端)
运行应用
虽然打开app时可以使用Airtest截图打开,但是请注意:打开应用尽量使用start_app而不是截图脚本相对用截图脚本来启动应用,脚本会更加简洁,兼容性也会更好。
# 打开网易云音乐
start_app("com.netease.cloudmusic")
查看打开的app的包名有3种办法
第一种
cmd中输入命令:adb bash am monitor
然后启动需要获取包名的应用
第二种
cmd中输入命令:adb bash pm list packages -3
查看自己安装的app包名
第三种
下载雷电模拟器的包名类名查看器,找到app后直接点击复制包名(方便快捷)
下载地址:包名类名查看器电脑版下载包名类名查看器PC版下载雷电安卓模拟器 (ldmnq.com)
停止应用
stop_app("com.netease.cloudmusic")
安装/卸载应用
# 安装应用
install(r"D:\demo\tutorial-blackjack-release-signed.apk")
# 卸载应用
uninstall("com.netease.cloudmusic")
连接设备
auto_setup(__file__):自动初始化设备,脚本运行命令行有两种形式,命令行中的参数包含device
、log
等
auto_setup(__file__) # 在运行时的命令行中如果传入了类似--device Android:///这样的设备参数,那么脚本在初始化时会自动连上对应的设备,不需要再另外写代码连接了。
auto_setup(__file__,devices=["Android://127.0.0.1:5037/5PZTQWQOGES8RWUG"]) # 如果没有在初始化时连上设备,可以在接口中指定运行脚本的设备,或者使用connect_device接口来连接设备。
device():获取到当前使用中的设备。
# 在Android中,有一个平台独有的接口list_app可以列出所有安装过的应用
dev = device() # 先获取到当前设备对象,这里的dev即是一个Android对象
print(dev.list_app()) # 然后就可以调用平台独有接口了
connect_device():连接设备,其中127.0.0.1
代表本机IP,5037
是默认的adb port
,serialno
是android
手机的序列号。
from airtest.core.api import *
# 连上第一台手机
dev1 = connect_device("Android://127.0.0.1:5037/serialno1")
# 连上第二台手机
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")
init_device():连接设备,只需要传入设备平台和设备的uuid即可。
init_device(platform="Android", uuid="SJE5T17B17")
init_device(platform="Android", uuid="SJE5T17B17", cap_method="JAVACAP")
一些特殊参数
部分特殊设备在连接时可能会出现黑屏的情况,例如一些模拟器,我们可以额外添加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
。
大部分情况下,我们无需指定这些参数,只有在一些特殊的Android设备(例如部分特殊型号的平板)上,使用默认参数无法连接时,才需要加入额外的参数:
# 所有的选项都勾选上之后连接的设备,用&&来连接多个参数字符串
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH
注意:命令行中如果有出现^ < > | &
这些字符,可能都需要转义才能生效。
因此如果连接字符串中需要写&&
时,在windows
下需要改写成^&^&
,添加一个^
符号进行转义,在mac下则需要添加\
进行转义:
# --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命令行添加\转义
wifi远程运行
前面这些方法都是通过有线连接运行的,但是在无线下,Airtest也能运行,这和uiautomator如出一辙
确保手机开启了usb调试,用数据线把手机和电脑连接起来,之后在终端里面执行命令:
adb tcpip 8112
其中的端口号可以自行设定,但不能和已有的端口冲突。执行后出现restarting in TCP mode port
字样就可以将数据线拔下了。
在手机的wifi设置上,找到正在连接wifi的IP地址
之后在Airtest IDE中找到远程设备连接,输入:
adb connect 192.168.31.165:8112
192.168.31.165就是IP,8112就是设置的端口号,点击连接后,刷新ADB即可
注意:
更换一个网络环境需要使用新IP重新connect即可。
但是如果手机重启了,就需要重新连接数据线再次开启端口。
开启端口可以通过adb,也可以直接在手机上打开,但一般需要root权限和特殊软件。
使用本地adb执行
airtest下载后会自带adb,通常会对环境中的adb冲突,这个时候就需要在相应位置调用系统的adb才能解决问题,修改源码:
%python_home%\site-packages\airtest\core\android\android.py
如果是linux,使用which adb
寻找adb
第45行中,ADB初始化的时候加形参adb_path
,让它等于自己的adb:
# init adb
self.adb = ADB(self.serialno,adb_path="F:/environment/Android_SDK/platform-tools/adb.exe",server_addr=host, display_id=self.display_id, input_event=self.input_event)
self.adb.wait_for_device()
切换设备
set_current():在多个设备中进行切换
# 第一种:传入数字0、1、2等,切换当前操作的手机到Airtest连接的第1台、第2台、第3台手机
set_current(0)
set_current(1)
set_current(2)
# 第二种:切换当前操作的手机到序列号为serialno1、serialno2的手机
set_current("serialno1")
set_current("serialno2")
点击
touch():点击操作,可以是图片,也可以是坐标(坐标可以是绝对,可以是动态,推荐使用动态,可以在不同手机的分辨率下点击正确的位置)
touch(Template(r"scriptshots/tpl1623669702383.png", record_pos=(0.177, -0.018), resolution=(1600, 900))) # 根据录制脚本时所截取的图像进行点击
touch([500,500]) # 绝对坐标点击
w,h = dev.get_current_resolution() # 获取当前手机分辨率
touch([0.5*w, 0.5*h]) # 动态坐标点击,推荐使用
有的时候识别整个画面,若有干扰则会出现问题,这个时候需要局部找图点击,逻辑如下:
参考:使用Airtest最常遇到的几个需求,都帮你们实现好了 - AirtestProject - 博客园 (cnblogs.com)
screen = G.DEVICE.snapshot()
# 局部截图
local_screen = aircv.crop_image(screen,(0,949,1067,1500))
# 将我们的目标截图设置为一个Template对象
tempalte = Template(r"png_code/设置.png")
# 在局部截图里面查找指定的图片对象
pos = tempalte.match_in(local_screen)
# 返回找到的图片对象的坐标(该坐标是相对于局部截图的坐标)
print(pos)
# 若要返回目标在整个屏幕中的坐标,则x,y都需要加上局部截图时设置的最小x、y
print(pos[0]+0,pos[1]+949)
判断元素是否存在
exists():判断画面中是否存在某个图片,如果匹配到图片,返回图片所处位置的焦点,否则返回False
if exists(Template(r"tpl1606822430589.png")):
touch(Template(r"tpl1606822430589.png"))
元素等待
wait():可以等待画面中某个图片出现,如果在指定的时间范围内匹配到了该图片,就会返回图片所处位置的焦点,否则抛出TargetNotFoundError
异常
wait(Template(r"tpl1606821804906.png")) # timeout after ST.FIND_TIMEOUT
# find Template every 3 seconds, timeout after 120 seconds
wait(Template(r"tpl1606821804906.png"), timeout=120, interval=3)
# 可以在每次查找目标失败时,指定一个回调函数
def notfound():
print("No target found")
wait(Template(r"tpl1607510661400.png"), intervalfunc=notfound)
滑动元素
swipe():可以从一个位置滑动到另外一个位置
swipe(Template(r"tpl1574067097045.png"), vector=[0, -0.5]) # 以图片的坐标为原点,向下滑动0.5
w,h = d.get_current_resolution()
swipe([0.5*w,0.5*h],vector=[0, 0.5]) # 以屏幕中间为原点,向上滑动0.5
swipe([0.5*w,0.3*h],[0.5*w,0.8*h]) # 一个坐标滑动到另外一个坐标
swipe(Template(r"tpl1574067097045.png"),Template(r"tpl1574054095465.png")) # 一个图片的坐标滑动到另外一个图片的坐标
swipe([0.5*w,0.3*h],Template(r"tpl1574067097045.png")) # 一个坐标滑动到一个图片的坐标
输入文本
text():输入文本
text("test")
text("test", enter=False)# enter – 是否在输入完毕后,执行一次 Enter ,默认是True
text("test", search=True)# 在Android上,有时你需要在输入完毕后点击搜索按钮
模拟按键
keyevent():输入某个键,例如 home、back 等等
keyevent("HOME")# 按Home键
放大缩小手势
pinch():指定放大还是缩小,还可以指定中心位置点和放大缩小的比率
pinch(in_or_out='out', center=(300, 300), percent=0.4)# in_or_out后可输入"in"或者"out",意思是缩小、放大
截图
snapshot():截图到指定的路径下
snapshot(filename='xxx/test.jpg',mag='截图成功')
录屏
在命令行使用 airtest run
运行脚本时,可以通过添加 --recording
参数来录制脚本运行的视频。(运行结束后,录屏文件会默认保存在log文件夹里面,使用 recording_手机序列号
来命名录屏文件)
airtest run "D:\test\Airtest_example.air" --device android://127.0.0.1:5037/emulator-5554?cap_method=MINICAP_STREAM^&^&ori_method=MINICAPORI^&^&touch_method=MINITOUCH --log "D:/test\41f68fdf265d8c13998d0a1a7b992889" --recording
也可以在脚本中开启关闭录屏
# 开启录屏
recorder.start_recording(max_time=10)
# 结束录屏
recorder.stop_recording(output="test.mp4")
执行bash命令
在执行代码过程中,不可避免会到更改手机状态的操作,这个时候需要用到bash命令来调试手机,Airtest中的driver封装了执行bash命令的方法。
获取当前设备/连接当前设备
# 连接设备
dev = connect_device("Android:///device1")
# 获取当前设备
dev = device()
运行adb bash命令
dev.bash("dumpsys wifi | grep mWifiInfo") # 检查wifi网络状态
dev.bash("svc wifi disable") # 关闭wifi
dev.bash("svc wifi enable") # 开启wifi
dev.bash("svc data disable") # 关闭数据网络
dev.bash("svc data enable") # 开启数据网络
断言
assert_exists():设备屏幕上存在断言目标
assert_exists(Template(r"tpl1607324047907.png"), "assert exists")
assert_not_exists():设备屏幕上不存在断言目标
assert_not_exists(Template(r"tpl1607324047907.png"), "assert not exists")
assert_equal():断言两个值相等
assert_equal(1, 1, msg="assert 1==1")
assert_not_equal():断言两个值不相等
assert_not_equal(1, 2, msg="assert 1!=2")
assert_exists()与assert_equal()的区别在于,assert_exists断言的对象是图片,assert_equal断言的对象是数值
API(Windows端)
连接设备
device():连接设备
win = device()
按键操作
key_press(key):通过发送键盘扫描码模拟键盘按键按下
win.key_press('W')
key_release(key):通过发送键盘扫描码模拟键盘按键释放
win.key_release('W')
鼠标操作
mouse_move(pos):模拟鼠标移动
import win32api
x, y = win32api.GetCursorPos()
win.mouse_move((x+10, y+10))
mouse_down(button):模拟鼠标按下(鼠标左右键或其他)
win.mouse_down('right')
mouse_up(button):模拟鼠标释放(鼠标左右键或其他)
win.mouse_up('right')
Windows脚本一些常见问题以及解决方案
游戏窗口嵌入问题
一些游戏在使用窗口嵌入模式时会出现包括无法框选窗口或者画面消失在内的问题。如果窗口无法框选的话,可以尝试搜索窗口。如果连接窗口以后整个游戏窗口消失的话,可以选择无嵌入模式。如果仍旧无法连接窗口,可以尝试桌面模式。
使用桌面模式的图像脚本处理
因为使用了桌面模式,如果你的脚本当中涉及到图像识别,那很有可能在跑脚本的过程中识别到脚本中的图像,而不是游戏画面当中的图像。此时可以右键单击脚本,选择 图片/代码模式切换 ,将模式转换成代码模式,就能顺利运行脚本了。
PC游戏的光标限制
一些PC游戏对光标进行了限制,玩家无法将光标移出游戏画面以外。在编写脚本的时候,可以利用Tab+Alt
的方式进行窗口切换。
运行脚本
使用airtest ide运行
使用命令行运行脚本
airtest run untitled.air --device Android:///手机设备号 --log log/ # 使用airtest命令运行
python -m airtest run untitled.air --device Android:///手机设备号 --log log/ # 使用python命令行运行
airtest run test.air --device Android:/// --log logs/ --no-image# 使用airtest命令运行,但不保存截图
关于安卓的手机设备号码,其字符串定义为Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>
,其中,adbhost是adb server所在主机的ip,默认是本机127.0.0.1,adb port默认是5037,serialno是android手机的序列号。更多adb的方面的内容请参考文档 ADB 。
在平时的脚本运行中,我们一般可以这样写:
什么都不填写,会默认取当前连接中的第一台手机:
Android:///
连接本机默认端口连的一台设备号为79d03fa的手机:
Android://127.0.0.1:5037/79d03fa
用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno:
Android://127.0.0.1:5037/10.254.60.1:5555
连接一个Windows窗口,窗口句柄为123456:
Windows:///123456
连接一个Windows窗口,窗口名称匹配某个正则表达式:
Windows:///?title_re=Unity.*
连接windows桌面,不指定任何窗口:
Windows:///
连接iOS手机:
iOS:///127.0.0.1:8100
注意: 如果自己拼写的设备字符串无法正确连接设备,但是在AirtestIDE中可以正常连接的话,可以考虑先在AirtestIDE中运行一次脚本,然后将运行时自动生成的命令行里 --device Android:///
参数复制出来,即可在代码中使用了,这种做法可以极大程度避免设备字符串编写错误的问题。
除了上述命令行外,也可以通过python调用命令行输入命令来达到目的,这样就可以直接在python中开启.air项目
# -*- encoding=utf8 -*-
import os
os.system("airtest run test01.air --device Android:///127.0.0.1:7555")
注意,该.py文件需要放在.air文件夹外面,具体目录如下
用bat文件执行Airtest脚本
首先看下如何新建 .bat
文件。首先我们需要在电脑上新建一个 .txt
文件,并输入以下内容:
::关闭回显
@echo off
::切换到D盘
D:
::进入D盘的test目录
cd D:\test
::执行 airtest run 命令
start airtest run newsLogin.air
exit
其中 ::xxx
表示的是注释内容,可以不写入 .txt
文件中;另外示例脚本的路径为 D:\test\newsLogin.air
,所以这里还做了切换到脚本路径的操作,读者可以根据自己脚本的实际情况来进行切换。
还需要注意的是,在上述示例中已经在示例脚本的开头添加了设备和 log
的初始化内容,所以不用另外在运行命令后面加上各种运行参数:
auto_setup(__file__,logdir=True,devices=["Android://127.0.0.1:5037/emulator-5554"])
如果测试设备相对固定,也建议直接将这些参数写到脚本中,可以简化命令行运行脚本的命令。
写完以上几条命令后,关掉 .txt
文件,将他的后缀名 txt
改成 bat
,之后会弹出重命名的警示弹窗,点击“是”即可。
用bat文件顺序执行多个Airtest脚本
使用 .bat
文件成功执行单个airtest脚本之后,试试用 .bat
文件顺序执行多个airtest脚本:
@echo off
D:
cd D:\test
title 正在执行第一个脚本
airtest run newsLogin.air
title 正在执行第二个脚本
airtest run newsUsing.air
title 正在执行第三个脚本
airtest run newsExit.air
exit
可以看到,在上述登录网易新闻的示例脚本之外又增加了两个脚本,分别用来实现使用网易新闻和退出登录等操作。
所以在 .bat
文件中分别写了三条用于运行对应脚本的命令,其中 title xxx
用来指定命令提示窗口的标题,可以清晰地看出当前是在执行第几个脚本。最终的执行效果如下:
用bat文件实现多机运行
在 .bat
文件中,start
可以启动单独的命令行窗口来运行指定程序或命令。所以可以利用 start
命令开启多个命令行窗口,实现在多台设备上执行同一个脚本:
@echo off
D:
cd D:\test
start "正在使用雷电模拟器跑脚本" airtest run newsLogin.air --device Android://127.0.0.1:5037/emulator-5554
start "正在使用mumu模拟器跑脚本" airtest run newsLogin.air --device Android://127.0.0.1:5037/127.0.0.1:7555
exit
上述命令可以实现在1台雷电模拟器和1台mumu模拟器上跑同一个脚本,效果如下:
当然,还可以给每一台设备单独配置1个 .bat
文件,最后再写1个总的 .bat
文件来调度前面用于在特定设备上运行脚本的 .bat
。
终端筛选日志级别
运行脚本后,终端除了最上面的1条运行脚本的命令之外,剩余的就是一些 [debug]、[info]等log信息,如果只关注log里面的[error]信息,可以在脚本代码开头加上 log
级别的设定:
# -*- encoding=utf8 -*-
__author__ = "user"
import logging
logger = logging.getLogger("airtest")
logger.setLevel(logging.ERROR)
这样运行时只会在初始化手机时会有少量 log
输出,初始化完毕后就能够对 logger
进行过滤了。
若是在Airtest IDE中运行脚本,则只需要在log输出窗口中直接点击筛选即可。
IOS的WebDriverAgent安装过程
在进行IOS的自动化测试中,我们需要用到WebDriverAgent来驱动手机。所以需要用到MacOS的Xcode来编译安装(作者已经试过用Windows,事实证明只能用MacOS来安装WebDriverAgent)。但是Windows用户占大部分,不可能让他们为了某个需求而专门买一台MacOS系统的电脑,所以需要在Windows中将MacOS系统装进虚拟机中。
关于Vmware安装MacOS的教程,链接如下:
全网最详细的VMware虚拟机安装MacOS系统教程,没有之一!!!附全部资源 - 知乎 (zhihu.com)
在【使用记事本打开后缀为.vmx
的[macOS 10.14.vmx]的文件】这一部分的添加代码,语句应如下:
smc.version = "0"
cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011"
cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111"
cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110"
cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001"
cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001"
cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000"
cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011"
cpuid.1.edx = "0000:0111:1000:1011:1111:1011:1111:1111"
featureCompat.enable = "TRUE"
参考:VMware16安装Mac11.1Big Sur遇到“客户机操作系统已禁用 CPU。请关闭或重置虚拟机。”解决方案strzlz的博客-CSDN博客客户端操作系统已禁用cpu,请关闭或重置虚拟机
成功安装MacOS虚拟机后,在虚拟机的网络设置中直接调整为【桥接模式】即可用MacOS上网
脱离Mac搞iOS自动化,tidevice工具教你轻松实现!
提升脚本成功率
Airtest的上手并不复杂,可以说只要有一点Python脚本基础就能够轻松入门,然而随着产出的脚本代码越来越多,我们将会发现一个很严峻的问题:我们的脚本的运行结果,有时候似乎不受我们的控制。例如我们想要先判断当前画面上是否存在一个图标,只有在它存在时才进行下一步操作,然而明明画面上并没有,Airtest依然认为这个图标存在,打开报告一看才发现,它将屏幕上另外一个区域的内容判断认为是我们想找的图标了。再比如更加常见的一种情形是:我们框选了画面上的几个字,想要让它识别出来,但是运行结果时好时坏,Airtest常常认为我们选择的内容并不存在,但有时又能运行成功。
这个问题是Airtest的运行原理导致的,我们使用了图像识别的技术在当前游戏画面中查找对应的图片,然而图像识别并不能达到人眼识别的准确度,它只能尽可能地去寻找一个最符合预期的结果。这就经常导致了我们认为不存在的图片,它认为存在,或者 我们认为在画面上一眼就能找到的内容,Airtest认为不存在 。
也就是说,图像识别不是万能的!!! 它是有 成功率 的,假设一个脚本里有10张图片,每张图片的识别成功率都能达到95%之高,10张图片全部都正确识别的概率也不过60%而已。更何况,有许多图片因为种种原因,识别成功率远远低于95%这个值,要想脚本运行100%正确就更难了。
因此,我们在编写完脚本后,可以让脚本多运行几次,然后对成功率低的部分进行改进,这是几个值得注意的改进点:
截图时尽量 保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂背景图案,避免在背景变化后难以成功识别的问题
图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容
Airtest会尽可能地尝试适配 不同分辨率 的手机,但是在某些游戏上可能有自定义的分辨率适配规则,可以根据自己游戏的分辨率适配情况来自定义,攻略在 这里
若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在
Airtest
的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片。尽管我们提供了便捷的自动录制功能,能够直接将当前所有操作一步一步转换成代码,但是这种情况下自动截取的图片往往不太理想,需要手工再对截图进行调整
图像识别的配置项
在Airtest进行图像识别的过程中,有一些常见的配置项可以调整,以提升脚本运行的成功率:
在AirtestIDE中,可以通过双击图片,修改
threshold
的值来改变图像识别的阈值,阈值越高,对图像匹配的精度要求也就越高在识别图像时,Airtest会先将图像转为 灰度 图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。不过,我们可以通过双击图片,勾选设置里的
RGB
选项来强制使用彩色图像识别除了可以修改
threshold
和rgb
两个值以外,双击图片还能够设置识别成功后我们对于图像的点击位置target_pos
,例如我们可以在识别出一个图标后,指定Airtest去点击这个图标的右下角/左上角等位置具体的脚本配置方法可以在 5.2 Airtest脚本相关配置里查看
这里是大佬总结的使用airtest时的注意点,请注意细看,这会对接下来的开发有很大的帮助。网址点击即可:写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!AirtestProject的博客-CSDN博客airtest 截图