在上一篇文章中,我们遇到了AirTest IDE ,但以防万一,让我们重复一下:AirTest IDE是由网易开发的,旨在用于“难以自动化”的应用程序,例如游戏。 实际上,它们是开发人员的主要重点,尽管这不会停止将AirTest用于其他任何应用程序。
这项工作是致力于AirTest IDE的系列文章中的第二篇。 您可以在此找到有关AirTest IDE 的第一篇概述文章,以及通过此链接撰写的第三篇也是最后一篇针对Poco UI自动化框架的文章。
今天,我将向您介绍两个主要框架之一-AirTest。 AirTest是一个基于图像识别( Image Recognition )原理的UI自动化跨平台框架,据开发人员说,该框架适用于游戏和应用程序。 GitHub上的AirTest项目包含4个项目: Airtest , Poco , iOS-Tangent , multi-device-runner 。
现在让我们进入有趣的部分!

AirTest如何运作
AirTest根据阈值处理过程处理生成的屏幕截图。 底线是将图像中像素的强度与一定数量( 阈值 )进行比较,如果像素值较大,则为其分配颜色(最常使用白色)。 否则,将分配其他颜色-黑色。 结果,输出是黑白图像。 这是自然的限制-AirTest在识别期间不会考虑颜色。 例如,如果您使用的对象具有相同的轮廓,但是具有不同的颜色(例如,着色),并且需要检查是否存在具有特定调色板的元素,那么这将非常困难,并且可能根本无法工作。
例如,作为AirTest IDE测试的一部分,决定与Marvel Puzzle Quest游戏一起使用。 加载时,来自此漫画世界的角色以特定顺序在屏幕上闪烁。 有时他们的服装会变,这是我第一次收到警报。 在下面的示例中,作为测试的一部分,我希望经典中的蜘蛛侠能够穿上隐形服。 该测试实际上是成功的,但这是由于上述原因而发生的-在识别过程中使用了黑白图像。 一个预期的结果以及最终发生的情况的示例:

提高成功完成测试的可能性
正如您已经了解的那样,图像识别远非万能药,尽管它在这里很有效。 要编写质量测试,您必须避免编写代码,并因此了解Python的基础知识。 例如,在查找特定元素之前,最好先确保它确实在屏幕上。 有时,AirTest会“遗失”,并可能为您需要的物品提供错误的物品。 有时,使用图像识别功能无法识别要查找的文本。 AirTest可能会混淆结果,并假定您需要的文本在屏幕上,但是实际上,那里的文本完全不同。 结果分析过程旨在简化已经集成到AirTest IDE中的报告系统。 您可以使用键盘快捷键Ctrl / Cmd + L在测试/脚本完成后创建并打开报告。
根据一般性建议,我还要强调以下几点。
- 截取所需元素的屏幕截图。 我的意思是,例如,如果您需要一个位于复杂纹理背景上的按钮,则尝试仅制作一个按钮屏幕,以免浪费时间来处理背景,而实际上,您并不需要。 在这种情况下,搜索将不取决于背景幕上显示的内容,并且您将在更短的时间内获得更准确的结果。
- 尽量避免识别仅包含文本的图像,例如 在这种情况下,成功识别(“成功率”)将大大降低。
- 尽管在自动代码录制(脚本自动录制)过程中创建屏幕截图是一个相当方便的功能,但是在某些地方,屏幕快照不是很有用。 最好手动创建它们,以便在您的图片中存储更多有用的搜索信息。
如果您想问“是否可以更改图像搜索过程的设置?”,那么我会回答您-是的,这是可能的。
图像识别设置
允许并鼓励用户使用“图像识别”设置来获得所需的结果,以优化成功识别屏幕上元素的时间和概率(成功率)。 这些设置存储在“图像编辑器”窗口中,要打开它,您需要在“脚本编辑器”中双击所需的图像。 例如,如果您想提高项目阈值操作的精度要求,则需要分别更改每个图像的识别设置或使用全局变量。
图像编辑器包含一个工作区域,以及“快照+识别”和“显示帮助”按钮。 第一个负责将当前图片与快照版本进行比较。 快照图片是从设备上的当前窗口捕获的。 第二个按钮打开“图像编辑器”功能手册。 在窗口的右侧,显示当前要搜索的图像以及诸如文件名,阈值,target_pos和rgb之类的设置。
- 文件名字段负责当前保存的图像的名称(所有图像都保存在项目文件夹中)。
- 阈值存储识别后图像的重合百分比(从0到1)的值。 值越高,对图像匹配精度的要求越高。 如上所述,AirTest将图像转换为黑白(取决于阈值的实现),因此在识别过程中不会考虑颜色。
- rgb复选框旨在在图像识别期间“启用并添加”颜色,从而开始考虑它。 但是,请记住,包含此功能仍然不能保证100%的结果。 例如,如果您有2个相同的按钮,只是背景颜色不同,则错误识别的可能性(例如,在assert_exists / assert_not_exists中)会很高。
- target_pos负责AirTest识别后在图片中单击的点。 默认情况下,该值为5,但是您可以将其从1更改为9,其中1是工作图像的左上角,而9是右下角。 以下屏幕截图清楚地显示了所有九个点的位置。 您也可以在官方文档中阅读有关内容。
在此示例中,选择中间按钮进行识别。 轮廓线显示所选内容的边框。

