poco元素

在UI自动化测试中,选择指定相应的UI元素非常重要。POCO提供了许多强大而有效的方法来选择用户界面,包括通过任何属性、层次关系和位置关系。最重要的是,这些方法都可以链接或组合在一起,以实现更复杂的选择。

备注:元素定位各个方法在poco.proxy中,即poco项目下的proxy.py文件里的class UIObjectProxy(object)

名次解释:

anchor:锚点,即用工具AirtestIDE-Inspector识别元素时,元素上的锚点=显示的小红点

center:中心点,选择对象中间点

一、定位方式整理:

  1. child:获取当前节点下的子节点,如果是多个获取多个,用for循环提取,不使用循环提取的默认提取第一个节点
def child(self, name=None, **attrs):

【示例】:

menuList1=poco("com.aa.bb:id/home_bottom_navigator").child("android.widget.LinearLayout")
for i in range(0,len(menuList1)):  #同列表方式一致,节点序号从0开始
    print ("第 %d 次用child获取menuList底部全部菜单=====%s"%(i,menuList1[i]))

【输出】:

0 次用child获取menuList底部全部菜单=====UIObjectProxy of "com.aa.bb:id/home_bottom_navigator/android.widget.LinearLayout[0]"
......3 次用child获取menuList底部全部菜单=====UIObjectProxy of "com.aa.bb:id/home_bottom_navigator/android.widget.LinearLayout[3]"4 次用child获取menuList底部全部菜单=====UIObjectProxy of "com.aa.bb:id/home_bottom_navigator/android.widget.LinearLayout[4]"
  1. children():获取子节点,如果是多个获取多个,用for循环提取,不使用循环提取的默认提取第一个节点
def children(self):
示例:
menuList2=poco("com.tencent.nbagametime:id/home_bottom_navigator").child("android.widget.LinearLayout").children()
for i in range(0,len(menuList2)):
    print ("第 %d 次用children获取menuList底部菜单名=====%s"%(i,menuList2[i]))

输出:

0 次用children获取menuList底部菜单名=====UIObjectProxy of "com.tencent.nbagametime:id/home_bottom_navigator/android.widget.LinearLayout/[0]"1 次用children获取menuList底部菜单名=====UIObjectProxy of "com.tencent.nbagametime:id/home_bottom_navigator/android.widget.LinearLayout/[2]"
......9 次用children获取menuList底部菜单名=====UIObjectProxy of "com.tencent.nbagametime:id/home_bottom_navigator/android.widget.LinearLayout/[9]"
备注:同child的区别是是否可带入参数,两者都可以提取多个节点,child可以根据参数过滤条件;children不可过滤,不可传入参数

3.offspring:获取当前节点下的孙节点,如果是多个获取多个,用for循环提取,不使用循环提取的默认提取第一个节点

 def offspring(self, name=None, **attrs):
offspring查找子孙节点的顺序如下:树结构自底向上,同一层从中间右边左边的顺序

特殊说明:如果确定不了顺序编号,可以使用for打印出来,然后再找出需要的节点是哪个编号id

4.sibling:获取当前节点的兄弟节点

 def sibling(self, name=None, **attrs):

5.parent:获取当前节点的父节点,如果获取的当前节点是多个(用children获取的),则获取列表第一个节点的父节点

def parent(self):
注意:此方法在Android上可用,在Ios上不可用,会报错:AttributeError: 'UIObjectProxy' object has no attribute 'parent'

6.attr(‘type’):提取属性值

示例
poco('ssion').attr('type')	#提取指定元素属性为type的值

7.get_text():提取文本内容:

示例
poco('ssion').get_text()	#提取指定元素的文本内容

8.判断元素是否存在:

   poco('ssion').exists()	#判断指定元素是否在当前屏幕上存在,返回True/False

9.元素文本正则匹配:

 poco(textMatches='^测试.*$', type='Button', enable=True)

二、元素操作方式整理:

=见poco.proxy包(proxy.py文件)=======

1.click():点击操作

  def click(self, focus=None, sleep_interval=None):
focus:值为:(x,y)或“anchor”或“center”。(x,y)意思是距元素左上角的偏移点,值必须在0~1范围内。“center”是指点击ui元素边界框的中心。“anchor”是指监视器中UI包围盒的小红点。

sleep_interval:点击操作后等待的秒数。默认值为无,这里默认睡眠间隔。这个值可以通过POCO初始化进行配置。

