Airtest自动化测试——Airtest进阶和图像识别算法(上)
Posted weixin_43802541
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Airtest自动化测试——Airtest进阶和图像识别算法(上)相关的知识,希望对你有一定的参考价值。
- Airtest进阶
1.1 提升脚本成功率
我们使用了图像识别的技术在当前游戏画面中查找对应的图片,然而图像识别并不能达到人眼识别的准确度,它只能尽可能地去寻找一个最符合预期的结果。这就经常导致了我们认为不存在的图片,它认为存在,或者我们认为在画面上一眼就能找到的内容,Airtest认为不存在 。
也就是说,图像识别不是万能的!!!它是有 成功率 的,假设一个脚本里有10张图片,每张图片的识别成功率都能达到95%之高,10张图片全部都正确识别的概率也不过60%而已。更何况,有许多图片因为种种原因,识别成功率远远低于95%这个值,要想脚本运行100%正确就更难了
改进点:
- 截图时尽量 保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂
背景图案,避免在背景变化后难以成功识别的问题
- 图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容
- Airtest会尽可能地尝试适配 不同分辨率 的手机,但是在某些游戏上可能有自定义的分辨率适配规则,可以
根据自己游戏的分辨率适配情况来自定义,参考:
https://airtest.doc.io.netease.com/IDEdocs/airtest_framework/1_script_settings/
-
若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在Airtest的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片
-
尽管AirtestIDE提供了便捷的自动录制功能,能够直接将当前所有操作一步一步转换成代码,但是这种情况下自动截取的图片往往不太理想,需要手工再对截图进行调整
1.2 脚本相关设置
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.2.2 脚本全局设置
默认全局属性:
RESIZE_METHOD = staticmethod(cocos_min_strategy)
THRESHOLD = 0.7 # [0, 1]
THRESHOLD_STRICT = 0.7 # [0, 1]
OPDELAY = 0.1
FIND_TIMEOUT = 20
FIND_TIMEOUT_TMP = 3
PROJECT_ROOT = os.environ.get(“PROJECT_ROOT”, “”) # for using other script
全局属性设置方法:
from airtest.core.api import *
airtest.core.api中包含了一个名为ST的变量,即为全局设置
ST.THRESHOLD = 0.8
未指定图片threshold,默认使用ST.THRESHOLD中的0.8
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264)))
手工指定图片threshold,以图片设置的0.6为准
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6))
属性值介绍:
- RESIZE_METHOD
默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则)
from airtest.core.api import *
def custom_resize_method(w, h, sch_resolution, src_resolution):
return int(w), int(h)
替换默认的RESIZE_METHOD
ST.RESIZE_METHOD = custom_resize_method
上面的代码指定了一个自定义的缩放规则:直接return原来的值,不管屏幕分辨率,
所有UI都不进行缩放(有的游戏就是这种策略)。
- THRESHOLD
THRESHOLD在上文中已经提到过,是图像识别的阈值,
除了能够设置单张图片的识别THRESHOLD值以外,还可以设置全局的THRESHOLD,让每一张图片都默认生效。
而设置中还有一个THRESHOLD_STRICT,这是一个更加严格的阈值设定,只用于assert_exists(图片)接口
- OPDELAY
在我们的脚本中,每一个步骤的操作之间都会有一小段时间间隔,默认用OPDELAY进行设定。
OPDELAY默认值为0.1,即每一步操作后等待0.1秒,将它适当设置得大一些,可以在每次操作后停顿一小段时间,避免过快进行下一个操作导致不能成功的问题,但最好使用wait或者sleep在操作前增加等待
- FIND_TIMEOUT
在每次进行图像查找时,如果一次查找不成功,将会再次进行截图-查找的循环,
直到超时才会停下来,超时时长为FIND_TIMEOUT,默认20秒。
还提供了一个FIND_TIMEOUT_TMP,默认只有3秒。在不同的截图接口中分别使用了这2个值:
使用了FIND_TIMEOUT作为图片查找超时时长的接口为:
touch
double_click
swipe(swipe支持从第一张图片滑动到第二张图片,此处只有第一张图片使用了FIND_TIMEOU)
wait(wait支持直接传入一个timeout参数,若没有指定timeout,默认使用FIND_TIMEOUT作为超时时长)
assert_exists
在另外一些对查找图片的要求较低的接口中,使用了时长较短的FIND_TIMEOUT_TMP:
swipe(如果第二个参数传入了图片,那么它将使用较短的查找时间)
exists
assert_not_exists
- PROJECT_ROOT
可以通过设定一个默认项目根目录PROJECT_ROOT,让使用using接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便
- 图像识别算法选择CVSTRATEGY
在Airtest中,提供了多种不同的图像识别算法,方法名列表有:
[“tpl”, “kaze”, “brisk”, “akaze”, “orb”, “sift”, “surf”, “brief”]。
具体每个算法的识别效果、内存占用等评估数据,可以参考Airtest/benchmark文档,在实际使用中,由于使用场景、图片分辨率大小以及手机类型的多寡不同,每个算法具体的表现优劣情况也有所不同,因此大家可以用自己的使用案例来进行算法的测试,选择更合适的算法。
在Airtest脚本中,使用以下代码来设定脚本中的图像匹配算法
1.3 模拟特殊按键
在脚本中,有时需要输入一些指定的按键,例如点一下HOME键、BACK键等,如果设备是android设备,可以参考谷歌的 Android按键码 (国内用户如果打不开此链接,可直接以关键词:Android keyevent 搜索)。
示例:keyevent(“KEYCODE_DEL”) 或者直接输入按键码,注意参数为字符串:keyevent(“67”)
在Windows系统中,请参考 pywinauto 这个库提供的 Windows按键码
示例:keyevent("BACKSPACE")
ios设备现在暂时 只支持 HOME 按键的keyevent。
android的按键参考:
https://developer.android.com/reference/android/view/KeyEvent
1.4 输入文字
在脚本中,如果想要实现文字输入,一般需要这样的流程:
-
点一下你需要输入的位置,激活输入光标
-
调用airtest的 text() 接口来输入内容
如图,在这个脚本里 先点击了需要输入的位置 ,然后调用了text接口进行输入,在运行时手机将会自动被安装一个名为 yosemite.apk 的应用,然后启用 yosemite输入法来进行输入。
而且需要注意的是,在使用过text接口后,手机输入法会被切换为yosemite输入法,因此看不到正常键盘了(无需惊慌)。如果需要手工输入,可以在系统的输入法设置中,把输入法切换回系统输入法即可恢复。同时我们也提供了 安卓手机助手功能 ,在手机助手中可以简单地点击鼠标来切换输入法。
1.5 局部截图/区域截图
局部截图或者说按坐标截图是大家经常会问到的问题,Airtest提供了 crop_image(img, rect) 方法可以帮助我们实现局部截图
-- encoding=utf8 --
author = “AirtestProject”
from airtest.core.api import *
crop_image()方法在airtest.aircv中,需要引入
from airtest.aircv import *
auto_setup(file)
screen = G.DEVICE.snapshot()
局部截图
screen = aircv.crop_image(screen,(0,160,1067,551))
保存局部截图到log文件夹中
try_log_screen(screen)
【未完待续】
以上是关于Airtest自动化测试——Airtest进阶和图像识别算法(上)的主要内容,如果未能解决你的问题,请参考以下文章
airtest自动化测试MAC本地python运行airtest模块报没有权限
软件测试学习资料之Airtest自动化测试——Airtest环境搭建