使用AirTest编写自动化测试
AirTest框架的所有工作命令都可以在Airtest IDE左上角的AirTestAssistant窗口中找到。 如果不存在,则可以使用Window-> Default layout设置默认窗口布局 。
在程序的当前版本中,可以使用“ AirTest助手”窗口中可用的以下命令:
- touch-此命令模拟移动设备上的触摸手势。 触摸具有以下参数-触摸(v,时间= 1,持续时间= 0.01,右键单击= False)。
- v-图片或坐标(x,y)
- times-点击次数。 预设值为1
- 持续时间-触摸屏幕后保持的持续时间。 使用此参数,您可以模拟“长按”(long_touch)。 默认值为0.01秒。
- right_click-单击“鼠标右键”。 只能在Windows程序中使用。
- 等待 -等待UI元素。 该命令具有以下参数-等待(v,超时=超时,间隔= 5,间隔函数=无)。
- v-程序期望的图像
- 超时-超时。 预设值为20。
- intervalfunc-用户(自定义)功能。 如果未找到图像,则将执行此功能。
- 间隔-图像比较之间的间隔
该函数返回以下内容:如果找到图像,则返回给定图像的中心坐标,否则抛出TargetNotFoundError
- 滑动 -此命令可模拟移动设备上的滑动手势(“滑动屏幕”)。 滑动具有以下参数:滑动(v1,v2 =无,矢量=无,持续时间= 0.01)。
- v1-svayp开始的值。 它可以是图像,也可以是给定的坐标(x,y)
- v2:滑动结束值(命令从v1到v2执行)。 该参数的优先级高于“向量”参数
- 向量[x,y]-是在AirTest操作期间创建的,也可以自行设置。 指示要刷卡的方式。 要向右滑动,X必须为正,反之,Y必须为正以向下滑动。
- 步骤-没有使用此参数,也没有发现它在实践中的应用方式。 工具提示给出以下内容:“滑动路径中的节点,默认为5”。 我想将滑动方向矢量分为多个“部分”,而不是立即从A点切换到B点,而是在此参数指定的节点中稍作停顿来模拟滑动,就像在模拟分阶段运动一样。 例如,如果值为5,则矢量将分为5个段。
- 持续时间-刷卡的持续时间。 默认值为0.5秒。
- 存在 -已在设备的监视器屏幕上选中了所需元素。 存在具有以下参数:存在(v)
- v-图片
该函数返回以下内容:如果找到图像,则返回图像中心的坐标,否则返回False。
- text-文本输入命令。 文本具有以下参数:文本(文本,输入= True,搜索= False)
- 文本-要输入的文本字符串
- enter-输入文本后是否使用“ Enter”的参数。 默认值为True。
- 搜索-未使用此参数,也未找到实际应用的方法。 工具提示给出以下内容:“强制”搜索“或输入后不搜索”。 默认值为False。
- keyevent-模拟按下设备上的物理按钮,例如HOME,BACK,MENU,POWER等。 该命令的参数:keyevent(键名)
- 快照 -创建当前状态下的屏幕截图。 默认选项:快照(文件名=无,味精=“测试点”)
- filename-将当前屏幕截图另存为单独的文件。 您可以忽略此选项。
- msg-此测试点的描述。 此文本将显示在HTML报告中,可以在测试后创建。
此函数返回以下内容:文件名(文件名)。
- 睡眠 -运行测试“入睡”一段时间。 默认值:睡眠(秒= 1.0)
- assert_exists-检查元素是否存在。 该命令的参数:assert_exists(v,msg =“测试点”)
- v-具有元素的图像,检查其存在
- msg-此测试点的描述。 此文本将显示在HTML报告中,可以在测试后创建。
此函数返回以下内容:如果找到图像,则返回该图像中心点的坐标,否则抛出AssertionError
- assert_not_exists-检查该项目在设备屏幕上不存在。 该命令的参数:assert_not_exists(v,msg =“测试点”)
- v-具有元素的图像,检查其存在
- msg-此测试点的描述。 此文本将显示在HTML报告中,可以在测试后创建。
- assert_equal-检查属性是否等于指定的值。 该命令的参数:assert_equal(第一,第二,msg =“测试点”)
- 第一-要比较的第一项
- 第二-要比较的第二个元素
- msg-此测试点的描述。 此文本将显示在HTML报告中,可以在测试后创建。
- assert_not_equal-检查属性是否不等于指定的值。 该命令的参数:assert_not_equal(第一,第二,msg =“测试点”)
- 第一-要比较的第一项
- 第二-要比较的第二个元素
- msg-此测试点的描述。 此文本将显示在HTML报告中,可以在测试后创建。
这些命令分为3个主要组:操作, 辅助功能和断言 。 您可以使用适当的过滤器(窗口名称正下方的下拉菜单)选择所需的组。
需要图像的团队在单击相应按钮后立即激活屏幕截图录制功能。 例如,要选择要在屏幕上单击的项目,请在AirTest Assistant中选择触摸命令,然后在“设备屏幕”窗口中的活动设备上,圈选要单击的项目。 之后,相应的命令将以图像作为参数出现在主窗口(脚本编辑器)中,在本例中为touch。 结果,自动化过程如下(gif是从AirTest IDE的过时版本记录的):

