专栏文章 分享 1 个模拟各种复杂的滑动或手势操作的方法,赶紧学起来~

fishfish-yu · 2020年11月04日 · 最后由 fishfish-yu 回复于 2020年11月12日 · 5760 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

滑动操作千千万,你是否会遇到过使用 swipedrag_to 都实现不了的滑动情况?或者你有没有为手势操作不知道如何模拟而苦恼的时候呢?

比如模拟长按删除操作,再比如模拟安卓的多指手势操作等等,这些操作用 swipedrag_to 等方法,都不能满足大家的实际需求。

所以今天想跟大家一起来学习下 airtest 的 basetouch 模块。这个模块提供了很多 底层的 点击、滑动等操作,用这个模块的方法或者类,我们可以轻松模拟出各种 自定义 的点击、滑动甚至其它手势操作。下文我们将详细了解下这个模块以及如何在实际的应用场景中使用这个模块。

basetouch 模块介绍

我们常使用的 minitouchmaxtouch ,其共同的底层操作都来自于 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 操作。

PS:以下案例都基于 airtest1.1.6,请同学们将 IDE 更新到最新的 1.2.6 版本,或者使用本地环境的同学请将本地环境的 airtest 更新到最新的 1.1.6 版本。

案例 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)

使用小结

  • 使用 DownEventUpEventSleepEventMoveEvent,可以分别模拟按下、抬起、等待和移动这些基本操作;
  • 组合使用上述的 “event”,可以模拟各种复杂的手势操作;
  • DownEvent((100, 300), 0) ,坐标后面的 0 代表第 1 根手指,依次类推, DownEvent((100, 500), 1) 坐标后面的 1 代表第 2 根手指;
  • 组合使用 “event” 的常见方式:把 1 个手势所需要的各个动作按顺序储存到 1 个列表(例如swipe_event)里面,最后使用 device().touch_proxy.perform(swipe_event)去执行这个动作列表,完成手势操作的模拟

Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

共收到 12 条回复 时间 点赞

查了半天,也不知道怎么解决
(getattr(self.touch_method, "METHOD_NAME", ""), name))
NotImplementedError: MINITOUCH does not support perform method

masterKLB 回复

所用运行环境的 airtest 版本是最新的 1.1.6 吗

3楼 已删除
fishfish-yu 回复

升级到 1.1.6 才 OK,文章应该说下的
另外我试了好几台机器,用了案例 1 的代码,显示效果都是这样的,拉动了下拉框的第一行

masterKLB 回复

那段代码不是通用的,根据设备应用详情,自己需要做相应的改动

fishfish-yu 回复

查了下跟代码好像问题不大,一直报的是 Note: device /dev/input/mouse0 is not supported by libevdev

masterKLB 回复

看起来是设备的问题,具体什么设备方便反馈?

fishfish-yu 回复

我本身是一家 POS 厂商,会报
Note: device /dev/input/mouse0 is not supported by libevdev
Note: device /dev/input/mice is not supported by libevdev
也试了小米平板 4,会报:
Note: device /dev/input/mice is not supported by libevdev

masterKLB 回复

小米平板 4 的安卓版本是多少?这个大概率是 minitouch 不支持,pos 设备的话,可能跟真正的安卓设备还是存在差异的

fishfish-yu 回复

MIUI 10.3.2| 稳定版

masterKLB 回复

我想知道安卓版本呢?MIUI 是 10.3.2,安卓 10 还是 11.或者是别的?

fishfish-yu 回复

安卓 8.1.0

masterKLB 回复

检查下小米有个设置叫允许模拟点击的开没,这个会有影响,看着 MIUI 版本和安卓版本都是没啥问题的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册