Airtest自动化测试——Airtest进阶和图像识别算法(上)

Posted weixin_43802541

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Airtest自动化测试——Airtest进阶和图像识别算法(上)相关的知识,希望对你有一定的参考价值。

  1. Airtest进阶

1.1 提升脚本成功率

我们使用了图像识别的技术在当前游戏画面中查找对应的图片,然而图像识别并不能达到人眼识别的准确度,它只能尽可能地去寻找一个最符合预期的结果。这就经常导致了我们认为不存在的图片,它认为存在,或者我们认为在画面上一眼就能找到的内容,Airtest认为不存在 。

也就是说,图像识别不是万能的!!!它是有 成功率 的,假设一个脚本里有10张图片,每张图片的识别成功率都能达到95%之高,10张图片全部都正确识别的概率也不过60%而已。更何况,有许多图片因为种种原因,识别成功率远远低于95%这个值,要想脚本运行100%正确就更难了

改进点:

  1. 截图时尽量 保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂

背景图案,避免在背景变化后难以成功识别的问题

  1. 图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容

  1. Airtest会尽可能地尝试适配 不同分辨率 的手机,但是在某些游戏上可能有自定义的分辨率适配规则,可以

根据自己游戏的分辨率适配情况来自定义,参考:

https://airtest.doc.io.netease.com/IDEdocs/airtest_framework/1_script_settings/

  1. 若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在Airtest的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片

  2. 尽管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))

属性值介绍:

  1. 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都不进行缩放(有的游戏就是这种策略)。

  1. THRESHOLD

THRESHOLD在上文中已经提到过,是图像识别的阈值,

除了能够设置单张图片的识别THRESHOLD值以外,还可以设置全局的THRESHOLD,让每一张图片都默认生效。

而设置中还有一个THRESHOLD_STRICT,这是一个更加严格的阈值设定,只用于assert_exists(图片)接口

  1. OPDELAY

在我们的脚本中,每一个步骤的操作之间都会有一小段时间间隔,默认用OPDELAY进行设定。

OPDELAY默认值为0.1,即每一步操作后等待0.1秒,将它适当设置得大一些,可以在每次操作后停顿一小段时间,避免过快进行下一个操作导致不能成功的问题,但最好使用wait或者sleep在操作前增加等待

  1. 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

  1. PROJECT_ROOT

可以通过设定一个默认项目根目录PROJECT_ROOT,让使用using接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便

  1. 图像识别算法选择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 输入文字

在脚本中,如果想要实现文字输入,一般需要这样的流程:

  1. 点一下你需要输入的位置,激活输入光标

  2. 调用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简介

软件测试学习资料之Airtest自动化测试——Airtest环境搭建

基于图像识别框架Airtest的Windows项目自动化测试实践

Airtest移动端自动化测试环境搭建 一

Airtest自动化测试工具