Poco API精讲之拖动drag_to()
上期回顾:Poco API精讲之滑动swipe()
以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
注意:Poco框架和Airtest框架很多API是同名的,但使用方法完全不一样!!!一定不要搞混了,我初学时也经常搞混,这点一定要注意!
具体Poco框架和Airtest框架是什么关系,可以看之前文章:Airtest Project——UI自动化利器介绍
上期我们讲了Poco的滑动swipe(),他是从一个点或元素向另一个点或方向滑动,那么这里目标的点或方向基本是定死的。
今天要讲的Poco的拖动drag_to(),是从一个元素拖到另一个元素,这样我们就不用关心写死的目标了,甚至这2个元素可以是在屏幕任意位置来回变的,我不关心你在哪,不管你在哪,我的目的就是从一个拖到另一个。不过drag_to()同时也支持拖向某个点。
drag_to(target, duration=2.0)
将一个元素拖到另一个元素位置
参数:
target - 一个元素对象或屏幕相对坐标
duration - 滑动时长,默认2秒
异常:
PocoNoSuchNodeException:元素不存在
源码解析:
# 源码位置:your_python_path\site-packages\poco\proxy.py
def drag_to(self, target, duration=2.0):
try:
duration = float(duration)
except ValueError:
raise ValueError('Argument `duration` should be <float>. Got {}'.format(repr(duration)))
if type(target) in (list, tuple):
target_pos = target
else:
target_pos = target.get_position()
origin_pos = self.get_position()
dir_ = [target_pos[0] - origin_pos[0], target_pos[1] - origin_pos[1]]
return self.swipe(dir_, duration=duration)
第1个代码块是确保duration参数的合法性
if type(target) in (list, tuple):
target_pos = target
else:
target_pos = target.get_position()
正如上面说的drag_to也支持拖到一个屏幕相对坐标点,如果判断target是list或tuple类似,直接将坐标点赋值给目标变量。
否则target就应该是一个元素对象,通过get_position()获取到其中心点的屏幕相对坐标,赋值给目标变量。
origin_pos = self.get_position()
获取元素自身坐标点为起始坐标。
dir_ = [target_pos[0] - origin_pos[0], target_pos[1] - origin_pos[1]]
将目标坐标减去起始坐标,给下面的swipe计算出滑动的向量。
return self.swipe(dir_, duration=duration)
所以我们看到了,即使你是从一个元素拖到另一个元素,但底层还是通过swipe来实现的。
示例:
from airtest.core.api import *
from poco.drivers.unity3d import UnityPoco
auto_setup(__file__)
poco = UnityPoco()
# 将元素拖到屏幕左上角
poco("测试工程师小站").drag_to([0.1,0.1])
# 下面就是官方最经典的案例了,将官方游戏demo中的所有星星拖到贝壳上
shell = poco('shell')
for star in poco('plays').offspring('star'):
star.drag_to(shell)
上面示例代码只写了最核心的
另外drag_to()还有一个使用小技巧,能够将元素自拖,即从元素一端拖到另一端,比如一个滚动条,从下往上拖
from airtest.core.api import *
from poco.drivers.unity3d import UnityPoco
auto_setup(__file__)
poco = UnityPoco()
scrollView = poco(type='ScollView')
scrollView.focus([0.5, 0.8]).drag_to(scrollView.focus([0.5, 0.2]))
之前我们讲过:Poco API精讲之focus()
focus后相当于复制了一个新的元素,所以scrollView.focus([0.5, 0.8])
和scrollView.focus([0.5, 0.2])
相当于2个独立的元素(1个锚在元素上方,1个锚在元素下方),虽然本质上是一个元素,只是锚点不一样罢了。
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~