poco节点关系大公开!

这篇具有很好参考价值的文章主要介绍了poco节点关系大公开!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

一、前言

在自动化测试的实践中,我们发现许多同学在使用Poco框架进行控件定位时,对于节点之间的关系理解不够深入。那么本周让我们来详细讲解Poco框架中的child&childrenoffspringsiblingparent等节点关系定位方法。

二、Poco定位节点的关系分析

2.1 child&children

从字面上看,可以很明显知道childchildren表示的就是获取该节点下的子节点。如果是需要获取多个子节点,需要通过for去循环提取,不通过循环获取的话,默认都是提取第一个节点,但顺序编号从0开始。

其中child可以携带参数,可以获取指定的子节点,如:

poco("android.widget.FrameLayout").child("android.widget.LinearLayout")

children是不能携带参数的,是可以直接获取所有的子节点,但可以根据返回的子节点顺序进行指定,默认返回的是提取的第一个节点(顺序编号从0开始)如:

poco("android.widget.FrameLayout").children()[2]

2.2 offspring

offspring是获取该节点的子孙节点,若需要输出多个子孙节点,使用for循环去进行输出,默认输出为首个子孙节点。在使用过程中,如果不清楚自己所需节点的编号为多少,我们可以选择用for输出后,按照顺序编号进行选择使用。

poco("com.netease.cloudmusic:id/bannerContainer").offspring()

可以根据输出的顺序,结合下图,其中下述语句表达为“每日推荐”控件:

poco("com.netease.cloudmusic:id/portal_rv").offspring()[10]

poco节点关系大公开!

也可以在offspring括号内指定自己所需要的子孙节点,如:

poco("com.netease.cloudmusic:id/portal_rv").offspring("com.netease.cloudmusic:id/portalTitle")

上述语句同样表示为“每日推荐”控件。这样有个好处就是,当有多个相同name的控件但存在不同name的上层节点时,可以很好的区分每个控件。

2.3 sibling

siblings表示获取当前节点的兄弟节点,即与当前节点处于同一层级的其他节点。若需要输出多个兄弟节点,使用for循环进行输出,默认输出为首个兄弟节点。

poco("com.netease.cloudmusic:id/biFl").sibling()

如下图,可以看到该节点下返回的兄弟节点与UI树相匹配:
poco节点关系大公开!

同样,sibling也是可以根据循环获取输出的顺序进行指定的,如:

poco("com.netease.cloudmusic:id/biFl").sibling()[3]

2.4 parent

在poco中,parent表示获取当前节点的父节点。如果需要获取整个节点集合的父节点,需要找到节点集合的第一个节点。 如果需要获取多层父节点,可以通过.parent()方法进行逐级获取。

例如,对于一个节点A,它的父节点是B,B的父节点是C,那么可以通过A.parent().parent()来获取到节点C。

poco("com.android.systemui:id/status_bar_contents").parent()

poco节点关系大公开!

综上所述,如果需要获取该界面的所有节点,可以通过.parent().children() 等方法互相结合来获取其他层级中的所有节点,然后再通过遍历筛选出除了当前节点外的其他节点。
在开源群内,有一些同学也问过如何统计UI树某层或某控件的个数,我们可以通过上述的节点关系,结合python已有的len()函数,或使用for循环累加的方式去获取的。如:

#【利用子孙节点关系定位元素】统计输出热歌榜当前界面中歌曲数量
num=len(poco("com.netease.cloudmusic:id/musicInfoList").offspring(nameMatches="com.*?songName"))    
print("当前界面有{}首歌".format(num))

#【利用子节点关系定位元素】统计输出当前界面的热门节目单数量
num=0
for x in poco("CollectionView").child("UIA.Podcasts.ShelfItem.show"):
    print(x.child().child().get_name())
    num+=1

三、Android上的案例

了解完Poco节点关系的具体用法后,我们可以尝试在日常跑测中使用上节点关系,让我们来看一下在Android上的一个使用案例吧。

poco节点关系大公开!

参考代码如下:

