Airtest poco 入门小结

news2024/11/25 6:30:09

目录

一、poco介绍

1、poco能做什么

2、三种定位方式

1)基本选择器

2)相对选择器

3)空间顺序选择器

4)正则表达式方式

3、poco支持平台

二、Airtest介绍

1、Airtest能做什么

2、Airtest不能做什么

3、Airtest的图像识别算法介绍

1)算法简介

2)修改Airtest使用的图像识别算法:

3)如何提高图像脚本的兼容性


一、poco介绍

1、poco能做什么

Poco可以获取控件的属性信息、操作控件、设置控件的text属性等等,但是连接设备、断言等操作,还需要依赖于Airtest的API,所以我们大多数情况下,都需要混合使用Airtest和Poco框架来编写我们的自动化脚本。

poco官方文档:https://poco.readthedocs.io/zh_CN/latest/source/README.html#

https://airtest.doc.io.netease.com/IDEdocs/poco_framework/1_poco_info/

Poco api :poco.pocofw module ‒ poco 1.0 文档

安装poco :

pip install pocoui

2、三种定位方式

Poco控件最基本的3种定位选择器分别是:

  • 基本选择器
  • 相对选择器
  • 空间顺序选择器

1)基本选择器

用节点的属性和属性值去定位元素。

# 第一个参数是 name,可以省略对应的key

poco("star_single",type="Image")

2)相对选择器

通过元素之间的渲染层级关系进行选择,例如父子关系、兄弟关系、祖先后代关系等等。

poco("plays").child("playBasic").offspring("star_single")
  • 子节点:child
  • 所有子节点:children
  • 子孙节点:offspring
  • 父节点:parent
  • 兄弟节点:sibling

3)空间顺序选择器

利用索引顺序选中单个元素。

name0 = poco("Content").child(type="Text")[0].get_name()

name1 = poco("Content").child(type="Text")[1].get_name()

name2 = poco("Content").child(type="Text")[2].get_name()

4)正则表达式方式

 

上面是淘宝APP的icon控件,利用基本选择器,可以使用类似 poco(text="手机淘宝") 这样的方式来定位到这个淘宝的icon控件。

换成正则表达式来匹配这个控件的话,可以使用如下方式来进行匹配:

poco(textMatches="能匹配到手机淘宝的正则表达式")

例如 .*淘宝 ,这个就是能匹配到“手机淘宝”的1个正则表达式,所以点击手机淘宝icon控件的语句可以写成如下的形式:

poco(textMatches=".*淘宝").click()

同理可以使用 nameMatches 来匹配控件的name属性:

利用基本选择器定位图中控件,定位脚本如下:

poco(name="com.netease.cloudmusic:id/portalTitle",text="每日推荐")

换成正则表达式的匹配方式,则可以这么实现:

poco(nameMatches=".*portalTitle",textMatches=".*推荐")

PS:在编写层次特别深的一些定位脚本时,使用正则表达式来匹配,会非常简洁高效:

 如果使用之前介绍的定位方式,脚本可能如下:

for i in poco("com.netease.cloudmusic:id/pagerListview").child("com.netease.cloudmusic:id/musicListItemContainer"):
    info = i.child("com.netease.cloudmusic:id/songNameAndInfoArea").offspring("com.netease.cloudmusic:id/songInfo")
    print(info.get_text())

利用基本选择器和相对选择器写出来的定位脚本,看起来非常繁琐,而且还需要非常 精确地了解其中的层级关系 ,否则定位脚本就很容易出错。

换成正则表达式的定位方式:仔细观察UI树发现,这些歌曲信息的控件名都是一样的,所以只要写1个正则表达式,匹配到这一批相同的控件名,就相当于定位到了当前页面所有的歌曲信息控件,接下来就可以利用poco遍历,逐一获取控件的text属性了:

for i in poco(nameMatches="com.*?songInfo"):
    print(i.get_text())

不推荐的poco定位方式

通常不推荐使用相对选择器控件顺序选择器进行定位,因为复杂的层级关系加上空间索引顺序,很容易出现运行效率差,或者因为索引值变化而导致出现找不到控件的问题。

除非是必要情况,一般不要选择这种定位方式。

推荐的poco定位方式

非常推荐多使用基本选择器正则匹配表达式来定位控件

