2024.2.25更新:poco1.0.92补充了double_click()接口

2023.9.3更新:poco1.0.87新增refresh()接口

 

以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85

注意:Poco框架和Airtest框架很多API是同名的,但使用方法完全不一样!!!一定不要搞混了,我初学时也经常搞混,这点一定要注意!
具体Poco框架和Airtest框架是什么关系,可以看之前文章:Airtest Project——UI自动化利器介绍

上期讲了Poco框架的元素定位,今天我们就接着讲元素定位成功后,都有哪些API可以用。想熟练使用Poco框架,以下API必须熟记。

当元素定位后,实际上是实例化了一个UIObjectProxy类,该类源码在:
your_python_path/site-packages/poco/proxy.py


1.child(name=None, **attrs)返回第1个符合条件的子元素

参数:
name - name属性值
**attrs - 其他属性值

返回:
新的UIObjectProxy实例

示例:

poco("android:id/title").child()  # 返回title下的第1个子元素
poco("android:id/title").child("name")  # 返回title下的第1个叫"name"的子元素

2.children()返回所有子元素

参数:
因为是返回所有,所以无需参数

返回:
新的UIObjectProxy实例


3.offspring(name=None, **attrs)返回符合条件的子孙元素

参数:
name - name属性值
**attrs - 其他属性值

返回:
新的UIObjectProxy实例


4.sibling(name=None, **attrs)返回符合条件的兄弟元素

参数:
name - name属性值
**attrs - 其他属性值

返回:
新的UIObjectProxy实例


5.parent()返回父元素

参数:
父元素只有一个,所以无需参数

返回:
新的UIObjectProxy实例


6.click(focus=None, sleep_interval=None)单击元素,如果UI对象是一组元素则点击第1个

参数:
focus - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即元素左上角,取值范围0~1
sleep_interval - 休息间隔

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco("btn_start").click()  # 点击元素中心
poco("btn_start").click([0.1,0.1])  # 点击元素左上角
poco("btn_start").click([0.9,0.9], sleep_interval=3)  # 点击元素右下角,之后休息3秒

7.rclick(focus=None, sleep_interval=None)右击,这个应该只在Windows上有,手机没有。如果UI对象是一组元素则点击第1个

参数:
focus - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即左上角,取值范围0~1
sleep_interval - 休息间隔

异常:
PocoNoSuchNodeException:元素不存在


8.double_click(focus=None, sleep_interval=None)双击。Poco1.0.92新增

参数:
focus - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即左上角,取值范围0~1
sleep_interval - 休息间隔

异常:
PocoNoSuchNodeException:元素不存在


9.long_click(duration=2.0)长按

参数:
duration - 持续时间,默认2秒


10.swipe(direction, focus=None, duration=0.5)滑动

参数:
direction - 滑动方向,可以是屏幕相对坐标或是指定方向'up', 'down', 'left', 'right'。'up'=[0, -0.1], 'down'=[0, 0.1], 'left'=[-0.1, 0], 'right'=[0.1, 0]。如[0, -0.1],指元素长的方向不动,整个屏幕宽-10%的位置,即基于元素中心点垂直向上。
focus - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即左上角,取值范围0~1
duration - 滑动时长,默认0.5秒

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco('Scroll').swipe([0, -0.1])  # 从元素中心向上滑动屏幕宽10%的距离
poco('Scroll').swipe('up')  # 从元素中心向上滑动屏幕宽10%的距离
# 从元素左上角向上滑动屏幕宽10%的距离,滑动过程持续3秒
poco('Scroll').swipe(direction='up', focus=[0.1,0.1], duration=3)

11.drag_to(target, duration=2.0)将一个元素拖到另一个元素位置。类似于swipe,但swipe是滑动到一个指定方向,而drag_to则是滑动到一个点。

参数:
target - 一个元素对象或屏幕相对坐标
duration - 滑动时长,默认2秒

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco('star').drag_to(poco('shell'))  # 将元素star拖到元素shell
poco('star').drag_to([0.1,0.1])  # 将元素star拖到屏幕左上角

12.scroll(direction='vertical', percent=0.6, duration=2.0)滚动。在可以滚动的元素上进行滚动。

参数:
direction - 滚动方向,"vertical" or "horizontal",默认'vertical'
percent - 滚动距离,该距离是相对于此元素的高或宽的比例,默认0.6
duration - 滚动时长,默认2秒

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco('scroll').scroll()  # 向下垂直滚动0.6的比例,持续2秒
poco('scroll').scroll(direction='vertical', percent=-0.6)  # 向上垂直滚动0.6的比例,持续2秒
poco('scroll').scroll('horizontal',0.3,1)  # 向右横向滚动0.3的比例,持续1秒

