Poco-AirTest IDE的一部分,用于移动游戏的基于Python的UI自动化

今天,我们将讨论第二个主要的UI自动化框架Poco。 Poco使用Python,在这里您必须编写代码,但首先让我们看看它的用途,何时值得访问以及它的外观。


本文是AirTest IDE系列的最后部分。 可以在此链接上找到第一个概述工作,而第二个可以在这里找到有关图像识别框架的文章。


Poco是一个游戏自动化UI框架,它使用Python作为AirTest IDE的一部分,并能够将功能与其图像识别框架(AirTest)结合在一起。 值得一提的是,AirTest IDE支持其他语言(JS,Lua,C#,Java),但更多示例将在Python中进行,例如 该语言被认为是主要语言。


交互的主要元素如下:


图片


据了解,Poco将在AirTest无法应对的地方使用,但是,正如开发人员自己注意到的那样,您可以仅使用Poco编写所有测试,并且它们的运行速度会更高,但是那么您至少需要了解Python。


Poco-SDK与游戏的了解和联系


要开始使用Poco,您需要熟悉poco-sdk集成指南从相应页面安装所需的驱动程序。 当前支持以下游戏引擎: Unity3DAndroid本机应用程序OSX应用程序Windows应用程序cocs2dx-luacocs2dx-jsEgretNetEase内部引擎 。 开发人员还提供了创建自己的驱动程序的机会,并提供了描述此功能的文档- 实施指南 。 官方文档中提到了虚幻引擎,但是大多数虚幻引擎与“即将推出...”一词并驾齐驱,因此您无法确定何时会出现它的支持。
在熟悉了一般信息和进一步的步骤之后,您需要下载所需的驱动程序,将其解压缩后放入项目文件夹并连接Poco Manager脚本。 例如,对于Unity,建议将Poco Manager作为脚本添加到主场景的主要对象之一(尤其是主摄像机)中。 之后,您需要编译游戏并在AirTest IDE支持的设备和操作系统上运行它。


将游戏连接到AirTest IDE并进行首次测试


为了简化和进一步解释,我将使用该示例与由AirTest IDE开发人员提供的Unity编写的官方演示游戏一起使用。 有2个选项: WindowsAndroid ,但我将重点介绍Windows版本。 顺便说一句,最好使用Windows 7,因为 在Windows 10上,我检测到奇怪的脚本行为,尤其是在使用某些命令时屏幕上元素的位置不正确。 相同的代码在Windows 10和7上均无法正常工作。我们将等待,直到以后的更新中修复了此烦人的疏忽。


图片


打开演示游戏,然后等待启动屏幕加载。 打开AirTest IDE。 在工作布局右侧的“设备”窗口中,使用“ Windows应用程序连接”部分中的“搜索窗口”按钮选择游戏窗口。 游戏窗口将“集成”到面板中并扩展以适合游戏窗口的大小。 在这里,我们面临第一个问题-无法调整窗口大小以适合我们。 如果面板大小可以更改,则它是微不足道的,并且取决于游戏窗口的大小。 例如,在纵向模式下使用移动设备时,我没有遇到这样的问题。


连接游戏后,您需要让AirTest IDE知道您将使用Poco与特定的游戏引擎一起工作。 为此,请使用屏幕左下角的Poco Assistant窗口(如果不存在,请使用Windows->默认布局将所有面板恢复为默认设置),然后在下拉列表中选择所需的游戏引擎,例如Unity。 好吧,最后一点就是同意通过单击出现的黄色栏中的“是”按钮将所有必需的代码添加到脚本编辑器。 如果前面的所有步骤都成功,那么在Poco Assistant窗口中,将显示应用程序当前屏幕的UI元素的分层树。 Poco Assistant的此部分称为“ 层次结构查看器”(UI Unspector) ,它仅显示屏幕上当前那些元素的列表。 如果屏幕上有任何更改(例如,某些事件(事件)后新元素的外观),则此列表会自动更新。


扰流板上的上述步骤的示例。


在AirTest IDE中连接游戏的示例

图片


要与屏幕上的任何元素进行交互,您需要知道其UI路径代码。 为此,只需在Poco Assistant中双击该对象或单击鼠标右键并选择适当的项目。 代码将显示在“脚本编辑器”窗口中,以访问选定的元素,您只需要添加通过该点的交互方式(功能)。


Poco Assistant中的项目填充列表示例

图片


例如,如果您需要单击在层次结构中指定为“ btn_start”的按钮,则单击将需要类似此代码的内容。


poco("btn_start").click() 

即 基于演示游戏的最简单的测试,它会检查“开始”和“返回”主屏幕(从GlobalControl部分)的按钮是否按下


 # -*- encoding=utf8 -*- __author__ = "authorName" from airtest.core.api import * auto_setup(__file__) from poco.drivers.unity3d import UnityPoco poco = UnityPoco() poco("btn_start").click() poco("btn_back").click() 

实际上发生了什么:程序找到代码中指示的元素,并在屏幕上找到其位置后执行所需的功能。 所有这些操作和必要的数据(例如,对象的位置,单击对象的次数等)都可以在报告中找到,并且可以使用键盘快捷键Ctrl + L创建报告本身。 请注意,按钮的名称/地址是根据它们在当前屏幕上的存在计算得出的。


在扰流板下面可以看到最新版本的AirTest IDE(1.2.2)中的外观。


在Poco中发现和使用按钮

检测并单击开始按钮


检测并单击新屏幕上的“后退”按钮


项目类型


我没有找到描述元素类型的文档,因此在使用后我将分享我的观察和评论。 之后,我将给出一个示例,说明如何访问特定元素并保留指向文档链接,该文档包含许多次更详细的信息。


将基于演示游戏的屏幕之一给出元素的示例。


图片


本示例包含以下元素:


  • 文字 -此屏幕包含3种文字 。 实例将隐藏在扰流板下。

标题示例

图片


占位符示例

图片


元素上的文本(按钮)

图片


  • 在上面的示例中, 图像为星状。

图片范例

图片


  • 输入字段-本例中为文本输入字段

InputField示例

图片


  • 该按钮在我们的示例中是“后退”按钮,但在扰流板下方将有另一个按钮的示例,因为 背面无法完全适合内置屏幕

按钮示例

图片


  • 节点 -不确定如何描述它,但实际上,它是元素的容器。

节点示例

图片


上面示例中所有元素的展开树如下
图片


还有更多关于编码的信息


目前,AirTest IDE提供了34个团队与元素进行交互。 在交互元素之后输入点后,它们的列表将自动显示在弹出窗口中。 由于某种原因,我不明白,可以针对任何类型的元素调用所有命令。 这是否意味着所有命令都可以用于所有类型的元素?我还不知道,还没有办法检查。 为方便起见,可以在扰流板下查看当前列表。


与Poco中的元素进行交互的功能列表
 add_post_action_callback add_pre_action_callback agent click freeze get_screen_size long_click sleep_for_polling_interval snapshot wait_for_all swipe wait_for_any wait_stableattr child children click (   ,     ) drag_to exists focus get_bounds get_name get_position get_size get_text invalidate nodes offspring set_text setattr sibling swipe (   ,     ) wait wait_for_appearance wait_for_disappearance 

强烈建议在此处使用变量,甚至可以避免某些问题。 稍后,只需指定变量名称即可访问元素。 在下面,您可以找到一些将元素保存到变量并对其进行访问的示例:


图片变量
 star = poco("star_single") if star.exists(): pos = star.get_position() 

输入对象变量
 input_field = poco("pos_input") time.sleep(1) input_field.set_text('x={:.02f}, y={:.02f}'.format(*pos)) time.sleep(3) 

按钮变量
 title = poco('title').get_text() if title == "Basic test": back = poco('btn_back', type='Button') back.click() back.click() 

我在上面提到变量可以为您节省一些麻烦。 特别是,我在演示游戏的拖放模块中遇到了一个问题。 它包含5个星星(图片),玩家的任务是将它们转移到位于星星行下方的外壳中。 值得一提的是,当您直接访问“星形”元素数组时会出现问题:将元素拖动到所需位置后,它就会消失。 AirTest IDE仅考虑可见元素,因此,在转移的恒星变得不可见之后,代码无法直接访问它。 如果您直接访问星星数组,它将被重新初始化,因为 其中的元素数量已更改。 即 以下条目不会将所有5个元素都传输到外壳


 poco("playDragAndDrop").child("star")[0].drag_to(poco("shell")) poco("playDragAndDrop").child("star")[1].drag_to(poco("shell")) poco("playDragAndDrop").child("star")[2].drag_to(poco("shell")) poco("playDragAndDrop").child("star")[3].drag_to(poco("shell")) poco("playDragAndDrop").child("star")[4].drag_to(poco("shell")) 

将数组的初始化存储在变量中将帮助您避免在每次更改其可见元素的数量后重新初始化数组。 在这种情况下,对其元素的吸引力将如下所示:


 stars = poco("playDragAndDrop").child("star") stars[0].drag_to(poco("shell")) stars[1].drag_to(poco("shell")) 

因此,您还可以将shell元素的位置存储在单独的变量中,以免每次都不能直接访问它。


结果如何?


AirTest IDE是一套功能相当强大的工具,用于在Windows和移动OS上的游戏和其他复杂系统中测试UI。 在大多数情况下,对必需元素的检测可以正常工作,具有从头开始编写测试的能力,支持多种编程语言,报告中有关测试运行结果的相当详细的信息(可以使用IDE本身来创建)以及免费的工具集(我提醒您AirTest IDE是一个开放源代码应用程序)-所有这些都由AirTest IDE掌控,并且是至少尝试并至少将此工具实现到自动化系统中的充分理由。 应该记住的是,尽管AirTest旨在测试游戏,但并非旨在使游戏玩法自动化。 Airtest IDE在“静态”事物方面做得非常出色,例如,在屏幕上查找某些元素,使用UI元素(例如,在游戏商店购物)等。 该IDE可以完美地完成这些任务,并且建议您以较低的入门门槛对您的应用程序进行相当简单可靠的应用程序自动化!


您可以在Poco示例和教程部分的官方开发人员页面上从网易找到有关用法,基于演示游戏的示例以及游戏本身的更多信息。


如果您已经具有使用AirTest IDE的经验,那么最好在注释中分享它,并且如果发现错误,则可以在相应页面上留下他们的错误报告!

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


All Articles