【airtest】自动化入门教程Poco元素定位
1. 前言
本文将详细讲解Poco控件定位的各种方式,利用这些方法可以帮助我们编写出目标控件的定位脚本。我们在IDE录制的poco脚本,常见的都是类似 poco(“star_single”).click()这样的脚本,其中 poco(“star_single”) 这块就属于Poco控件定位脚本啦。
2. 三种定位选择器
Poco控件最基本的3种定位选择器分别是:
基本选择器
相对选择器
空间顺序选择器
1)基本选择器
在poco实例后加一对括号,我们就可以进行元素选择了。选择器会遍历所有元素,将满足给定条件的元素都选出来并返回。
括号里的参数就是所给定的条件,用属性名值对表示,其中第一个参数表示 节点名 ,就像 poco("star_single")
。后面还可以跟着一些可选参数,均表示 节点的属性及预期的属性值 :
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()poco("star_single",type="Image")
通过属性组合
如果元素属性不能唯一定位,可通过组合属性方式
poco(name = 'NodeName',type = '类型名比如Button')
2)相对选择器
如果直接用节点属性(或者说仅仅使用基本选择器)没法选出你所想要的元素时,你还可以通过元素之间的渲染层级关系进行选择,例如父子关系(child)、兄弟关系(sibling)、祖先后代关系(offspring)等等:
如:
poco("plays").child("playBasic").offspring("star_single")
poco('父节点').child('子节点') # 默认取第一个,也可以通过下标,我使用过-1,-2,1 ,2 等下标
孙节点offspring
,当根据child().child()定位时,如果第二个child是前面一个的孙节点,不能定位到,要用offspring,child节点必须是上个节点的儿子节点,不能跨辈分
poco('父节点').child('子节点').offspring('孙节点')
兄弟节点sibling
兄弟可能是多个,可通过下标方式
poco('name').sibling()
父节点parent
获取当前节点的父节点
poco('name').parent()
poco(text="春天的菠菜").parent().parent()
直到某个元素出现
poco('属性').wait_for_appearance(timeout=3) # wait until appearance within 3s
直到某个元素消失
元素.wait_for_disappearance()
获取元素属性
#获取当前元素 pos属性的值
#a = poco(name="com.yunmall.lc:id/textView5").parent().attr('pos')
#获取当前元素的名字 get_name()
#a = poco(name="com.yunmall.lc:id/textView5").parent().get_name()
#获取当前元素的文本信息 其实获取的是text属性的值
# poco(name="com.yunmall.lc:id/textView5").parent().get_text()
设置元素属性
#选取元素 输入内容为123 其实也是设置text属性的值
poco("pos_input").set_text("123")
#设置text属性的值为456
poco("pos_input").setattr('text',"456")
.判断控件是否存在,并进行操作
print(obj.exists())
#判断密码框元素是否可见,可见则输入内容在输入内容
password_input = poco(name='com.yunmall.lc:id/logon_password_textview')if password_input.exists():poco(name='com.yunmall.lc:id/logon_password_textview').set_text("123456")
点击和长按
#点击 按钮
poco('NodeName').click()
#长按 按钮
poco('NodeName').long_click()
#长按按钮 指定时间 单位为s
poco('NodeName').long_click(duration=5)
3)空间顺序选择器
按照序号(顺序)进行选择总是按照空间排布顺序,先从左往右,再像之前那样一行一行从上到下。如下图所示,我们利用选择器选中了很多个 type=“Text” 的元素,然后再利用索引顺序逐个选中单个元素:
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()print(name0+" "+name1+" "+name2)
索引选择有个特例,一旦进行选择后,如果元素的位置发生了变化,那么下标序号仍然是按照选择的那一瞬间所确定的值。即,如果选择时①号元素现在去到了③号的位置,那么还是要用 poco(…)[0] 来访问,而不是 poco(…)[2] 。
如果选择了之后,某个元素消失了(从界面中移除或者隐藏了),那么如果再访问那个元素则可能会发生异常,其余的元素仍可继续访问。
3. 利用正则表达式匹配控件
其实除了上述3种常规一点的定位方式之外,还有一种同学们比较少见,但是非常好用的定位方式,那就是 用正则表达式来匹配控件 ,如下述示例这样:
arb_close_btn = poco(textMatches='^close.*$')
poco(textMatches='^春天的菠菜.') #表达式根据自己需要写
poco(textMatches=".*停止.*").click()
如果有些信息的控件名都是一样的,所以只要我们写1个正则表达式,匹配到这一批相同的控件名,就相当于定位到了当前页面所有的歌曲信息控件,就可以利用poco遍历,逐一获取控件的text属性了:
for i in poco(nameMatches="com.*?songInfo"):print(i.get_text())
除了最常见的 textMatches
、 nameMatches
和 typeMatches
,其实大部分的属性都可以用这种方式来传递正则表达式,只要能够用 poco(xx=预期属性值)
来选择的控件,就可以用 poco(xxMatches=预期属性值的正则表达式)
来进行匹配定位。
4. 其他较适用的检测元素方法
除了上述关于元素定位 的问题,还有比如:有哪些属性可以拿来定位元素?利用节点属性无法定位元素时应该怎么处理?为什么明明存在的节点还会报找不到?…
所以我们特意整理了这篇文章,向大家详细讲述几种poco元素定位的方式,希望能方便大家在实际项目中灵活运用。
借助IDE的poco辅助窗生成元素定位脚本
AirtestIDE的 poco辅助窗 给我们提供了很多种方式来生成元素定位的脚本。最简单的方法是,点击poco辅助窗里面的 录制按钮
,然后再点击下目标元素:
这样脚本编辑窗就会自动生成一条点击控件的脚本,除去脚本中点击操作的代码,剩下的 poco("star_single")
,就是定位到黄色星星图片元素的代码了。
当然,我们还可以使用录制按钮旁边的俩个 检视器 按钮来帮助我们定位元素。这两个检视器按钮的区别在于,是否锁定当前页面:
我们可以看到,随着检视器定位到某个元素,辅助窗里面的UI树也会随着定位到相应的元素上,这时我们可以 双击 UI树对应的位置,即可在脚本编辑窗自动生成定位元素的脚本。
补充:
poco的坐标系
左上角(0,0),右下角(1,1),横坐标为x,纵坐标为y,点击节点的某个位置
#点击节点的中心点位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus('center').click()
#点击节点的靠近左上角位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus([0.1, 0.1]).long_click()
#点击节点的右下角位置
poco(name='com.yunmall.lc:id/logon_password_textview').focus([1, 1]).long_click()
拖拽和滑动
a.拖拽:从一个节点位置拖拽到另一个节点位置
poco('AeNodeName').drag_to(poco('BeNodeName'))
从列表的一端滑动到另一端
listView = poco('Scroll View')
listView.focus([0.5, 0.7]).drag_to(listView.focus([0.5, 0.2]))
b.滑动:滑动列表
poco('Scroll View').swipe([0, -0.1])
poco('Scroll View').swipe('up')
从A点滑动到B点
x, y = poco('Scroll View').get_position()
end = [x, y - 0.1]
poco.swipe([x, y], end)
从A点向指定方向和定长移动
x, y = poco('Scroll View').get_position()
dir = [0, -0.1]
poco.swipe([x, y], direction=dir)
相关文章:
![](https://i-blog.csdnimg.cn/direct/6a9b47cd0dd747b7ac2205f90de45e8e.png)
【airtest】自动化入门教程Poco元素定位
1. 前言 本文将详细讲解Poco控件定位的各种方式,利用这些方法可以帮助我们编写出目标控件的定位脚本。我们在IDE录制的poco脚本,常见的都是类似 poco(“star_single”).click()这样的脚本,其中 poco(“star_single”) 这块就属于Poco控件定位…...
![](https://www.ngui.cc/images/no-images.jpg)
【爬虫】某某查cookie逆向
代码仅供技术人员进行学习和研究使用,请勿将其用于非法用途或以任何方式窃取第三方数据。使用该代码产生的所有风险均由用户自行承担,作者不对用户因使用该代码而造成的任何损失或损害承担任何责任。 加密参数 加密参数主要是cookie,其中只有…...
![](https://i-blog.csdnimg.cn/direct/481fdc19e01b4eda9832c60a7e6d7e65.png)
【进程与线程】进程的状态
在操作系统中,进程是执行中的程序实例。进程在其生命周期中会经历不同的状态,操作系统根据进程的执行情况和资源调度,将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。 进程的状态:就绪态࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
阻塞赋值和非阻塞赋值
理论学习 阻塞赋值 用 表示 ,这种对应的电路结构常常与触发器没有关系,只与输入电平的变化有关系。可以将阻塞赋值的操作看作只有一个步骤的操作,即将计算赋值符号的右边赋值给左边,在未执行完之前&#…...
![](https://i-blog.csdnimg.cn/direct/06737c28647f43ec82712e0471e3242e.png)
Maven在Win10上的安装教程
诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要,也可以从官网下载: 第一步:解压文件 第二步:设置环境变量 在系统变量处点击新建,输入变量名MAVEN_HOME,变量值为解压路径: 在系统变…...
![](https://i-blog.csdnimg.cn/direct/94d4a13ce24145ed9c2d24d855c0a87a.png)
攻防世界_SQL注入
inget 尝试万能钥匙。 输入?id1or11# supersqli 1.找注入点 输入框 2.判断字符型,数字型 输入1 and 11 和1 and 12,发现两次提交后页面一样,判断出为字符型注入 3.判断闭合符号 输入1,回显正常 输入1,报错 加上…...
![](https://www.ngui.cc/images/no-images.jpg)
Ruby语言的数据结构
Ruby语言的数据结构详解 Ruby是一种动态、面向对象的编程语言,因其简洁优雅的语法而受到开发者的喜爱。在Ruby中,数据结构是构建和管理数据的一种方式,不同的数据结构适用于不同的场景。本文将详细探讨Ruby中的几种主要数据结构,…...
![](https://i-blog.csdnimg.cn/direct/9207398e3c7d4ae4b9894d727cb93945.png)
Jmeter配置服务代理器 Proxy(二)
1.创建脚本记录器 2.配置:Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考:使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面,生成了证书: 5.给浏览器安装Jmeter代理的证书…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot 中实现 WebSocket 的方式
在 Spring Boot 中实现 WebSocket 的方式主要有以下几种,每种方式适用于不同的场景和需求: 1. 基于 Spring WebSocket 的实现 特点: 原生支持 WebSocket,基于 Spring 提供的 API。使用 WebSocketConfigurer 和 WebSocketHandler 配置端点和消息处理逻辑。可以通过拦截器访…...
![](https://i-blog.csdnimg.cn/direct/9293a5842b094b628001fae8a5b0c270.png)
C语言初阶习题【29】杨氏矩阵
1. 题目描述——杨氏矩阵 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时间复杂度小于O(N); 2. 思路 3. 代码实现1 #include<stdio.h>void fin…...
![](https://i-blog.csdnimg.cn/img_convert/00eff75cc5ddc45b80bd812ad9a7b626.png)
[操作系统] 深入理解操作系统的概念及定位
概念 任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。 其核心功能如图片所示,包括: 内核 (Kernel): 内核是操作系统的核心部分,被认为是狭义上的操作系统,直接与硬件打交道。负责进程管理、内…...
![](https://www.ngui.cc/images/no-images.jpg)
Java中对list数据进行手动分页(可直接复用版)
1.获取list列表数据 // 这边用的mybatisplus查询的sql。条件自己组装 List<实体类> result baseMapper.getPageData(lambdaQuery); 2.计算总记录数 // 计算总记录数 int totalRecords result.size(); 3.创建分页对象,并塞入结果值 // 创建分页对象 IPa…...
![](https://i-blog.csdnimg.cn/direct/4a9886c3d5f247deb6d1735c32a2cf1e.png)
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页 一、问题背景: 如今,大家都离不开各种手机应用。随着鸿蒙系统用户越来越多,大家都希望能在鸿蒙设备上快速找到想用的 APP。华为应用市场里有海量的 APP,但之前从鸿蒙设备进…...
![](https://i-blog.csdnimg.cn/direct/2f60bb744e6c4f9ea0489533cf81799a.png)
《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析
全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业,技术革新迅猛,市场竞争激烈。《全星研发管理 APQP 软件系统》的应用,为企业带来了革命性的变化,诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…...
![](https://i-blog.csdnimg.cn/direct/6ac95747d5a4436799a2f86d196396c9.png)
【IDEA 2024】学习笔记--文件选项卡
在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…...
![](https://www.ngui.cc/images/no-images.jpg)
Android SystemUI——服务启动流程(二)
在 Andorid 系统源码中,package/apps下放的是系统内置的一些 APP,例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下,它们也是系统的 APP,SystemUI 就在此目录下。它控制着整个 Android 系统的界面,但其实他也是一个 APP,不同于一般的 APP,它…...
![](https://www.ngui.cc/images/no-images.jpg)
iOS - 内存对齐
1. 基本的内存对齐 // 对象内存对齐 struct objc_object {// isa 指针 8 字节对齐isa_t isa __attribute__((aligned(8))); };// 定义对齐常量 #define WORD_MASK 7UL // 字对齐掩码 #define WORD_SHIFT 3UL // 字对齐位移 #define WORD_SIZE 8 …...
![](https://i-blog.csdnimg.cn/direct/a67053004e3b464d905d1682c33a859d.png)
小游戏前端地区获取
目前前端获取除了太平洋,没有其它的了。 //在JS中都是使用的UTF-8,然而requst请求后显示GBK却是乱码,对传入的GBK字符串,要用数据流接收,responseType: "arraybuffer" tt.request({url: "https://whoi…...
![](https://i-blog.csdnimg.cn/direct/06cbd167d6b84400aa4d0792a70fb257.jpeg#pic_center)
AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》 内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容(AIGC)技术的迅速发展,…...
![](https://www.ngui.cc/images/no-images.jpg)
MDX语言的多线程编程
MDX语言的多线程编程 引言 多线程编程是一种重要的编程技术,广泛用于提高程序的运行效率和响应速度。随着计算机硬件的发展,多核处理器的普及,多线程编程显得尤为重要。MDX(Multi-dimensional Expressions)语言作为一…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue.js组件开发-实现输入框与筛选逻辑
在Vue.js组件开发中,实现输入框与筛选逻辑通常涉及创建一个输入框组件,让用户能够输入搜索关键字,并根据这些关键字过滤一个数据列表。 步骤 准备数据: 在Vue组件中,准备一个数据列表(通常是一个数组…...
![](https://i-blog.csdnimg.cn/direct/249227f8936143b0a27123454ae929f0.png#pic_center)
配置Allure环境变量【macOS版】
1. 进入github官网,搜索allure 点击进入,下滑找到Download栏目,点击release 2. 下载安装包并解压 我下载的是zip,解压至存放目录,复制该目录。(一会配置环境变量用) 3. 编辑.zsrch文件&…...
![](https://www.ngui.cc/images/no-images.jpg)
AndroidStudio升级到2024.2.2项目AGP升级8.8.0版本记录
背景 升级as,一般会把agp一起升级。我的原来版本是8.7.2 plugins {id com.android.application version 8.7.2 apply falseid com.android.library version 8.7.2 apply falseid org.jetbrains.kotlin.android version 1.8.10 apply false }升级后版本:…...
![](https://www.ngui.cc/images/no-images.jpg)
Require:利用MySQL binlog实现闪回操作
1,闪回原理 【binlog】MySQL binlog以event的形式,记录了MySQL server从启用binlog以来所有的变更信息,能够帮助重现这之间的所有变化。MySQL引入binlog主要有两个目的:一是为了主从复制;二是某些备份还原操作后需要重…...
![](https://i-blog.csdnimg.cn/direct/474283f436ba4bc3b10d5c3fdcdedc22.png)
计算机网络 (40)域名系统DNS
前言 计算机网络域名系统DNS(Domain Name System)是互联网的基础技术之一,它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址,使得用户可以通过简单易记的域名来访…...
![](https://www.ngui.cc/images/no-images.jpg)
UE5游戏性能优化指南
UE游戏性能和场景优化思路: 1. 可以把可延展性调低,帧率会大幅提高,但画质会大幅降低 2.调整固定灯光,静态光源,烘焙构建光照,灯光重叠距离,关闭阴影 3.设置模型和地形LOD 4.开启Nanite&…...
![](https://i-blog.csdnimg.cn/img_convert/417818c461a6afc6edbb2f46160315a3.png)
Gitlab Runner安装与配置
由于格式和图片解析问题,为了更好阅读体验可前往 阅读原文 本篇使用Docker安装Gitlab runner进行runner的安装和注册,其他方式请参考官方文档非Docker安装Gitlab runner 请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题 下载镜像 docker p…...
![](https://www.ngui.cc/images/no-images.jpg)
如何有效防止和解决IP劫持问题
一、什么是IP劫持? IP劫持是一种攻击方式,攻击者通过伪装成合法的IP地址欺骗网络系统,从而非法获取数据或中断服务。这种攻击可以导致数据泄露、服务不可用等多种严重后果。 二、防范措施 启用SSL/TLS加密 SSL/TLS协议可以在客户端和服务器…...
![](https://i-blog.csdnimg.cn/direct/2e0bb77cf51b4c61b8d8d5325190a2de.jpeg)
2006-2020年各省人均水资源量数据
2006-2020年各省人均水资源量数据 1、时间:2006-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、人均水资源量 4、范围:31省 5、指标解释:人均水资源量是指一个国家或地区在一定时期…...
![](https://i-blog.csdnimg.cn/direct/74803f4d188549e189c8329e13b21bcb.png)
C++基础入门(二)
目录 前言 一、重载 1.函数重载 2.运算符重载 二、构造函数 1.什么是构造函数 2.带参数的构造函数 3.使用初始化列表 4.this关键字 5.new关键字 三、析构函数 1.什么是析构函数 四、静态成员变量 1.静态成员的定义 2.静态成员变量的作用 五、继承 1.继承基本概…...
![](/images/no-images.jpg)
怎样用记事本做网站/搜索引擎广告图片
从零开始用 Flask 搭建一个网站(二) 从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构。我们要搭建的网站是管理第三方集成的控制台,类似于 Slack。 本篇主要讲…...
![](/images/no-images.jpg)
株洲seo优化官网/深圳aso优化
-------------------------------------- 面试题 -----------------------------------------1 vuex 的五个状态VueX 是一个专门为Vue.js 应用设计的状态管理架构,统一管理和维护各个vue 组件的可变化状态 (你可以理解成vue 组件里的某些data ) 。Vue 有五个核心概念…...
![](/images/no-images.jpg)
公众平台 wordpress/快速seo整站优化排行
Notepad Java开发环境配置 2008-12-29 22:13:04分类: Java uiNotepad Java开发环境配置1. 安装JDK下载JDK 6下载http://developers.sun.com.cn/download/java_se.html运行安装程序,按照屏幕提示完成JDK 6的安装,下面为安装路径:E:…...
![](https://images2018.cnblogs.com/blog/1208761/201807/1208761-20180720092901041-211014480.png)
深圳网站建设网站运营/新手20种引流推广方法
【下载jar包】:https://stormxing.oss-cn-beijing.aliyuncs.com/files/XMindCrack.jar方法:打开xmind 8 安装目录的该文件:最后添加一行: 此路径为下载好的jar包的绝对路径,不能有汉字。 【激活】:设置完in…...
![](/images/no-images.jpg)
如何建立一个网站放视频/狠抓措施落实
题目要求: 本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。 输入格式: 输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩&…...
![](/images/no-images.jpg)
建设部网站危房鉴定标准规定/免费网站模板网
时间同步: 首先需了解linux内一任务计划工具crontabcrontab可以定时去执行你要做的动作直接用crontab命令编辑crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数crontab -l //列出某个用户cron服务的详细内容crontab -r //删除某个用…...