13.pinch(direction='in', percent=0.6, duration=2.0, dead_zone=0.1)缩放

参数:
direction - "in"缩 or "out"放,默认"in"
percent - 缩放距离,该距离是相对于此元素的比例,默认0.6
duration - 缩放时长,默认2秒
dead_zone - 缩放内圈半径,不能大于percent,默认0.1

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco('picture').pinch()  # 图片向里缩小
poco('picture').pinch("out")  # 图片向外放大

14.start_gesture()滑动手势。可用于解锁等复杂手势操作。

返回:
PendingGestureAction实例

示例:

ui1 = poco('xxx')
ui2 = poco('yyy')
# 按住元素ui1 1秒,滑到ui2,等待1秒,滑到屏幕中心,等待1秒,抬起
ui1.start_gesture().hold(1).to(ui2).hold(1).to([0.5,0.5]).hold(1).up()

15.focus(f)为元素重新聚焦。作用同click()等操作中的focus参数。一般定位到元素后默认焦点是该元素的中心点[0.5,0.5],使用
focus()可以重新聚焦。
参数:
f - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即左上角,取值范围0~1

返回:
新的UIObjectProxy实例

示例:

poco('star').focus([0.1,0.1])  # 将焦点设为元素的左上角

16.get_position(focus=None)获取元素在屏幕上的相对坐标

参数:
focus - 元素相对坐标,如[0.1,0.1],指元素长、宽各10%的位置,即左上角,取值范围0~1

返回:
相对坐标,如[0.498,0.35555]

异常:
PocoNoSuchNodeException:元素不存在


17.wait(timeout=3)等待元素X秒,等到提前结束,等不到继续往下

参数:
timeout - 等待时间,默认3秒

返回:
自身

示例:

# 等待star元素10秒。因为返回自身,所以可以继续操作
poco('star').wait(10).click()

18.wait_for_appearance(timeout=120)等待元素出现,等到提前结束,等不到报错

参数:
timeout - 等待时间,默认120秒

异常:
PocoTargetTimeout:等待元素超时

示例:

star = poco('star')
star.wait_for_appearance(10)
star.click()

19.wait_for_disappearance(timeout=120)等待元素消失,消失则提前结束,否则报错

参数:
timeout - 等待时间,默认120秒

异常:
PocoTargetTimeout:等待元素超时

示例:

poco('star').wait_for_disappearance(10)

20.attr(name)获取元素属性值

参数:
name - 属性名称,如name、type、text、visible、pos、clickable等

返回:
属性值,如果属性不存在返回None

异常:
PocoNoSuchNodeException:元素不存在

示例:

poco('star').attr("name")

21.setattr(name, val)设置元素的属性的值。需要注意的是并不是所有属性都可以修改。

参数:
name - 属性名称,如name、type、text、visible、pos、clickable等
val - 值

异常:
InvalidOperationException:非法操作。当设置失败时抛出。

示例:

# 给输入框设置值为"测试工程师小站"
poco('input').setattr("text", "测试工程师小站")

22.exists()判断元素是否存在。

返回:
True if exists otherwise False

示例:

poco('input').exists()

23.get_text()获取元素'text'属性值

返回:
'text'属性值,没有时返回None

示例:

poco('input').get_text()

24.set_text(text)设置元素'text'属性值

参数:
text - 文本内容

异常:
InvalidOperationException:非法操作。当无法设置时抛出。

示例:

poco('input').set_text("测试工程师小站")

25.get_name()获取元素'name'属性值

返回:
'name'属性值

示例:

poco('input').get_name()

26.get_size()获取元素在屏幕相对坐标中的大小

返回:
[width, height] in range of 0 ~ 1

示例:

poco('input').get_size()

27.get_bounds()获取元素在屏幕相对坐标系中的边界

返回:
[top, right, bottom, left] in range of 0 ~ 1

示例:

poco('input').get_bounds()

28.refresh()

poco1.0.87新增接口,主要用在如下场景:
如定义一个元素,此时元素存在,循环去操作

a = poco(text="日历")
for i in range(10):
    print(a.get_text())

假如在循环到第5次时,元素消失了,但因为变量a是不变的,所以能一直获取其这个元素。
使用refresh()可解决此问题:

a = poco(text="日历")
for i in range(10):
    a.refresh()
    print(a.get_text())

这样,在第5次以后,由于元素消失,就不会获取到元素文本了。同样的,如果一个元素一直存在,你要判断其是否消失了,也可以用这个方法。