7.2 脚本配置¶
在Airtest
中提供了一些额外的配置选项,我们可以通过修改它们,使脚本运行更符合预期。
1. 图像识别相关选项¶
图像识别相关的选项有3个,threshold
,target_pos
和rgb
。
修改单张图片的相关选项¶
AirtestIDE直接修改¶
在AirtestIDE
中,可以通过双击脚本中的图片,调出图像设置菜单:
可以直接通过修改菜单中的值,来自动改变这张图像的相关属性。
脚本代码修改属性¶
假如直接使用文本编辑器打开我们所编辑的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。
如果希望修改全局所有图片的图像识别阈值THRESHOLD,可以查看下文介绍。
图像点击位置target_pos(整型)¶
当识别出一张图像后,Airtest
将会默认去点击图像的正中心位置,有时我们希望它识别出图片后点击其他位置,可以通过修改target_pos
属性来实现。
例如:
在上图中,我们希望点击中间选项的“升级”按钮,不希望点到别的选项去,而只截出升级按钮不能满足我们的需求。
此时我们可以考虑将截图范围扩大到红色虚线框选的区域,截图后将这张方形图片视为一个九宫格,方框上的每一个暗色红点都代表一个数字,将希望被点击的位置设置为target_pos
的值即可。在这个例子中,我们可以让截图区域的底部正好放在“升级”按钮上,然后设置target_pos=8
即可正好点击到该按钮。
target_pos
取值范围是1~9,[1, 9],且必须为整数,默认值是5(图像正中心)。
切换彩色与灰度识别rgb¶
在识别图像时,Airtest
会先将图像转为灰度图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest
将认为它们都是相同内容。
通过勾选rgb
选项,或在代码中加入rgb=True
,可以强制指定使用彩色图像进行识别。
2. 脚本全局设置¶
在airtest.core.settings
里,提供了部分全局默认属性,其中我们列举出几个常见属性和它们的默认值:
- 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
全局属性设置方法¶
想要改变上述的settings
里的值,只需要在脚本中这样写:
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¶
在使用不同分辨率的设备进行图像识别时,可能会导致识别成功率不佳,因此Airtest
提供了默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则),代码在这里。
想要提高2d游戏的识别精度,最好的办法就是明确指定你的游戏的分辨率适配规则,例如,直接在.air脚本文件的开头这样写:
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都不进行缩放(有的游戏就是这种策略)。
这里的RESIZE_METHOD
,即我们定义的custom_resize_method
使用的输入参数为:
- w, h # 录制下来的UI图片的宽高
- sch_resolution # 录制时的屏幕分辨率
- src_resolution # 回放时的屏幕分辨率
输出为:
- 回放时的UI图片宽高
若要自定义你的RESIZE_METHOD
,只需要知道你测试的游戏的缩放规则,然后在custom_resize_method
中用代码实现即可。这样做,能够大大提升不同分辨率设备下的图像识别成功率。
THRESHOLD¶
THRESHOLD
在上文中已经提到过,是图像识别的阈值,我们除了能够设置单张图片的识别THRESHOLD
值以外,还可以设置全局的THRESHOLD
,让每一张图片都默认生效。
而设置中还有一个THRESHOLD_STRICT
,这是一个更加严格的阈值设定,只用于assert_exists(图片)
接口。
OPDELAY¶
在我们的脚本中,每一个步骤的操作之间都会有一小段时间间隔,默认用OPDELAY
进行设定。
OPDELAY
默认值为0.1,即每一步操作后等待0.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
如果想要修改全局的图片查找超时时长,请务必注意需要修改的是哪个值。
PROJECT_ROOT¶
可以通过设定一个默认项目根目录PROJECT_ROOT
,让使用using
接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便。
from airtest.core.api import *
ST.PROJECT_ROOT = "/User/test/project"
# test1.air的实际路径为/User/test/project/test1.air
using("test1.air")
from test1 import test