3、poco支持平台

Poco在大多数平台中,需要 事先接入Poco-SDK才可正常使用 ,在少数平台(如Android原生APP、iOS原生APP)可直接使用Poco,目前支持平台如下:

 

二、Airtest介绍

Airtest是一款跨平台的UI自动化测试框架,基于 图像识别原理 。本质上是Python的一个第三方库

官方文档:https://airtest.readthedocs.io/zh_CN/latest/

pip安装:

pip install airtest -i https://mirrors.aliyun.com/pypi/simple/
  • Airtest支持的Python版本: 3.0≤Python≤3.9

1、Airtest能做什么

  • 连接上待测设备
  • 对待测设备实施模拟操作

点击、滑动、截图、输入文本、等待、断言。。。。

  • 生成运行报告

Airtest支持生成HTML格式的测试报告,方便查看详细的步骤运行情况。

2、Airtest不能做什么

  • Airtest能做接口测试吗?

不能,Airtest是一个UI测试框架,与接口测试框架不一样。

  • Airtest能进行找色吗?

不能,Airtest基于各种图像识别原理,与找色工具有一定差别,目前Airtest不包含找色功能。

  • Airtest能获取图片的文字吗?

不能,Airtest非OCR工具,不能识别出来图片里面是什么文字,它只能对比图片之前的匹配度。但我们可以通过Airtest截图,然后借助其它OCR接口来识别截图里面的文字。

  • Airtest能拿到控件的图片吗?

不能,Airtest非侵入式框架,它不能直接拿到应用里面的控件图片,但是它能对整个画面进行截图或者进行局部截图。

3、Airtest的图像识别算法介绍

1)算法简介

在airtest框架中集成了不同种类的图像识别算法。其中包括模板匹配(也就是上文的TemplateMatching)、以及基于特征点的图像识别方法(包含了上文的SURFMatchingBRISKMatching)。这两种识别方法的特点和区别如下:

模板匹配

无法跨分辨率识别

一定有相对最佳的匹配结果

方法名:"tpl"

特征点匹配

跨分辨率识别

不一定有匹配结果

方法名列表:["kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]

  • 2篇推文:

https://mp.weixin.qq.com/s?__biz=MzUxMDc4NTkwMA==&mid=2247484068&idx=1&sn=8037c1ddec46ec26f2a8eff8b2252d2d&chksm=f97ce2a7ce0b6bb1512451367dceb85eca1073050fb9c3ce06503ebc9db8f10c2f8efc0d1506&token=1051694015&lang=zh_CN#rd

https://mp.weixin.qq.com/s?__biz=MzUxMDc4NTkwMA==&mid=2247486213&idx=1&sn=f0effedd8dcff9aa9e5950debcbceaf4&chksm=f97ceb06ce0b621082049db44ef0e3f4265ae7f7137c4d1a466313d9e3ff65d8e2b5f9a90dcd&token=1051694015&lang=zh_CN#rd

2)修改Airtest使用的图像识别算法:

from airtest.core.settings import Settings as ST
# 调整Airtest图像识别算法的使用顺序
ST.CVSTRATEGY = ["mstpl","tpl", "sift","brisk"]
# 指定仅使用mstpl算法
ST.CVSTRATEGY = ["mstpl"]

3)如何提高图像脚本的兼容性

  • 截取图标时尽量不要截入过多的背景内容

如下图,选择第一种截图,而不是混入了过多背景的第二种截图:

 

  • 尽量减少截取纯文字的图像

Airtest图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字容易导致识别成功率较低,尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容。

 

  • 合理调整阙值

举个例子,某个截图默认阙值为0.7,但是多次运行之后发现,有一定概率会识别到错误结果。这时候不妨将阙值调高一点试试,看看能不能提高正确识别的概率,如果可以,说明阙值调整是有效的。

修改Template的参数threshold:

touch(Template(r"tpl1598952570968.png", threshold=0.8, record_pos=(-0.021, 0.121), resolution=(900.0, 1600.0)))

设置全局的threshold(只适用于除断言语句之外的截图语句):

from airtest.core.setting import Settings as ST
ST.THRESHOLD = 0.7 # 其他语句的默认阈值

断言语句的阙值设置

from airtest.core.setting import Settings as ST
ST.THRESHOLD_STRICT = 0.7

