Poco框架(跨平台自动化测试框架)
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() # 长按某个选中的元素对象,默认长按持续时间为2spoco.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('') # 清空内容相关文章:
Poco框架(跨平台自动化测试框架)
Poco基于UI控件搜索原理 ,适用于Android、iOS原生和各种主流的游戏引擎应用。 中文官方文档:欢迎使用Poco (ポコ) UI自动化框架 — poco 1.0 文档 参考文档: Poco介绍 - Airtest Project Docs 环境准备 安装库:pip install po…...
使用RANSAC算法在点云中拟合原始3D形状:pyRANSAC-3D的介绍和应用
随机样本共识(RANSAC)是一种强大的算法,用于从数据集中估计数学模型的参数,特别是在数据包含大量异常值时。在3D计算机视觉中,RANSAC常用于从点云数据中拟合原始形状,例如平面、长方体和圆柱体。本文将介绍一个名为pyRANSAC-3D的开源库,它提供了RANSAC算法的Python实现,…...
GPT-3.5 人工智能还是人工智障?——西红柿炒钢丝球!!
人工智能还是人工智障?——西红柿炒钢丝球 西红柿炒钢丝球的 基本信息西红柿炒钢丝球的 详细制作方法材料步骤 备注幕后花絮。。。。。。。。。关于GPT-3.5,你的看法: 西红柿炒钢丝球的 基本信息 西红柿炒钢丝球是一道具有悠久历史的传统中式…...
移动技术相关基本概念
信息网络隔离装置 一种能够保障企业信息网络安全的高级网络设备,主要作用是隔离内外网,阻隔外界攻击,保护企业网络不遭受黑客攻击、木马病毒入侵、信息泄露等安全威胁。同时还能对企业内部的流量进行监视,保护企业敏感数据不被内…...
数学建模—分类模型
本讲将介绍分类模型。对于而分类模型,我们将介绍逻辑回归(logistic regression)和Fisher线性判别分析两种分类算法;对于多分类模型,我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤下。 本题按水…...
腾讯云SA3服务器AMD处理器CPU网络带宽性能详解
腾讯云AMD服务器SA3实例CPU采用2.55GHz主频的AMD EPYCTM Milan处理器,睿频3.5GHz,搭载最新一代八通道DDR4,内存计算性能稳定,默认网络优化,最高内网收发能力达1900万pps,最高内网带宽可支持100Gbps。腾讯云…...
Vue组件之间的传值汇总
组件之间的传值 1、父传子 props 2、父传子 slot 3、父传子 不建议用 attrs 4、 子传父 ref 5、子传父 emit 6、povide/inject只能在setup的时候用。 7、利用vuex和pinia去实现数据的交互 1、实现代码App.vue <script setup>import TestProps from ./components/T…...
Cadence OrCAD Capture CIS批量替换GND符号的方法
🏡《总目录》 🏡《宝典目录》 目录 1,概述2,方法3,总结1,概述 如下图所示,有时由于绘图是从多个地方复制粘贴而来,一个图纸中会存在多种GND符号。此时比较容易引起GND网络名不同意的问题,为了避免该问题可对其批量替换。 2,方法 第1步:选择需要替换的GND符号…...
图像的转置之c++实现(qt + 不调包)
1.基本原理 图像的转置就是将图像的横坐标和纵坐标交换位置,和矩阵的转置是一样的,公式见下: 2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解) /*图像的转置函…...
qt中cmake自动处理ui文件的前提
说明:个人理解,未必正确 参考了下面的网址 http://cn.voidcc.com/question/p-wpcanvtj-tn.html http://cn.voidcc.com/question/p-wpcanvtj-tn.html cmake中将set(CMAKE_AUTOUIC ON)打开 set(CMAKE_AUTOUIC ON) # 自动处理ui文件, 自动处理ui文件是有…...
python接口自动化之使用requests库发送http请求
requests库 什么是Requests ?Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。 安装:cm…...
flink kafka消费者如何处理kafka主题的rebalance
背景: 我们日常使用kafka客户端消费kafka主题的消息时,当消费者退出/加入消费者组,kafka主题分区数有变等事件发生时,都会导致rebalance的发生,此时一般情况下,如果我们不自己处理offset,我们不…...
【Spring】基于xml文件和注解方式的自动装配
自动装配:根据指定的策略,在IOC容器中匹配某个bean,自动为bean中的类类型属性或接口类型的属性赋值,可以通过bean标签中的autowire属性设置自动装配的策略。 一、基于xml文件 一个类型的bean在IOC容器中只出现一次,默…...
ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)
GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…...
『赠书活动 | 第十七期』《Python网络爬虫:从入门到实战》
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第十七期』 本期书籍:《Python网络爬虫:从入门到实战》 赠书规则:评论区:点赞|收…...
C++——vector介绍及其简要模拟实现
vector的介绍 此主题介绍转载自(https://cplusplus.com/reference/vector/vector/) 1.vector是一个表示可变大小数组的序列容器 2.vector同数组一样,采用连续存储空间来存储元素,这样可以用下标来对vector中的元素进行访问,但是vector的大…...
Vue2嵌入HTML页面空白、互相传参、延迟加载等问题解决方案
一、需求分析 最近做的一个用H5加原生开发的html项目,现需要集成到Vue2.0项目里面来。遇到的相关问题做个记录和总结,以便能帮到大家避免踩坑。 二、问题记录 1、页面空白问题 将html页面通过iframe的方式嵌入进来之后,发现页面是空白的&am…...
目标检测中的IOU
IOU 什么是IOU?IOU应用场景写代码调试什么是IOU? 简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为: 这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住…...
微信小程序实现双向滑动快捷选择价格(价格区间)
实现样子 提示:效果可以自己自定义,自己将文字样式更改为自己项目属性即可 实现达到方法 1、左边为最低价,右边为最高价格,可以拖动左边最低价选择价格。拖动右边为最高价。 2、当两个价格重合时,继续拖动࿰…...
W5500-EVB-PICO 做TCP Server进行回环测试(六)
前言 上一章我们用W5500-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试,那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么?什么是TCP Server?能干什么? TCP (Transmission Control Protocol) 是一种面向连…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
