八、Airtest脚本的全局设置

1. 脚本全局设置

airtest.core.settings里,提供了部分全局默认属性,其中我们列举出几个常见属性和它们的默认值:

  • LOG_DIR = None
  • LOG_FILE = “log.txt”
  • RESIZE_METHOD = staticmethod(cocos_min_strategy)
  • CVSTRATEGY = [“mstpl”, “tpl”, “surf”, “brisk”]
  • 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
  • SNAPSHOT_QUALITY = 10 # 1-100
  • IMAGE_MAXSIZE = os.environ.get(“IMAGE_MAXSIZE”, None)
  • SAVE_IMAGE = True

2. 全局属性设置方法

想要改变上述的settings里的值,只需要在脚本中这样写:

  1. from airtest.core.api import *
  2. # airtest.core.api中包含了一个名为ST的变量,即为全局设置
  3. ST.THRESHOLD = 0.8
  4. # 未指定图片threshold,默认使用ST.THRESHOLD中的0.8
  5. touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264)))
  6. # 手工指定图片threshold,以图片设置的0.6为准
  7. touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6))

3. 属性值介绍

1)log内容的设置:LOGFILE、LOGDIR

LOGFILE 用于自定义记录log内容的txt文档的名称;LOGDIR 用于自定义log内容的保存路径,示例如下:

  1. from airtest.core.settings import Settings as ST
  2. from airtest.core.helper import set_logdir
  3. ST.LOG_FILE = "log123.txt"
  4. set_logdir(r'D:\test\1234.air\logs')
  5. auto_setup(__file__)
  6. # 此处省略N条用例脚本

图片

2)分辨率适配规则:RESIZE_METHO

在使用不同分辨率的设备进行图像识别时,可能会导致识别成功率不佳,因此Airtest提供了默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则),代码在这里

想要提高2d游戏的识别精度,最好的办法就是明确指定你的游戏的分辨率适配规则,例如,直接在 .air 脚本文件的开头这样写:

  1. from airtest.core.api import *
  2. def custom_resize_method(w, h, sch_resolution, src_resolution):
  3. return int(w), int(h)
  4. # 替换默认的RESIZE_METHOD
  5. 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中用代码实现即可。这样做,能够大大提升不同分辨率设备下的图像识别成功率。

3)图像识别算法的设置:CVSTRATEGY

CVSTRATEGY 用于 设置Airtest的图像识别算法,默认情况下 CVSTRATEGY = ["mstpl", "tpl", "surf", "brisk"] ,每次查找图片的时候,airtest就会按照这个设置好的算法顺序去执行,直到找出一个符合设定阈值的识别结果,或者是一直按照这个算法顺序循环查找,直到超时。

我们可以自定义Airtest的图像识别算法,示例如下:

  1. from airtest.core.settings import Settings as ST
  2. # 脚本运行时将按照此算法顺序识别,直到“找到符合设定阈值的识别结果”或“识别超时”
  3. ST.CVSTRATEGY = ["tpl", "sift","brisk"]

PS:关于Airtest各个图像识别算法的介绍,推荐阅读文章

4)图像阙值:THRESHOLD、THRESHOLD_STRICT

THRESHOLDTHRESHOLD_STRICT 都是图像识别的阙值,Airtest1.1.6版本之后,所有用到了图像识别的接口,都是用 THRESHOLD 作为阙值。它的默认值为0.7,取值范围[0,1]。

在进行图像匹配时,只有 当识别结果的可信度大于阙值时,才认为找到了匹配的结果:

图片

除了可以修改全局的图像识别阙值,我们还支持修改单张图片的阙值,需要注意的是,如我们没有单独设置图像的阙值,将默认使用全局阙值 THRESHOLD ,示例如下:

  1. from airtest.core.settings import Settings as ST
  2. # 设置全局阙值为0.8
  3. ST.THRESHOLD = 0.8
  4. # 设置单张图片的阙值为0.9
  5. touch(Template(r"tpl1607424190850.png", threshold=0.9, record_pos=(-0.394, -0.176), resolution=(1080, 1920)))

在Airtest1.1.6之前, assert_exists 使用的图像阙值 是 THRESHOLD_STRICT 。所以使用1.1.6之前版本的同学,想要修改 assert_exists 的图像阙值,需要设置 THRESHOLD_STRICT 的值。

5)步骤之间的时间间隔:OPDELAY

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

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

