前言
滑动操作千千万,你是否会遇到过使用 swipe
和 drag_to
都实现不了的滑动情况?或者你有没有为手势操作不知道如何模拟而苦恼的时候呢?
比如模拟长按删除操作,再比如模拟安卓的多指手势操作等等,这些操作用 swipe
、 drag_to
等方法,都不能满足大家的实际需求。
所以今天想跟大家一起来学习下airtest的 basetouch
模块。这个模块提供了很多 底层的 点击、滑动等操作,用这个模块的方法或者类,我们可以轻松模拟出各种 自定义 的点击、滑动甚至其它手势操作。下文我们将详细了解下这个模块以及如何在实际的应用场景中使用这个模块。
basetouch
模块介绍
我们常使用的 minitouch
和 maxtouch
,其共同的底层操作都来自于 basetouch
。
举个例子,之前我们在“用airtest做滑动解锁怎么搞?其实很简单!”这篇推文中,也有详细介绍过 basetouch
模块里面的一些接口:
- 实现连续划过一系列坐标的
swipe_along
接口 - 实现双指捏合操作的
pinch
接口 - 实现双指同时滑动的
two_finger_swipe
接口
除了这些接口以外,今天我们重点要了解的是这个模块里面的4个类:
DownEvent(coordinates, contact=0, pressure=50)
UpEvent(contact=0)
MoveEvent(coordinates, contact=0, pressure=50)
SleepEvent(seconds)
调用这4个类,理论上可以拼接组合出来所有的手势操作。我们举个简单的例子:比如 touch
接口,就是先调用 DownEvent
,实现点下某个坐标点,然后再调用 SleepEvent
,停顿0.01s, 最后调用 UpEvent
,实现抬起操作,拼接这三个“event”,就组成了1个完整的 touch
操作。
案例1:长按删除某个应用
我们先来分解下长按删除应用的整个操作,首先是长按某个应用不松手,然后再把应用滑动到垃圾桶的位置,最后点击弹窗的确认按钮即可完成删除应用的操作。
如果使用封装好的接口来实现,先使用 long_click
,再使用 swipe
,是完成不了这个任务的。因为 long_click
实现的是 点下-停顿-抬起 的动作,而我们在把应用拖到删除应用的垃圾桶之前,是不能有抬起操作的。
所以对于长按删除应用的操作,我们可以使用 basetouch
里面的4个 "event" 来拼接:
from airtest.core.android.touch_methods.base_touch import * dev = device() # 案例一 # 长按删除应用 longtouch_event = [ DownEvent([908, 892]),# 待删除应用的坐标 SleepEvent(2), MoveEvent([165,285]),# 删除应用的垃圾桶坐标 UpEvent(0)] dev.touch_proxy.perform(longtouch_event) # 取消卸载 poco("android:id/button2").click() 复制代码
案例2:双指点击屏幕的不同坐标
模拟2个手指分别点击屏幕上的不同坐标,然后再松开2个手指。
# 案例二 # 双指点击屏幕 multitouch_event = [ DownEvent([335, 1383], 0), DownEvent([629, 1345], 1), # 第二根手指 SleepEvent(1), UpEvent(0), UpEvent(1)] dev.touch_proxy.perform(multitouch_event) sleep(1.0) 复制代码
案例3:模拟三指滑动
三根手指同时在设备屏幕上滑动一定距离。
# 案例三 # 三指滑动 swipe_event2 = [DownEvent((100, 300), 0), DownEvent((100, 500), 1), DownEvent((100, 700), 2), SleepEvent(0.1)] for i in range(5): swipe_event2.append(MoveEvent((100 + 100*i, 300), 0))# 第一根手指 swipe_event2.append(MoveEvent((100 + 100*i, 500), 1))# 第二根手指 swipe_event2.append(MoveEvent((100 + 100*i, 700), 2))# 第三根手指 swipe_event2.append(SleepEvent(0.2)) swipe_event2.append(UpEvent(0)) swipe_event2.append(UpEvent(1)) swipe_event2.append(UpEvent(2)) dev.touch_proxy.perform(swipe_event2) 复制代码
使用小结
- 使用
DownEvent
、UpEvent
、SleepEvent
和MoveEvent
,可以分别模拟按下、抬起、等待和移动这些基本操作; - 组合使用上述的“event”,可以模拟各种复杂的手势操作;
DownEvent((100, 300), 0)
,坐标后面的0代表第1根手指,依次类推,DownEvent((100, 500), 1)
坐标后面的1代表第2根手指;- 组合使用“event”的常见方式:把1个手势所需要的各个动作按顺序储存到1个列表(例如
swipe_event
)里面,最后使用device().touch_proxy.perform(swipe_event)
去执行这个动作列表,完成手势操作的模拟