在断言语句的截图中,双击进入图片编辑器,再修改里面的 threshold ,最终也是不会生效的,只能通过上述方式设置。

  • 开启RGB彩色识别

在识别图像时,Airtest会先将图像转为灰度图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。如下图,如果仅截图第二个红色的【删除】按钮,Airtest会把另外俩个灰黑色的【删除】按钮认为是相同的。

 通过勾选rgb选项(双击图片打开图片管理器勾选),或在代码中加入rgb=True,可以强制指定使用彩色图像进行识别。这样就能比较好地识别出那个红色的【删除】按钮了。

touch(Template(r"tpl1637052349130.png", rgb=True, record_pos=(-0.38, -0.11), resolution=(850, 909)))
  • 巧用target_pos点击截图的不同位置

 

修改target_pos 参数:

touch(Template(r"tpl1598948415043.png", target_pos=6, record_pos=(-0.434, -0.773), resolution=(900, 1600)))

例如,我们的需求是点击中间那个按钮的,仅仅依靠截1个播放按钮来做识别,是很难保证具体识别到三个按钮中的具体哪个按钮的。

 

此时可以有2种截图方式来实现:

一种是在竖着的方向上,扩大截图范围,让中间那个按钮处于 target_pos=5 的位置上:

 

另一种是在横着的方向上,扩大截图范围把左侧的歌曲介绍也一起截图了,让中间那个按钮处于 target_pos=6 的位置上:

 

这2种方式都可以确保点到的是中间那个按钮(假设列表歌曲不变的情况下)。

所以,当精准截图(仅截取某个按钮/图标)不能满足唯一定位时,可以考虑加大截图范围,增加更多的特征点,确保截图定位的准确性。

  • 切勿过度依赖录制功能
  • 指定游戏的分辨率适配规则
  • 自定义语句提高图像脚本兼容性
  • 巧用坐标进行点击/滑动
  • 巧用keyevent("BACK")替代返回的截图脚本
  • 画面切换的时候,可以多使用wait或者sleep,再进行点击操作
  • 打开应用尽量使用start_app而不是截图脚本
  • 如果可以用poco框架,还可以用poco语句代替截图脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发挥数字化平台优势,电子元器件采购商城系统助力企业改变固有低效流程

我国是全球最大的电子元器件生产国,电子元器件在国民经济发展中占据着重要地位。近年来,随着数字经济的快速发展,电子元器件的需求量也在不断升高,但疫情与国际环境对电子元器件产业要素流通仍然造成了一定困扰。在此背景下&#…

win10系统下使用onnxruntime部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、mainwindow.h3、mainwindow.cpp四、YOLO 类封装1、yolov5.h2、yolov5.cpp3、class.names五、效果前言 上一篇介绍过使用opencv-dnn模块实现模型推理部署,但视频效果较差,本篇…

ps2023最新版免费滤镜插件Exposure安装下载教程

滤镜插件是ps的重要功能之一,它主要是用来制作不同的图片特效。那么,ps滤镜插件哪些好用,ps滤镜插件如何获取,下面我们一起来学习这些内容。 ps滤镜插件是比较多的,下面对几款常见的ps滤镜插件进行讲解,看…

TIA博途中的TRACE功能具体使用方法示例

TIA博途中的TRACE功能具体使用方法示例 我们可以利用TRACE曲线来监控程序、排查故障,那么具体怎样使用呢,可以参考以下内容。 如下图所示,打开TIA博途,新建项目后,在左侧项目树中可以看到TRACES, 如下图所示,双击添加新轨迹,然后在右侧窗口中,添加需要监视的信号,…

TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的技术

TOUGH2系列软件是由美国劳伦斯伯克利实验室开发的,旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同,TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法,通过配合不同EOS模块,软件…

【矩阵论】3. 矩阵函数——矩阵函数求导