6)查询的超时时长:FIND_TIMEOUT、FIND_TIMEOUT_TMP

在每次进行图像查找时,如果一次查找不成功,将会再次进行 截图-查找的循环 ,直到超时才会停下来,超时时长为FIND_TIMEOUT,默认20秒。

同时,我们还提供了一个FIND_TIMEOUT_TMP,默认只有3秒。在不同的截图接口中分别使用了这2个值:

使用了FIND_TIMEOUT作为图片查找超时时长的接口为:

  • touch
  • double_click
  • swipeswipe支持从第一张图片滑动到第二张图片,此处只有第一张图片使用了FIND_TIMEOUT
  • waitwait支持直接传入一个timeout参数,若没有指定timeout,默认使用FIND_TIMEOUT作为超时时长)
  • assert_exists

在另外一些对查找图片的要求较低的接口中,使用了时长较短的FIND_TIMEOUT_TMP

  • swipe(如果第二个参数传入了图片,那么它将使用较短的查找时间)
  • exists
  • assert_not_exists

如果想要修改全局的图片查找超时时长,请务必注意需要修改的是哪个值。

修改示例:

  1. from airtest.core.settings import Settings as ST
  2. # 设置全局的超时时长为60s
  3. ST.FIND_TIMEOUT = 60
  4. ST.FIND_TIMEOUT_TMP = 60
  5. # 设置单条wait语句的超时时长
  6. wait(Template(r"tpl1607425650104.png", record_pos=(-0.044, -0.177), resolution=(1080, 1920)),timeout=120)

7)项目根目录:PROJECT_ROOT

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

例如,我们建立一个名为test1.air的脚本,实际路径为/User/test/project/test1.air

  1. from airtest.core.api import *
  2. def test():
  3. touch("tmp.png")

在同一目录下另外一个main.air脚本可以这样引用到它里面的test

  1. from airtest.core.api import *
  2. ST.PROJECT_ROOT = "/User/test/project"
  3. using("test1.air")
  4. from test1 import test

另外,auto_setup() 接口也可以传入项目根目录:

  1. auto_setup(__file__, project_root="/User/test/project")

8)截图压缩精度:SNAPSHOT_QUALITY

SNAPSHOT_QUALITY 用于设置全局的截图压缩精度,需要注意的是,设置的是Airtest报告里面显示的截图精度,而不是我们的截图脚本截取的那张图片的精度。默认值为10,取值范围[1,100],数值越高,截图的精度越高,越清晰。示例如下:

  1. from airtest.core.settings import Settings as ST
  2. # 设置全局的截图精度为90
  3. ST.SNAPSHOT_QUALITY = 90

另外我们还可以定义单张截图的压缩精度,示例:

  1. # 设置单张截图的压缩精度为90,其余未设置的将按照全局压缩精度来
  2. snapshot(quality=90)

9)截图尺寸大小:IMAGE_MAXSIZE

在Airtest1.1.6中,新增了一个用于指定截图最大尺寸的设置:ST.IMAGE_MAXSIZE 。假如设置为1200,则最后保存的截图长宽都不会超过1200,有利于进一步缩小截图的图片尺寸。示例:

  1. from airtest.core.settings import Settings as ST
  2. # 设置全局截图尺寸不超过600*600,如果不设置,默认为原图尺寸
  3. ST.IMAGE_MAXSIZE = 600
  4. # 不单独设置的情况下,默认采用ST中的全局变量的数值,即600*600
  5. snapshot(msg="test12")
  6. # 设置单张截图的最大尺寸不超过1200*1200
  7. snapshot(filename="test2.png", msg="test02", quality=90, max_size=1200)

10)保存运行过程的截图:SAVE_IMAGE

默认情况下,运行脚本时会保存步骤的截图,用于显示在报告的快览和步骤详情中;但Airtest1.1.7版本起,settings 新增了一个配置 ST.SAVE_IMAGE ,默认为 True , 如果改为 False ,就不保存截图,直到这个值再次设为 True ,示例:

  1. from airtest.core.api import *
  2. # 暂时关闭截图
  3. ST.SAVE_IMAGE = False
  4. touch((100, 100)) # 这条语句将不会保存当前画面图片
  5. # 继续截图
  6. ST.SAVE_IMAGE = True
  7. touch((100, 100))

image

(不保存截图的touch)

image

(保存截图的touch)