可以看到,我们通过节点关系可以获取到它的父节点、兄弟节点、子孙节点等,并可以对其进行点击、统计、输出信息等操作。

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

auto_setup(__file__)

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

#打开网易云音乐
start_app("com.netease.cloudmusic")
sleep(7.0)

#【利用子孙节点关系寻找元素】通过输出子孙节点去查找“发现”按钮
for i in poco("com.netease.cloudmusic:id/bottomNav").offspring(nameMatches="com.*?desc"):
    print(i.get_text())

#【利用子孙节点关系以及空间顺序定位元素】点击"发现"按钮
poco("com.netease.cloudmusic:id/bottomNav").offspring(nameMatches="com.*?desc")[1].click()
sleep(1.0)

#【通过兄弟节点关系定位元素】点击发现页中“精选”旁边的“排行榜”按键
poco("精选").sibling()[1].click()
sleep(1.0)

#点击热歌榜
poco(text="热歌榜").click()

#【利用子孙节点关系寻找元素】输出热歌榜中每首歌的名字
print("当前界面的热歌榜歌曲有:")
for i in poco("com.netease.cloudmusic:id/musicInfoList").offspring(nameMatches="com.*?songName"):
    print(i.get_text())
    
#【利用子孙节点关系定位元素】统计输出热歌榜当前界面中歌曲数量
num=len(poco("com.netease.cloudmusic:id/musicInfoList").offspring(nameMatches="com.*?songName"))    
print("当前界面有{}首歌".format(num))
    
#【利用子节点关系定位元素】输出目前播放器在播放的歌曲名
print("下方为正在播放的歌曲:")    
now_song = poco("com.netease.cloudmusic:id/minibar_song_container").child().children()   
print(now_song.get_text())

四、iOS上的案例

日常使用中可以发现,在iOS上获取对应的UI树控件比较困难,但是可以通过Poco节点关系的方法,更大程度地去寻找到自己想要获取的控件或ui树节点。
poco节点关系大公开!

参考代码如下:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

auto_setup(__file__)
from poco.drivers.ios import iosPoco
poco = iosPoco()

#打开播客app
poco("播客").click()

#【利用子节点关系定位元素】输出该界面的信息,点击选择查看热门节目
for i in poco("CollectionView").child():
    print(i.get_name())

#【利用子节点关系结合子孙节点关系定位元素】点击进入热门节目界面 
poco("CollectionView").child("热门节目").offspring("查看全部").click()

#【利用子节点关系定位元素】输出当前界面的热门节目单
num=0
print("当前热门节目单有:")
for x in poco("CollectionView").child("UIA.Podcasts.ShelfItem.show"):
    print(x.child().child().get_name())
    num+=1

#【通过循环累计获取节点个数】输出当前界面的热门节目数量
print("当前界面有{}个节目".format(num))   

#【利用父节点关系结合子节点关系定位元素】点击播放键进入播放界面
poco("MiniPlayerArtworkVisible").parent().child()[2].child()[0].click()

#【利用兄弟节点关系定位元素】点击播放键进行播放
poco("倒回,15秒钟").sibling()[1].click()

五、小结

本周我们介绍了Poco节点关系:

1、child&children 获取子节点

2、offspring 获取子孙节点

3、sibling 获取兄弟节点

4、parent 获取父节点

通过深入理解child&childrenoffspringsiblingparent这些节点关系,我们能够更加精确和高效地定位到UI树中的各个节点。

如果同学们在使用Poco进行自动化测试的过程中,遇到了问题,或者有任何想要深入了解的知识点,欢迎在群里告诉我们或者提交issue,也欢迎大家投稿。后续我们会带来更多精彩的有关Poco专题内容,请大家持续关注我们,敬请期待哦!


AirtestIDE下载:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:526033840文章来源地址https://www.toymoban.com/news/detail-855134.html

