Airtest API精讲之双指滑动two_finger_swipe()

 

以下基于
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83

之前我们讲Airtest API精讲之swipe()的时候,有提到一个参数fingers,当给其赋值为2时,就是两个手指滑动。当时给的例子是横滑,可以出现上下两条线,但如果是竖滑,两条线就会重叠成一条线,只是有个先后罢了。今天给大家介绍一个two_finger_swipe(),让我们可以自定义出更符合自己要求的双指滑动。

老规矩开场白,我们今天要讲的是Airtest框架的two_finger_swipe(),不是Poco框架的,一般我们说Airtest,其实应该指的是Airtest Project,具体这些概念的关系是什么,可以看之前文章:Airtest Project——UI自动化利器介绍

首先说明一点,某些模拟器如果你选择的连接参数中有"Use Adb Touch",可能将无法使用two_finger_swipe(),不行就换真机吧。

源码解析

我们先来看下two_finger_swipe()的源码(不想看源码的可以直接跳到后面的演示实例):

# 文件位置:your_python_path/site-packages/airtest/core/android/touch_methods/base_touch.py
def two_finger_swipe(self, tuple_from_xy, tuple_to_xy, duration=0.8, steps=5, offset=(0, 50)):
"""
Perform two finger swipe action

minitouch protocol example::

    d 0 0 0 50
    d 1 1 0 50
    c
    m 0 20 0 50
    m 1 21 0 50
    c
    m 0 40 0 50
    m 1 41 0 50
    c
    m 0 60 0 50
    m 1 61 0 50
    c
    m 0 80 0 50
    m 1 81 0 50
    c
    m 0 100 0 50
    m 1 101 0 50
    c
    u 0
    u 1
    c

Args:
    tuple_from_xy: start point
    tuple_to_xy: end point
    duration: time interval for swipe duration, default is 0.8
    steps: size of swipe step, default is 5
    offset: coordinate offset of the second finger, default is (0, 50)

Returns:
    None
"""
from_x, from_y = tuple_from_xy
to_x, to_y = tuple_to_xy
# 根据偏移量计算第二个手指的坐标
from_x2, from_y2 = (min(max(0, from_x + offset[0]), self.size_info['width']),
            min(max(0, from_y + offset[1]), self.size_info['height']))
to_x2, to_y2 = (min(max(0, to_x + offset[0]), self.size_info['width']),
        min(max(0, to_y + offset[1]), self.size_info['height']))
swipe_events = [DownEvent(tuple_from_xy, contact=0, pressure=self.default_pressure),
        DownEvent((from_x2, from_y2), contact=1, pressure=self.default_pressure),
        ]

interval = float(duration) / (steps + 1)
for i in range(1, steps + 1):
    move_events = [
    SleepEvent(interval),
    MoveEvent((from_x + ((to_x - from_x) * i / steps), from_y + (to_y - from_y) * i / steps),
          contact=0, pressure=self.default_pressure),
    MoveEvent((from_x2 + (to_x2 - from_x2) * i / steps, from_y2 + (to_y2 - from_y2) * i / steps),
          contact=1, pressure=self.default_pressure),
    ]
    swipe_events.extend(move_events)
swipe_events.extend([UpEvent(contact=0), UpEvent(contact=1)])
self.perform(swipe_events)

 

参数:
tuple_from_xy:开始坐标
tuple_to_xy:结束坐标
duration:时间间隔,默认0.8秒
steps:执行步数,默认5
offset:第二根手指偏移量,默认(0, 50)

如果你之前看过swipe_along()的源码解析,会发现这两个方法的实现是如此之像,就是多了一根手指的处理。以上代码中contact=0代表第一根手指,contact=1代表第二根手指

第40-41行

from_x, from_y = tuple_from_xy
to_x, to_y = tuple_to_xy

 

分别定义开始/结束的坐标x,y变量(第一根手指)

第43-46行

from_x2, from_y2 = (min(max(0, from_x + offset[0]), self.size_info['width']),
            min(max(0, from_y + offset[1]), self.size_info['height']))
to_x2, to_y2 = (min(max(0, to_x + offset[0]), self.size_info['width']),
        min(max(0, to_y + offset[1]), self.size_info['height']))

 

根据第一根手指开始/结束的坐标x,y变量计算出第二根手指开始/结束的坐标

第47行,向滑动事件列表swipe_events分别加入两根手指的按下事件

第51-60行,向滑动事件列表swipe_events依次加入等待事件、两根手指的分段移动事件

第61行,给滑动事件列表swipe_events追加两个手指的抬起事件

第62行self.perform(swipe_events)将滑动事件列表中的每个事件依次执行

因为和swipe_along()源码极其相似,想看更详细的源码解析的,可以去看下之前swipe_along()的文章Airtest API精讲之连续滑动swipe_along()

从源码可知第二根手指的默认偏移量是(0, 50),所以假如你给的横滑的开始/结束坐标为(0,100),(100,100),那么算出来的第二根手指的开始/结束坐标就是(0,150),(100,150),即两条相距50垂直距离的平行线。

相应的,假如你给的竖滑的开始/结束坐标为(100,100),(100,200),用默认偏移量(0, 50),那么算出来的第二根手指的开始/结束坐标就是(100,150),(100,150),即两条部分重叠的竖线。所以如果你想要两条平行的竖线,偏移量就要是(50, 0)

 

演示实例

画两条横向平行线

# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"

from airtest.core.api import *

# 获取当前手机设备
dev = device()
# 从[150, 1000]到[700, 1000],其余参数全部用默认
dev.touch_proxy.two_finger_swipe([150, 1000],[700, 1000])

 

Airtest API精讲之双指滑动two_finger_swipe()

画两条竖向平行线

# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"

from airtest.core.api import *

# 获取当前手机设备
dev = device()
# 从[250, 550]到[250, 700],持续10秒,分5步,第2根手指偏移量(200,0)
dev.touch_proxy.two_finger_swipe([250, 550],[250, 700], duration=10, steps=5, offset=(200, 0))

 

Airtest API精讲之双指滑动two_finger_swipe()

遇到问题

我用的小米手机,MIUI12,每次执行完毕后,第二根手指会多一段距离的惯性滑动。咨询过官方说是虽然显示多一段,但实际那一段没有执行;可是我自己试的应该是执行了的(双指下滑的时候相册歪了)。假如你要用到two_finger_swipe(),使用过程中也真的多执行了一段,并且影响到了功能实现,那么可以通过调整duration、steps、offset的大小,也许可以解决问题。

 

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

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

Airtest API精讲之双指滑动two_finger_swipe()

上一篇:雪碧图米兔练习


下一篇:K3s 集群 Helm3 国内(外)快速部署 Operator & Prometheus