分享 1 個模擬各種複雜的滑動或手勢操作的方法,趕緊學起來~

fishfish-yu發表於2020-11-04

此文章來源於專案官方公眾號:“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

相關文章