python的ui自动化第三方库poco的简要说明
官网:Airtest Project (netease.com)
教程:Poco快速上手 - Airtest Project Docs (netease.com)
文档:欢迎使用Poco (ポコ) UI自动化框架 — poco 1.0 文档
poco是一种基于UI控件搜索的自动化框架,与airtest不同,它的操作方式与appium相似。
安装
pip install pocoui
官方demo
# coding=utf-8
import time
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
poco('btn_start').click()
time.sleep(1.5)
bash = poco('bash').focus('center')
for star in poco('star'):
star.drag_to(bash)
time.sleep(1)
assert poco('scoreVal').get_text() == "100", "score correct."
poco('btn_back', type='Button').click()
使用指南
Poco在大多数平台中,需要 事先接入Poco-SDK才可正常使用 ,在少数平台(如Android原生APP)可直接使用Poco,目前支持平台如下:
平台 | Airtest | Poco |
---|---|---|
Cocos2dx-js, Cocos2dx-lua | √ | |
Unity3D | √ | |
Native Android APP | √ | 直接使用 |
iOS | √ | |
Egret | √ | |
Other engines | √ | |
WeChat Applet&webview | √ | 参考文档 随着微信更新可能会失效 |
Windows, MacOS | √ | 敬请期待 |
Netease | √ |
在airtest ide中新建脚本,可以在ide中直接编写poco即可,和airtest一样,可以使用录制来加速编写代码效率。但是airtest ide中没有poco的简要说明。
初始化pocoui
这里用Android作为例子,不同的引擎有不同的初始化方式,详情看文档,这里用的最多就是Android,所以只示例了Android。
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True,screenshot_each_action=False)
点击
通过元素name
poco("com.android.systemui:id/mobile_settings_button").click()#.click()为点击,后面会讲到
通过元素text
poco(text="电话").click()
通过坐标
poco().click([0.507,0.013])
长按点击
poco("蓝牙。").long_click()# 默认的长按点击,笔者比较喜欢用这个(因为不用动脑而且不会出现很奇葩的错误)
发送文本
poco("cn.mobile.mms:id/embedded_text_editor").set_text("0000")
滑动页面
滑动页面是通过坐标完成的,在airtest中所有的坐标使用相对坐标,查看坐标的方法为:选项—>设置—>勾选【实时坐标显示】和【相对坐标】。鼠标移动到设备窗口即可查看相对坐标
poco.swipe([0.507,0.013],[0.507,0.575])
poco.swipe("down")
poco.swipe("up")
判断元素是否存在
有些元素是变化的,可能在某个时间段存在,某个时间段又消失了,这个时候我们可以判断元素是否存在
poco("android.widget.TextView").exists
可以配合if,如果元素存在,则执行动作
if(poco("android.widget.TextView").exists):
print("输入框存在,点击");
poco("android.widget.TextView").click()
控件等待
仅等待不报错
可以使用wait
方法,指定时间等待控件出现,再进行点击操作(该方法的返回值是控件本身,所以后面可以紧跟控件操作,比如点击、长按)
# 在10s内等待控件出现,如出现,则进行长按操作
poco(texture="icon").wait(timeout=10).long_click()
等待后不满足则报错
Poco控件还支持另外2个等待事件,wait_for_appearance()
和wait_for_disappearance()
;这两个API可以等待页面上 某1个UI 出现或者消失,等待的超时时间 timeout
默认为120秒,如果在超时时长之内元素没有出现或者消失的话,会报 PocoTargetTimeout
的错误。
# 等待黄色小鱼出现
poco("yellow").wait_for_appearance(timeout=20)
# 等待计分文本控件消失
poco(text="Count:").wait_for_disappearance(timeout=3)
Poco类的等待事件
这里有两个poco类的等待方法:wait_for_any()
和wait_for_all()
。与上述等待事件不同的是,wait_for_any()
和 wait_for_all()
可以给定多个UI对象让其等待。(需要注意这两个方法是Poco类的方法)
wait_for_all()
是在超时时长结束之前,需要 等待所有给定的UI对象都显示出来 ,即一次轮询所有UI,例如等待三个图标都显示之后,再点击返回按钮
poco("wait_ui2").click()
yellow = poco("yellow")
blue = poco("blue")
black = poco("black")
poco.wait_for_all([yellow,blue,black])
poco("btn_back").click()
wait_for_any()
则是在超时时长结束之前,等待任意一个UI显示出来,即一次轮询任何一个给定的UI。
bomb = poco("bomb")
yellow = poco("yellow")
blue = poco("blue")
while True:
fish = poco.wait_for_any([bomb,yellow,blue])
print(fish.get_name())
可以看到,只要页面出出现了等待的任一UI,wait_for_any()
方法都会返回第一个等待到的UI。
遍历元素
通过python的for循环可以 遍历任何序列的项目 ,如一个列表或者字符串。
举个例子,poco("playDragAndDrop").child("star")
得到的就是1个控件序列(包含了5个星星元素), star
代表控件序列中的1个元素。因此通过这个循环,可以遍历了5个星星元素的序列,并把每个星星元素依次拖动到贝壳上:
for star in poco("playDragAndDrop").child("star"):
star.drag_to(poco("bash"))
注意事项
poco源码中会杀死uiautomator的进程