如果由于某种原因您不想手动创建屏幕截图和/或一般不编写代码,则可以使用自动录制功能。 您可以通过在Airtest Assistant窗口中单击带有菜单组的下拉菜单对面的“摄像机”按钮来激活它。 自动录制是非常准确和方便的事情,但是,它当然不是万能药,也不会取代手动拨号。

值得一提的是还有3个热键-F5(启动脚本),F10(停止正在运行的脚本),Ctrl + L / Cmd + L(基于完成的测试创建报告)。
您可以使用终端(命令行)在没有UI的情况下运行现成的测试。 有关此方面的更多信息,特别是有关运行测试的更多信息,请参见此处 。
在扰流板下面可以找到使用AirTest框架编写的测试摘录的示例!
您的应用程序/游戏中的UI并不完全由唯一的图标,按钮,背面等组成。 此外,可以在一个屏幕上找到周期性地在视觉上相同的元素,例如按钮,滑块等。 在大多数情况下,AirTest将无法识别您需要的元素,并且测试会因错误而失败,或者将选择错误的界面元素以进行进一步操作。
特别是对于此类情况,已经开发了AirTest IDE中已内置的另一个框架。 他是Poco,在一篇文章中对此进行了简要介绍,并简要介绍了Airtest IDE 。 在下一篇文章中,我将详细介绍该框架。
告诉我们您是否已经使用过AirTest IDE,以及您对该工具的看法。 我很乐意在评论中进行讨论!