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个锚在元素下方),虽然本质上是一个元素,只是锚点不一样罢了。

 

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

posted @ 2022-05-22 19:27  ☆星空物语☆  阅读(624)  评论(0编辑  收藏  举报