Poco简介
Poco是由AirtestProject团队开发的一款开源自动化测试框架,旨在解决跨平台、跨引擎的UI自动化测试难题。支持Unity3D、Cocos2d-x、Android原生应用、iOS原生应用等多种游戏和应用的UI自动化测试,通过简单的脚本编写,即可实现复杂的用户行为模拟和测试结果验证。Poco框架的核心思想是通过UI检查技术,自动识别和定位UI元素,从而简化测试脚本的编写和维护。
Poco的安装与配置
pip安装
pip install pocoui
此外,为了使用Poco进行UI元素的检查和测试脚本的编写,还需要安装Poco的SDK到目标游戏或应用中。具体集成步骤可以参考Poco的官方文档。
Poco的基本使用
连接设备
在使用Poco进行测试之前,需要先将目标设备(如Android手机)连接到测试主机上,并开启ADB调试模式。连接成功后,即可通过Poco框架与设备进行交互。
初始化Poco实例
根据不同的游戏引擎,需要初始化对应的Poco实例。例如,对于Unity3D引擎的游戏,可以使用UnityPoco
类来初始化Poco实例。
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
对于Android原生应用,可以使用AndroidUiautomationPoco
类。
from poco.drivers.android_uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco()
UI元素的检查与定位
Poco提供了强大的UI检查功能,可以自动识别并列出目标设备上的所有UI元素。这可以通过AirtestIDE或独立的PocoHierarchyViewer工具来实现。在获取到UI元素的层次结构和属性后,即可通过Poco框架提供的API进行元素的定位和操作。
例如,要定位并点击一个名为“btn_start”的按钮,可以使用以下代码:
poco('btn_start').click()
元素的操作与验证
Poco支持多种UI元素的操作,如点击、拖拽、滑动等。同时,还可以对操作结果进行验证,以确保测试的准确性。
如:定位一个按钮并点击它,然后验证一个文本元素的内容:
# 定位并点击“btn_start”按钮
poco('btn_start').click()
time.sleep(1.5)
# 验证“scoreVal”文本元素的内容是否为“100”
assert poco('scoreVal').get_text() == "100", "Score is not correct."
Poco的高级功能
相对选择器
当UI元素之间存在复杂的层次关系或同名元素时,可以使用相对选择器来精确定位目标元素。相对选择器通过指定父元素和子元素的层次关系来定位目标元素。
例如,要定位一个名为“item”的子元素,其父元素为名为“list_item”的元素:
items = poco('main_node').child('list_item').offspring('item')
for item in items:
print(item.child('material_name').get_text())
坐标系统
Poco支持两种坐标系统:归一化坐标系统和局部坐标系统。归一化坐标系统以设备屏幕的左上角为原点,将屏幕的宽度和高度作为1个单位长度。局部坐标系统则以某个UI元素的左上角为原点,将该元素的宽度和高度作为1个单位长度。
例如,要使用归一化坐标系统在屏幕中心点击:
poco.click(0.5, 0.5)
而要使用局部坐标系统在某个UI元素的中心点击,则需要先定位该元素,然后调用focus
方法设置焦点,再进行点击操作:
poco('bg_mission').focus('center').click()
全局操作
Poco还支持在没有选中任何UI元素的情况下进行全局操作,如点击屏幕中心、长按、滑动等。这些操作对于模拟用户的全局交互行为非常有用。
例如,要在屏幕中心点击并长按3秒:
poco.long_click(0.5, 0.5, duration=3)
Poco的实践案例
以下是一个完整的测试脚本示例,演示了如何使用Poco框架对一个简单的游戏进行自动化测试。该游戏包含一个启动按钮、一个得分文本元素和多个可拖拽的星星元素。
import time
from poco.drivers.unity3d import UnityPoco
# 初始化Poco实例
poco = UnityPoco()
# 定位并点击启动按钮
poco('btn_start').click()
time.sleep(2)
# 拖拽星星到指定位置
star = poco('star')[0] # 假设只有一个星星元素
target = poco('shell') # 目标位置
star.drag_to(target)
time.sleep(1)
# 验证得分是否正确
assert poco('scoreVal').get_text() == "100", "Score is not correct after dragging star."
# 点击返回按钮结束测试
poco('btn_back').click()
更多内容
GitHub:https://github.com/AirtestProject/Poco
官方文档:https://poco-chinese.readthedocs.io/en/latest/