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])
画两条竖向平行线
# -*- 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))
遇到问题
我用的小米手机,MIUI12,每次执行完毕后,第二根手指会多一段距离的惯性滑动。咨询过官方说是虽然显示多一段,但实际那一段没有执行;可是我自己试的应该是执行了的(双指下滑的时候相册歪了)。假如你要用到two_finger_swipe(),使用过程中也真的多执行了一段,并且影响到了功能实现,那么可以通过调整duration、steps、offset的大小,也许可以解决问题。
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~
标签:双指,精讲,swipe,50,steps,finger,offset,self 来源: https://www.cnblogs.com/songzhenhua/p/15547638.html