到了这里,关于poco节点关系大公开!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Poco框架实操:获取节点属性的高效技巧(一)

    Poco框架实操:获取节点属性的高效技巧(一)

    此文章来源于项目官方公众号:“AirtestProject” 版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途 上期推文我们介绍了Poco UI树下的节点关系,以及通过节点关系去寻找我们所需要节点的方法,那么本周我们来分享一下,当我们寻找到所需要节点后,

    2024年04月25日
    浏览(8)
  • 在Dede会员投稿增加文章来源功能的方法

    如何给织梦dedecms模板 会员投稿增加文章来源的功能,现在就来说一下添加的方法,该办法系小编整理自织梦模板论坛,感谢原作者的提供。 首先用Dreamweaver打开 membertemplets 下的 article_add.htm 文件,在第 66行到67行(我是在作者TR标签结束后,加的)之间插入以下代码: 打开

    2024年02月03日
    浏览(13)
  • 33. Fabric通道、组织、节点、权限间关系

    最近小伙伴设计区块链业务场景时,对于这几个概念的关系比较模糊,尤其各级权限如何管理,哪些使用区块链相关的证书、秘钥,哪些属于业务系统自己定义的秘钥,作者尽量用简明的方式来介绍,总结出一套成熟的应用模式。 1. 构造场景 假设 我们要开展一个业务,场景

    2024年01月16日
    浏览(11)
  • NEO4J节点及节点间关系显示不完整的解决方法

    NEO4J节点及节点间关系显示不完整的解决方法

    1.问题说明 在使用NEO4J数据库进行知识图谱的可视化时,在节点个数过多时(一般超过25个)会出现节点和节点关系显示不全的情况。 如下图所示,项目中共包含74个节点190条关系,但实际显示的仅有25个节点间的61条关系,超过25个之外的节点及其关系并未展示。 2.解决方案

    2024年02月13日
    浏览(85)
  • neo4j批量追加属性、节点、关系

    前提:这个方法是用python连接neo4j再循环执行cql语句来实现的,适合1w条记录以内的数据,太大了就比较慢,平均1s执行30条语句左右。 主要的不同就在于cql语句的使用 连接数据库: 读取节点表和关系表,该文件是存储好的csv文件 中文是替代的文件名字,不是源文件名 替换

    2024年02月16日
    浏览(10)
  • Neo4j入门:手动构建节点关系

    Neo4j入门:手动构建节点关系

    目录 一、基本cypher语句建立节点和关系 建立节点 带属性的节点 一次建立多个节点 建立两个节点之间的关系 二、用CSV文件导入方法对Neo4j Desktop批量创建节点和关系 批量创建节点 创建一个编码为utf-8格式的CSV文件 将CSV文件放入到我们neo4j目录下面的import目录下 回到Neo4j执行

    2024年01月16日
    浏览(9)
  • FPGA 与 数字电路的关系 - 这篇文章 将 持续 更新 :)

    FPGA 与 数字电路的关系 - 这篇文章 将 持续 更新 :)

    先说几个逻辑:(强调一下在这篇文章 输入路数 只有 1个或2个,输出只有1个, N个输入M个输出以后再说 ) 看下面的几个图: 图一( 忘了 这是 啥门,不是门吧 :)也就是信号增强器吧 ) 图二(非门) 图三(2入一出 与门) 图四 (2入 1出 或门) 上面的几个图中 0 低电

    2024年03月15日
    浏览(13)
  • 一篇文章搞定什么是nodeJs它和NPM关系与应用

    现在前端的入门门槛越来越高了,不再是单纯 html+css+js ,各种前端框架 层出不穷,各种ui组件库层出不穷。 模块化,打包化,各种工具库层出不穷,前端变成 大前端 ,甚至前端可以搞定整个项目,通过 node 作为服务端api, 这里我们主角就是 nodeJs javaScript是一门脚本语言,

    2024年02月03日
    浏览(14)
  • 删除neo4j所有内容,节点关系以及属性标签

    删除neo4j所有内容,节点关系以及属性标签

    1.停止neo4j服务器 2.进入安装neo4j的目录删除两个文件夹 neo4j——data——databases 删除neo4j文件夹 neo4j——data——transactions 删除neo4j文件夹 即下图所示的两个文件夹 再打开neo4j会发现已经清空了所有数据

    2024年02月11日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包