首页 > 其他分享 >poco节点关系大公开!

poco节点关系大公开!

时间:2024-04-18 10:55:19浏览次数:30  
标签:公开 offspring poco netease child com 节点

此文章来源于项目官方公众号:“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]

也可以在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树相匹配:

同样,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()

综上所述,如果需要获取该界面的所有节点,可以通过.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上的一个使用案例吧。

参考代码如下:

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

# -*- 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树节点。

参考代码如下:

# -*- 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

标签:公开,offspring,poco,netease,child,com,节点
From: https://www.cnblogs.com/AirtestProject/p/18143052

相关文章

  • LeetCode- 19 删除链表的倒数第N个节点
    题目地址https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/参考实现/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){t......
  • 2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏
    2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡泡,但需要满足以下规则:被击破的节点泡泡最多只能有一个子节点泡泡。如果被击破的节点......
  • openstack-新增nova节点
    1.改IPvi/etc/sysconfig/network-scripts/ifcfg-ens3TYPE=EthernetBOOTPROTO=staticDEFROUTE=yesNAME=ens3DEVICE=ens3ONBOOT=yesIPADDR=172.17.10.53NETMASK=255.255.255.128GATEWAY=172.17.10.1DNS1=202.96.128.86DNS2=114.114.114.1142.设置主机名hostnamectl......
  • JZ76 删除链表中重复的节点
    1、相似题classSolution{public:ListNode*deleteDuplicates(ListNode*head){//判空if(head==NULL)returnnullptr;ListNode*p1=head;ListNode*p2=p1->next;while(p2){......
  • JZ18删除表的节点
    /***structListNode{* intval;* structListNode*next;* ListNode(intx):val(x),next(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@param......
  • ​ Scrum Master (CSM) 认证公开课/
    课程简介Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2021年全球敏捷状态报告,Scrum及Scrum衍生方法的应用占比达到81%。在企业的敏捷转型历程中,ScrumMaster是至关重要的一个角色,他们不仅担负着团队教练、......
  • Scrum.org认证PSPO官方认证班/专业Scrum产品负责人(PSPO)认证公开班
    ​课程简介Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2022年全球敏捷状态报告,Scrum的应用占比已经达到87%。Scrum.org由Scrum的联合创始人KenSchwaber创立,旨在帮助人们和团队解决复杂的问题,通过基......
  • 高级Scrum Master(A-CSM)认证公开课
    ​课程简介入门级的CSM层面介绍Scrum的价值,实践和应用,敏捷之旅的下一步就是获得高级认证的ScrumMaster(A-CSM℠)认证。这门课程帮助敏捷教练和ScrumMaster从自身,团队,和组织层面,学习技能和工具来扩展实践的层面。通过这两天课程的学习提高,学员将进一步提升作为ScrumMaster的敏捷......
  • 2-77. 修正 CropGenerator 和 AStar 地图节点生成
    修复Bug可以看到房子的上面生成了一棵树修改CropGenerator修改AStar我不太理解,反正照着改就算了吧项目相关代码代码仓库:https://gitee.com/nbda1121440/farm-tutorial.git标签:20240413_1246......
  • JZ22 链表中倒数最后k个节点
    /***structListNode{* intval;* structListNode*next;* ListNode(intx):val(x),next(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@param......