示例:
  poco('home_bottom_navigator').click()	#无参数默认点中间位置无间隔时间

    poco('home_bottom_navigator').click([0.5, 0.5])	#相当于点中间位置

    poco('home_bottom_navigator').click([0.5, 0.5],3)	#传参,点击元素中间红点后等待3秒

    poco('home_bottom_navigator'').focus([0.5, 0.5]).click()  #点击元素中间红点位置
备注:官方说明:点击默认点在 anchorPoint 上,每个UI都会有一个 anchorPoint ,也就是检视器(Inspector)中UI包围盒的那个红点,大部分情况下 anchorPoint 都在UI包围盒的正中央。如果想指定其他的点击位置,可以传一个参数到 click 方法中,这个参数是一个用list或tuple表示的2维向量,其 [x, y] 值分别表示相对于包围盒左上角的偏移量,左上角为 [0, 0] ,右下角为 [1, 1] 

anchor小红点示例:

2.rclick():右键点击

def rclick(self, focus=None, sleep_interval=None):

focus:同click方法

sleep_interval:同click方法

3.double_click():双击操作

def double_click(self, focus=None, sleep_interval=None):

focus:同click方法

sleep_interval:同click方法

4.long_click():长按操作

def long_click(self, duration=2.0):

duration:整个动作持续时间

5.swipe():滑动操作

def swipe(self, direction, focus=None, duration=0.5):

direction:坐标,可以是(x,y)格式坐标,也可以是'up', 'down', 'left', 'right' (up=[0, -0.1],down=[0, 0.1],left=[-0.1, 0],right=[0, 0.1])

focus:同click方法

duration:间隔时间,float类型,默认0.5

示例:

node= poco('home_bottom_navigator').child('point_img')

node.swipe('up')	#向上滑动

node.swipe([0.2, -0.2])  # 以45度角向上和向右滑动sqrt(0.08)单位距离

node.swipe([0.2, -0.2], duration=0.5)
说明:swipe操作以 锚点anchor为起点,如果想改变起点可用 focus 方法,然后朝给定方向滑动,距离就是向量的长度。

6.drag_to:拖拽

def drag_to(self, target, duration=2.0):

target:拖动后的目标元素

duration:间隔时间,float类型,默认2
备注:与 swipe 不同的是, drag是从一个UI拖到另一个UI,而 swipe 是将一个UI朝某个方向拖动。

示例:
  poco(text='比赛').drag_to(poco(text='开始'))	#把比赛元素拖动到开始元素上

7.scroll:卷动效果

def scroll(self, direction='vertical', percent=0.6, duration=2.0):

direction:滚动方向。”垂直“或水平”,默认垂直

percent:在指定元素上按高或宽的滚动百分比

duration:间隔时间,float类型,默认2

8.pinch:捏合操作

def pinch(self, direction='in', percent=0.6, duration=2.0, dead_zone=0.1):

direction:

percent:

duration:

dead_zone:

9.focus:局部定位

def focus(self, f):

f:同click()方法
示例:
poco('比赛').focus('center').click()  #定位到元素中间点,进行点击

poco('比赛').focus([0.5,1]).click()  #定位到元素最下边缘的中间点,进行点击
备注:官方说明:所有UI相关的操作都默认以UI的 anchorPoint 为操作点,如果想自定义一个点那么可以使用 focus方法。调用此方法将返回新的设置了默认焦点 的UI,重复调用则以最后一次所调用的为准。focus 所使用的是局部坐标系,因此同样是UI包围盒的左上角为原点,x轴向右,y轴向下,并且包围盒长宽均为单位1。很显然中心点就是 [0.5, 0.5]

将 focus 和 drag_to 结合使用还能产生卷动(scroll)的效果,下面例子展示了如何将一个列表向上卷动半页。 第9点中的scroll实现方式就是这样的

示例:

poco("元素").focus([0.5, 0.8]).drag_to(poco(“元素”).focus([0.5, 0.2])) #从指定节点的中下方拖拽到中上方,比如手机端的从下往上滑动

10.start_gesture():移动设备手势分解方法,返回用于生成序列化手势操作的对象。

示例:
ui1=poco("ui1")

ui2=poco("ui2")

ui1.start_gesture().hold(1).to(ui2).hold(1).up()	#在ui1元素上按下,等待1秒,拖拽到ui2元素上再等1秒,最后抬起释放

11.get_position():获取元素位置坐标,返回(x,y)坐标

def get_position(self, focus=None)

focus:同click()方法,默认空

12.wait():等待,直到超过timeout的时间,超时后返回元素对象

def wait(self, timeout=3)
说明:

在给定时间内等待一个UI出现并返回这个元素,如果已经存在了那就返回这个元素。如果超时还没出现,同样也会返回,但是调用这个UI的操作时会报错。

经验:结合exists()方法可以判断元素是否出现,比如:
poco(“元素”).wait(4).exists()	#如果结果是True则元素存在,如果False则元素不存在

13.wait_for_appearance():等待出现,若超时返回PocoTargetTimeout

  def wait_for_appearance(self, timeout=120)
备注:wait_for_appearance()同wait()的区别:前者超时没找到元素直接返回异常PocoTargetTimeout,后者超时后还返回元素当调用时会报错。

14.wait_for_disappearance():等待未出现,若超时返回PocoTargetTimeout

 def wait_for_disappearance(self, timeout=120):

15.attr():获取属性

def attr(self, name):

name:属性名
示例:
  poco("节点").attr('text')
说明:通过给定的属性名检索ui元素的属性。如果属性不存在,则返回none。

属性名可以是以下类型之一,也可以是由SDK实现的任何其他自定义类型:
- visible: whether or not it is visible to user

- text: string value of the UI element

- type: the type name of UI element from remote runtime

- pos: the position of the UI element

- size: the percentage size [width, height] in range of 0~1 according to the screen

- name: the name of UI element

- ...: other sdk implemented attributes

16.setattr():设置属性值,更改ui元素的属性值。

def setattr(self, name, val)

    name:属性名

    val:属性值
说明:并非所有属性都可以转换为文本。如果改变不可变的属性或不存在的属性,将引发InvalidOperationException异常

17.exists():判断是否存在,返回True/False

   def exists(self)

18.get_text():获取ui元素的文本属性。如果没有此类属性,则返回none

   def get_text(self)

19.set_text():设置文本值

   def set_text(self, text)

    text:文本值

20.get_name():获取元素名,即属性是name的值,attr(‘name’)

   def get_name(self)

21.get_size():获取元素size,即属性中的size(attr(‘size’)),值:size : [1, 0.76328125]

def get_size(self):

22.get_bounds():获取UI元素边界框的参数

def get_bounds(self)

说明:返回列表形式,如 (top, right, bottom, left)形式的,与标准坐标系中屏幕边缘相关的坐标。

23.nodes:在远程运行时中访问UI元素的只读属性。

def nodes(self)

调用方式:poco("节点").nodes

24.invalidate():重新获取元素标识

def invalidate(self)

说明:清除标志以指示重新查询或从层次结构中重新选择UI元素

###其他方式:

1.怎么一次连接多个设备?

########怎么一次连接多个设备

# 先初始化多个设备对象

dev1 = Android('127.0.0.1:62001')   #连接模拟器
dev2 = Android('0123456789')        #连接手机设备

#再对多个设备进行处理

poco1 = AndroidUiautomationPoco(dev1)
poco2 = AndroidUiautomationPoco(dev2)
poco1.device.wake()
poco2.device.wake()
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Poco 中实现长按某个元素,可以通过以下步骤实现: 1. 找到需要长按的元素的位置,可以使用 Poco 提供的 `poco.agent.touch` 接口模拟触摸事件,对元素进行长按操作。 ```python import poco from poco.drivers.android.uiautomation import AndroidUiautomationPoco # 连接设备并初始化 poco 对象 poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) # 获取需要长按的元素 elem = poco(text='长按我') # 获取元素的位置 pos = elem.get_position() # 模拟长按操作,长按时间为 1 秒钟 poco.agent.touch(pos[0], pos[1], 'DOWN', duration=1.0) ``` 在上面的代码中,我们首先使用 `poco(text='长按我')` 找到需要长按的元素,并且使用 `get_position()` 方法获取该元素在屏幕上的位置。然后,我们使用 `poco.agent.touch` 方法模拟长按操作,将参数 `duration` 设置为 1 秒钟,表示长按的时间为 1 秒钟。 2. 如果长按操作需要在某个特定的位置进行,那么可以通过 `poco.agent.touch` 方法的第三个和第四个参数来指定操作的位置。 ```python # 模拟长按操作,长按时间为 1 秒钟,操作位置为 (100, 200) poco.agent.touch(100, 200, 'DOWN', duration=1.0) ``` 在上面的代码中,我们将操作位置设置为 (100, 200)。 3. 如果需要在长按过程中移动手指,可以使用 `MOVE` 操作来模拟手指的移动。 ```python # 模拟长按操作,长按时间为 1 秒钟,操作位置为 (100, 200),然后将手指向右移动 50 个像素 poco.agent.touch(100, 200, 'DOWN', duration=1.0) poco.agent.touch(150, 200, 'MOVE') ``` 在上面的代码中,我们在长按操作后,使用 `MOVE` 操作将手指向右移动了 50 个像素。 注意:在使用 `poco.agent.touch` 方法模拟触摸事件时,需要将 `use_airtest_input` 参数设置为 `True`,表示使用 Airtest 输入法进行输入。如果不设置该参数,可能会导致无法模拟触摸事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值