一、前言
二、Poco节点操作详解
2.1 修改文本类属性值:setattr(typename, val)
在日常测试中,有些文本类属性需要修改的时候,可以使用setattr(typename, val)
这个方法,通过输入属性名以及需要修改进去的内容即可。但是需要注意的是,很多属性如:name
、pos
等等是不推荐修改的,尤其是editalbe
为**False
**的节点,不建议修改该节点的所有属性,它们的修改可能会导致出现意外和误报错误。poco("com.sonyericsson.conversations:id/conversation_edit_text").setattr("text","我要发短信")
2.2 输入文字:set_text()
在日常输入的时候,我们可以使用set_text()
这个方法,但是在使用set_text()
之前,需要先执行一遍click
点击操作,激活文本框后,再执行输入操作。poco("com.sonyericsson.conversations:id/conversation_edit_text").click()
poco("com.sonyericsson.conversations:id/conversation_edit_text").set_text("我要发短信")
如果在使用set_text()
无法输入,或出现相关报错的话,可以更换使用Airtest的text()
方法去进行输入即可。poco("com.sonyericsson.conversations:id/conversation_edit_text").click()
text("我要发短信")
2.3 设置节点焦点:focus(f)
跟Airtest的图片一样,在Poco节点也有一定的操作点范围,且focus
所使用的是局部归一化坐标系,因此同样是UI框的左上角为原点,x轴向右,y轴向下,并且UI框长宽最大坐标均为1。所以一般节点默认的操作点坐标为[0.5, 0.5]
。在日常使用过程中,使用比较多的场景有以下几种情况:2.3.1 内部偏移
如果需要对节点的UI框内的其他点进行操作的话,则需要利用focus
重新自定义一个操作点,也就是设置内部偏移量,偏移量在 大于0且小于1 的范围内。调用这个方法将返回已设置了新操作点的Poco节点,重复调用则以最后一次所调用的为准。# 内部偏移
poco(texture="icon").focus([0.1,0.8]).long_click()
2.3.2 外部偏移
如果是需要对节点的UI框外的其他点进行操作的话,也可以通过focus
去指定UI框外的偏移量,并且是会出现偏移量 小于0或者大于1 的情况,但是要注意的是,在考虑外部偏移量的同时,也要注意该偏移量坐标是否会超出屏幕范围,否则会出现该报错:InvalidOperationException('Click position out of screen
。# 外部偏移
poco(text="pearl").focus([0.5,-3]).long_click()
更多关于focus的内容可以查看PocoAPI文档以及官方教程文档的对应内容:https://poco-chinese.readthedocs.io/en/latest/source/poco.proxy.html#poco.proxy.UIObjectProxy.focushttps://airtest.doc.io.netease.com/IDEdocs/poco_framework/4_poco_API/#72.4 拖拽:drag_to(target, duration=2.0)
说到拖动,大家第一反应应该是swipe()
,但是swipe()
是单纯的从其中一个坐标,滑动到另一个坐标,但是drag_to()
是完全不同的,首先拖动的是节点而不是普通的一个坐标点,其次,拖动的终点是可以是另一个节点、同一个节点的不同UI位置、或者是某个坐标点。括号内所需要传输的变量为target
:拖拽的终点(可以为节点,也可以为归一化坐标); duration=2.0
:默认拖拽的持续时间为2秒。归一化坐标参考下图,以屏幕的左上角为原点建立坐标轴,x轴向右,y轴向下,坐标最大为1,更多详情可查看我们的教程文档:https://airtest.doc.io.netease.com/IDEdocs/poco_framework/2_API_word/#2-poco_1poco('star').drag_to(poco('shell'))
poco("音乐").drag_to([0.5,0.5])
2.5 长按:long_click(duration = 2.0)
与click
类似,long_click()
是对节点进行长按操作,可以传入长按的持续时间参数duration
,默认为2秒。但如果想对某个坐标点进行长按操作的话,可以选择poco.pocofw module
下的long_click(pos, duration=2.0)
,我们需要传入设备屏幕归一化坐标 pos
以及 长按的持续时间参数 duration
即可。poco.long_click((0.5,0.5), duration=2.0)
2.6 双击:double_click(x, y)
双击操作在poco 1.0.92
及以上版本均能使用,可以在括号内输入双击的偏移点坐标,不填写默认为双击节点的anchorPoint
,如下:poco("音乐").double_click([0.2,0.8])
三、实操小案例
看完上述的操作详情后,让我们用一个小小的案例来看看上述操作在实际操作中的具体效果吧~# -*- 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(2.0)
poco("com.netease.cloudmusic:id/skipBtn").click()
#点击进入搜索界面
poco("com.netease.cloudmusic:id/iconSearch").click()
sleep(1.0)
#【使用setattr】输入“汪苏泷”
poco("com.netease.cloudmusic:id/search_src_text").setattr("text","汪苏泷")
sleep(1.0)
#点击搜索按钮,进行搜索
poco("com.netease.cloudmusic:id/toSearch").click()
sleep(1.0)
#点击播放全部歌曲
poco("com.netease.cloudmusic:id/actionView").click()
sleep(1.0)
#【使用double_click】双击喜欢歌曲
poco("com.netease.cloudmusic:id/smallAlbumDisc0").double_click()
#退出歌曲播放详情界面
poco("转到上一层级").click()
sleep(1.0)
#【使用focus、drag_to】分别进行节点UI定位以及进行拖拽换歌
poco("com.netease.cloudmusic:id/tv_music").focus([0.8,0.3]).drag_to(poco("com.netease.cloudmusic:id/tv_music").focus([0.2,0.3]),duration = 1.0)
sleep(1.0)
#【使用long_click】长按复制歌曲名
poco(text="此生不换 (Live版)").long_click()
poco("com.netease.cloudmusic:id/copyBtn").click()
#点击上方搜索框
poco("com.netease.cloudmusic:id/search_close_btn").click()
#【使用set_text】将剪切板的内容粘贴在搜索框内
poco("com.netease.cloudmusic:id/search_src_text").set_text(get_clipboard())
#点击搜索
poco("com.netease.cloudmusic:id/toSearch").click()
四、小结
我们今天分享了一些对Poco节点比较常用的操作方法,其中包括:- 修改文本类属性值:
setattr(typename, val)
- 拖拽:
drag_to(target, duration=2.0)
- 长按:
long_click(duration = 2.0)
通过这些方法,我们可以更好地编写Poco的自动化脚本,也可以将操作更简单化。如果同学们在使用Poco进行自动化测试的过程中,遇到了问题,或者有任何想要深入了解的知识点,欢迎在官方交流群里告诉我们或者提交issue,也欢迎大家投稿。