Poco基于UI控件搜索原理 ,适用于Android、iOS原生和各种主流的游戏引擎应用。
中文官方文档:欢迎使用Poco (ポコ) UI自动化框架 — poco 1.0 文档
参考文档: Poco介绍 - Airtest Project Docs
环境准备
安装库:pip install pocoui 、 pip install airtest
IDE选用:官网下载地址Airtest Project
连接设备
# 1、指定连接设备
from airtest.core.android import Android
from poco.drivers.android.uiautomation import AndroidUiautomationPoco # 导入Poco 库
dev1 = Android() # 指定连接的手机设备,指定参数为设备序列号,为空时默认连接获取到的第一台设备
poco = AndroidUiautomationPoco(dev1, screenshot_each_action=False) # 实例化设备对象
# 2、连接默认设备
# from airtest.core.api import *
# from airtest.cli.parser import cli_setup
# from poco.drivers.android.uiautomation import AndroidUiautomationPoco
# poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
poco方法
执行adb命令
连接设备进行adb命令等操作,支持所有的adb操作
print(poco.get_screen_size())
print(poco.adb_client.devices()) # 打印连接设备序列号
print(poco.adb_client.get_device_info()) # 打印设备信息
print(poco.adb_client.shell('ls')) # 执行adb命令
print(poco.adb_client.get_ip_address()) # 获取设备IP
poco.agent
print(poco.agent.screen.getPortSize()) # 屏幕分辨率
poco.device
print(poco.device.get_ip_address()) # 获取ip 地址
print(poco.device.list_app()) # 获取安装包
元素定位(选择器)
基本选择器
在poco实例后加一对括号,括号里的参数就是所给定的条件,用属性名值对表示,其中第一个参数表示节点名,后面还可以跟着一些可选参数,均表示节点的属性及预期的属性值
print(poco("android.view.View",text = "请输入密码").get_text())
相对选择器
通过元素之间的渲染层级关系进行选择
poco("android.view.View").children() # 获取所有的子元素
poco("android.view.View").child("android.view.View", text='暂无公告') # 当前节点的子元素,可根据指定参数获取符合条件的子元素,没有参数时和children功能相同
poco("android.view.View").offspring("android.view.View", textMatches='.*?密码.*?') # offspring从查询表达式给出的UI元素中选择包含直接子元素(ren)的子元素
poco(nameMatches="退出登录").parent() # 从查询表达式给出的UI元素中选择直接子元素(ren),如果要获取更上层父节点的话,需要在对象后添加继续添加parent()参数
poco(nameMatches="退出登录").sibling() # 从查询表达式给出的UI元素中选择同级元素
正则匹配
支持正则匹配nameMatches、textMatches、typeMatches等(使用xxMatches)
for i in poco(textMatches='.*?密码.*?'):
print(i.get_text())
等待
指定元素等待
obj1, obj2, obj3 = poco(text='微信'), poco(text='小红书'), poco(text='日历')
obj = poco(text='微信')
obj.wait(timeout=2).exists() # 超时时间内查找元素,返回布尔值,可以通过这个方法等待确定元素出现进行下一步操作
obj.wait_for_appearance(timeout=2) # 等待元素出现(阻塞并等待,直到UI元素在给定的超时内出现)
obj.wait_for_disappearance(timeout=2) # 等待元素消失
页面整体等待
poco.wait_stable() # 休眠固定的秒数,以便等待UI变得静止(稳定),不需要手动调用此方法,它在需要时自动调用
poco.wait_for_any([obj1, obj2, obj3], timeout=2) # 等待指定的任意一个元素出现
poco.wait_for_all([obj1, obj2, obj3], timeout=3) # 等待所有元素出现
元素信息获取
poco.get_*()方法
print(poco(text='微信').get_text()) # 元素文本内容,微信
print(poco(text='微信').get_size()) # 精准大小,[0.22395833333333334, 0.1259018759018759]
print(poco(text='微信').get_position()) # 相对于屏幕的相对位置,[0.8355654761904762, 0.6486291486291487]
print(poco(text='微信').get_name()) # 元素名称,微信
print(poco(
text='微信').get_bounds()) # 元素界限,[0.5856782106782107, 0.9475446428571429, 0.7115800865800865, 0.7235863095238095]
poco.attr()方法
print(poco(textMatches='.*?密码.*?').attr('name')) # UI元素的名称
print(poco(textMatches='.*?密码.*?').attr('text')) # UI元素的字符串值
print(poco(textMatches='.*?密码.*?').attr('size')) # UI元素大小
print(poco(textMatches='.*?密码.*?').attr('type')) # UI元素的类型名
print(poco(textMatches='.*?密码.*?').attr('visible')) # UI元素是否可见
print(poco(textMatches='.*?密码.*?').attr('pos')) # UI元素相对屏幕位置
常用操作
exists()
检测定位元素是否在测试UI元素层次结构中,相当于attr('visible'),可以通过此判断决定是否进行某些操作【返回布尔值,可以通过这个方法等待确定元素出现进行下一步操作】。配合wait使用更好,见等待方法。
点击/长按
poco("登录").click() # 点击选择的对象
poco.click([0.5, 0.5]) # 点击某个点
poco(text='请填写手机号').long_click() # 长按某个选中的元素对象,默认长按持续时间为2s
poco.long_click([0.5, 0.5]) # 长按某个点
滚动
参数:
direction滑动的方向:vertical(垂直)、horizontal(水平)。
percent滑动的百分比(滑动的幅度),参数(0,1)垂直方向上滑动,水平方向左滑动,参数(-1,0)垂直方向下滑动,水平方向右滑动。
duration滑动操作的持续时间。
poco.scroll(direction='horizontal', duration=3, percent=-0.5)
滑动
poco(text='微信').swipe(direction='left', duration=.3) # 通过指定方向(direction参数)指定要滑动的位置:‘up’, ‘down’, ‘left’, ‘right’
poco('微信').swipe([0.4, 0.8], duration=3) # 通过坐标选择目标移动的终止位置
拖拽
参数(目标位置target,持续时间duration),这个方法不好用,通过测试发现只有垂直移动才好用。
poco(text='微信').drag_to([0.5, 0.5], duration=2)
poco(text='微信').drag_to(poco(text='企业微信'), duration=.5)
序列手势
比drag_to好用的多。方法:start_gesture手势开始,相当于按下的手势,hold为按下持续的时间,to为要移动到的目标位置,可以是对象元素也可以是坐标,up为执行完成松开的手势。
poco('微信').start_gesture().hold(0.5).to(poco(text='小红书')).hold(5).to(poco(text='企业微信')).hold(.5).to(
[0.5, .75]).hold(1).up() # 拖动微信图标移动
poco('微信').start_gesture().hold(3).up() # 模拟长按微信图标3秒
双指操作
参数:dead_zone缩放内半径,不能大于percent
poco(name='android.view.View').pinch(direction='in', percent=0.6, duration=2.0, dead_zone=0.1)
焦点操作
选择元素焦点操作位置:'center' or 'anchor'or point(x,y)
poco(text='微信').focus('center').click() # focus局部定位
# 可模拟滑动效果
obj1 = poco(text='移动网络')
obj2 = poco(text='显示和亮度')
obj1.focus('center').drag_to(obj2.focus('center'))
输入
poco(textMatches='.*?输入用户名.*?').set_text('1890010002') # 输入
poco(textMatches='.*?输入用户名.*?').set_text('') # 清空内容