注解

本文档为Airtest框架与AirtestIDE编辑器补充文档,在脚本编写过程中请参照 Airtest项目文档 获取更多API的详细信息。

5.1 Airtest介绍

Airtest是一款跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和App。

访问Github上的 Airtest源码地址 ,可以获得更多信息,也欢迎各位帮忙完善项目,提交PR,也可以在issues页面中 提交bug或建议

Airtest项目文档请 点击此处 访问。

5.1.1 如何快速上手

关于安装、基本使用方法和简单的例子,请查看Airtest文档页的 快速上手 章节。

5.1.2 Airtest API

Airtest在 airtest.core.api 模块里,提供了一系列跨平台的API可供调用,包括常见的点击屏幕 touch ,拖动操作 swipe,输入文字 text 等操作,具体的API调用参数、返回值请查看 跨平台API文档

在跨平台API文档中,查看到的接口参数都为跨平台通用参数,具体到执行的平台上,可以再查阅平台API文档,获得更多参数信息。

touch 接口为例,假设在Android平台上需要点击,可以这样写:

# 从airtest.core.api中import所有API,请务必保留这一行
from airtest.core.api import *
# Android平台下的touch接口支持额外的参数duration来控制点击屏幕的时长
# 翻阅airtest.core.android.android中的Android包含的touch方法来获取更多参数信息
touch((600, 500), duration=1)

如果想要在一个.air脚本中,调用另外一个.air脚本里封装的公用函数,可以这样做:

from airtest.core.api import using
using("common.air")

from common import common_function

common_function()

更多相关信息,请查阅 Airtest框架完整文档 ,在本文档中只提供了部分接口的文档便捷查阅。

5.1.3 AirtestIDE中的Airtest脚本编写

在Airtest中,需要编写大量的截图语句,像这样:

touch(Template("image_of_a_button.png"))

其中的 Template("xx.png") 即为一个图片对象,如果要手工进行截图和代码编写,工作量会比较大,因此我们推荐大家使用专用的 AirtestIDE 进行截图语句的开发,会使脚本的编写事半功倍。

官网 下载AirtestIDE,解压后即可使用,里面附带的Airtest辅助窗对于编写Airtest的脚本语句来说十分便捷:

../_images/airtest_assistant.png

鼠标放在Airtest辅助窗的按钮上能看到相关接口参数信息,直接点击按钮就能生成对应的语句,或是可以直接在当前连接的设备画面上进行截图,截取完成后将会在脚本窗口生成带截图的语句。

5.1.4 进阶:提升脚本成功率

Airtest的上手并不复杂,可以说只要有一点Python脚本基础就能够轻松入门,然而随着产出的脚本代码越来越多,我们将会发现一个很严峻的问题:我们的脚本的运行结果,有时候似乎不受我们的控制。例如我们想要先判断当前画面上是否存在一个图标,只有在它存在时才进行下一步操作,然而明明画面上并没有,Airtest依然认为这个图标存在,打开报告一看才发现,它将屏幕上另外一个区域的内容判断认为是我们想找的图标了。再比如更加常见的一种情形是:我们框选了画面上的几个字,想要让它识别出来,但是运行结果时好时坏,Airtest常常认为我们选择的内容并不存在,但有时又能运行成功。

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

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

因此,我们在编写完脚本后,可以让脚本多运行几次,然后对成功率低的部分进行改进,这是几个值得注意的改进点:

  • 截图时尽量 保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂背景图案,避免在背景变化后难以成功识别的问题
  • 图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容
  • Airtest会尽可能地尝试适配 不同分辨率 的手机,但是在某些游戏上可能有自定义的分辨率适配规则,可以根据自己游戏的分辨率适配情况来自定义,攻略在 这里
  • 若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在`Airtest`的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片。
  • 尽管我们提供了便捷的自动录制功能,能够直接将当前所有操作一步一步转换成代码,但是这种情况下自动截取的图片往往不太理想,需要手工再对截图进行调整

图像识别的配置项

在Airtest进行图像识别的过程中,有一些常见的配置项可以调整,以提升脚本运行的成功率:

  • 在AirtestIDE中,可以通过双击图片,修改 threshold 的值来改变图像识别的阈值,阈值越高,对图像匹配的精度要求也就越高
  • 在识别图像时,Airtest会先将图像转为 灰度 图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。不过,我们可以通过双击图片,勾选设置里的 RGB 选项来强制使用彩色图像识别
  • 除了可以修改 thresholdrgb 两个值以外,双击图片还能够设置识别成功后我们对于图像的点击位置 target_pos ,例如我们可以在识别出一个图标后,指定Airtest去点击这个图标的右下角/左上角等位置
  • 具体的脚本配置方法可以在 5.2 Airtest脚本相关配置 里查看