Poco框架(跨平台自动化测试框架)

目录

连接设备

poco方法

执行adb命令

poco.agent

poco.device

元素定位(选择器)

基本选择器

相对选择器

正则匹配

等待

指定元素等待

页面整体等待

元素信息获取

poco.get_*()方法

poco.attr()方法

常用操作

exists()

点击/长按

滚动

滑动

拖拽

序列手势

双指操作

焦点操作

输入


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('')   # 清空内容

猜你喜欢

转载自blog.csdn.net/JBY2020/article/details/132165736