AirTest IDE和图像识别-基于图像识别的手机游戏自动化测试

上一篇文章中,我们遇到了AirTest IDE ,但以防万一,让我们重复一下:AirTest IDE是由网易开发的,旨在用于“难以自动化”的应用程序,例如游戏。 实际上,它们是开发人员的主要重点,尽管这不会停止将AirTest用于其他任何应用程序。


这项工作是致力于AirTest IDE的系列文章中的第二篇。 您可以在此找到有关AirTest IDE 第一篇概述文章,以及通过此链接撰写的第三篇也是最后一篇针对Poco UI自动化框架的文章。


今天,我将向您介绍两个主要框架之一-AirTest。 AirTest是一个基于图像识别( Image Recognition )原理的UI自动化跨平台框架,据开发人员说,该框架适用于游戏和应用程序。 GitHub上的AirTest项目包含4个项目: AirtestPocoiOS-Tangentmulti-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 Assistant窗口位置

图片


在程序的当前版本中,可以使用“ AirTest助手”窗口中可用的以下命令:


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


使用AirTest(图像识别)编写的自动测试示例

图片


您的应用程序/游戏中的UI并不完全由唯一的图标,按钮,背面等组成。 此外,可以在一个屏幕上找到周期性地在视觉上相同的元素,例如按钮,滑块等。 在大多数情况下,AirTest将无法识别您需要的元素,并且测试会因错误而失败,或者将选择错误的界面元素以进行进一步操作。


具有几个相同元素的窗口的示例

图片


特别是对于此类情况,已经开发了AirTest IDE中已内置的另一个框架。 他是Poco,在一篇文章中对此进行了简要介绍,并简要介绍了Airtest IDE 。 在下一篇文章中,我将详细介绍该框架。


告诉我们您是否已经使用过AirTest IDE,以及您对该工具的看法。 我很乐意在评论中进行讨论!

Source: https://habr.com/ru/post/zh-CN462587/


All Articles