3.6 矩阵函数求导 3.6.1 积分与求导定义 设 mnm\times nmn 阶矩阵 A(x)(aij(x))mnA(x)\left(a_{ij}(x)\right)_{m\times n}A(x)(aij​(x))mn​ 中的元素都是 x 的可导函数,则 A(x)A(x)A(x) 为关于 xxx 的求导为: A′(A)dA(x)dx(daij(x)dx)mnA(A)\frac{…

正点原子stm32F407学习笔记5——串口通信实验

一、串口通信实验1 上位机给开发板发送数据,开发板将收到的数据发回给上位机 串口设置的一般步骤可以总结为如下几个步骤: 串口时钟使能,GPIO 时钟使能。设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。GPIO 初始化设置&#…

数据库性能翻3倍:Redis on Flash分层存储技术是如何做到的?

Redis on flash简介:Redis on Flash 涉及到的是Redis的分层存储技术,即将数据存放在不同地方。Redis自2016年以来支持Redis on Flash。从2019年开始, Redis企业版(Redis Enterprise)宣布支持英特尔Optane DC持久性内存&#xff0c…

基于NB-IoT的智能垃圾桶系统设计与实现

本设计是基于物联网的智能垃圾桶,主要实现以下功能: 1,压力传感器模块采集垃圾重量数据; 2,GPS定位模块采集垃圾桶所在的经纬度数据; 3,人体红外模块检测人体并返回是否有人通过的数据&#xf…

会议管理系统SSM记录(二)

目录: (1)整合Freemarker (2)用户登录 (3)提取头部 (4)提取菜单抽取 (1)整合Freemarker 在pom.xml中加入Freemark依赖: 创建free…

HTML+CSS大作业:基于HMTL校园学校网页设计题材【我的学校网站】

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

专精特新企业三个层级

专精特新企业也是分层级的。工信部2022年6月印发《优质中小企业梯度培育管理暂行办法》里面明确提出中小企业培育的3个梯度,分别是创新型中小企业、专精特新中小企业和专精特新小巨人企业,刚好构成中小企业发展层级金字塔。这就意味着企业想要发展崛起&a…

19 04-读取DTC快照信息

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,19服务作为UDS中子功能最多的服务,一共有28种子功能,本文将介绍常用的19 04服务:读取快照信息。 关联文章: 19服务List 19 01-通过状态掩码读取DTC数目 $19服务:DTC…

1.2 C++编译器对指针的解释方式(深度理解c++指针)

1.2 指针 1.2.1 指针解释方式 从内存的角度,一个指向类对象的指针与一个指向整数类型的指针或一个指向数组的指针,三者之间是没有任何区别的,它们内部都只存储了一个机器地址值(word)。不同类型指针的区别仅在于其寻址出来的object类型的不…

div+css布局实现个人网页设计(HTML期末作业)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

Spring源码深度解析:七、bean的加载① - doGetBean概述

我们先通过getBean()流程图,来了解Spring的getBean()方法的工作流程,接着根据这个工作流程一步一步的阅读源码 一、前言 文章目录:Spring源码分析:文章目录 getBean()方法是spring ioc的核心,阅读getBean()方法的源…

【Spring Boot+Vue.js+JPA+Mysql】实现前后端分离的名片系统(附源码 超详细必看 可作为大作业使用)

需要项目源码请点赞关注收藏后评论区留言并且私信~~~ 一、项目简介 前后端分离的核心思想时前端页面通过掉用后端的RESTfulApI进行数据交互。本次项目使用Spring BootSpring Data JPA实现后端系统,使用Vue.js实现前端系统,数据库采用mysql,集…

磨金石教育摄影技能干货分享||如何将平凡的窗户拍出美感

窗户有着天然的构图优势,一直是摄影爱好者们喜欢拍的场景。都说眼睛是心灵的窗户,窗户其实就是房间窥探世界的眼睛。 特别是在中国文化中,对窗户的艺术雕刻,总是那么侧重。一间房子好不好看,窗户的设计往往是较为重要…

Java里的异常机制

一、什么是异常 软件程序在运行过程中,遇到用户输入不符合要求、文件路径不存在、文件格式错误、非法参数等的异常问题,叫做异常(Exception)。 二、简单分类 1.检查性异常 最具代表的检查性异常就是用户错误或问题引起的异常&…

计算机网络:网络层

网络层 网络层主要是解决寻址连接问题,例如两个主机在网络上通过IP进行连接通信 1.网络层概述 网络层的主要任务是实现网络互联,进而实现数据包在各网络之间的传输 需要解决的主要问题: 因特网 使用TCP/IP协议栈通过学习TCP/IP协议栈的网…