以下基於
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83
首先明確一點,我們今天要講的是Airtest框架的touch(),不是Poco框架的,一般我們說Airtest,其實應該指的是Airtest Project,具體這些概念的關系是什么,可以看之前文章:Airtest Project——UI自動化利器介紹
swipe()的文檔之前在Airtest核心API匯總已經寫過,這里再復制一遍
swipe(v1, v2=None, vector=None, **kwargs)
在當前設備畫面上進行一次滑動操作。
有兩種傳入參數的方式
1swipe(v1, v2=Template(...)) # 從 v1 滑動到 v2
2swipe(v1, vector=(x, y)) # 從 v1 開始滑動,沿着vector方向。
參數:
v1 – 滑動的起點,可以是一個Template圖片實例,或是絕對坐標 (x, y)
v2 – 滑動的終點,可以是一個Template圖片實例,或是絕對坐標 (x, y)
vector – 滑動動作的矢量坐標,可以是絕對坐標 (x,y) 或是屏幕百分比,例如 (0.5, 0.5)
**kwargs – 平台相關的參數 kwargs,請參考對應的平台接口文檔
引發:
Exception – 當沒有足夠的參數來執行滑動時引發異常
返回:
原點位置和目標位置
支持平台:
Android, Windows, iOS
在講實際用法前,我們先來看下swipe()的源碼:
1# 文件位置:your_python_path/site-packages/airtest/core/api.py
2def swipe(v1, v2=None, vector=None, **kwargs):
3 if isinstance(v1, Template):
4 pos1 = loop_find(v1, timeout=ST.FIND_TIMEOUT)
5 else:
6 try_log_screen()
7 pos1 = v1
8
9 if v2:
10 if isinstance(v2, Template):
11 pos2 = loop_find(v2, timeout=ST.FIND_TIMEOUT_TMP)
12 else:
13 pos2 = v2
14 elif vector:
15 if vector[0] <= 1 and vector[1] <= 1:
16 w, h = G.DEVICE.get_current_resolution()
17 vector = (int(vector[0] * w), int(vector[1] * h))
18 pos2 = (pos1[0] + vector[0], pos1[1] + vector[1])
19 else:
20 raise Exception("no enough params for swipe")
21
22 G.DEVICE.swipe(pos1, pos2, **kwargs)
23 delay_after_operation()
24 return pos1, pos2
swipe支持點擊坐標或圖片,所以前兩個參數v既可以是一個Template圖片實例,也可以是一個絕對坐標(x, y)。
-
傳入圖片的情況,如果你是使用的AirtestIDE,只需簡單操作,IDE會自動幫你生成Template實例代碼(swipe在AirtestIDE中的用法可以看AirtestIDE基本功能(一))。如果你不是通過AirtestIDE自動生成代碼,而想自己寫,或者在生成之后還想改下代碼,可以看之前的Template文章Airtest-API精講之Template
-
如果是傳入的絕對坐標,寫成tuple(x,y)或list[x,y]都可以。
第3行if isinstance(v, Template)判斷第一個v是不是Template,如果是圖片,則通過loop_find()找到坐標並賦值給pos1(loop_find的邏輯可以看之前文章Airtest源碼分析--圖像識別整體流程),如果是坐標則直接賦值給pos1。
第9行if v2:判斷有沒有傳v2參數,因為swipe的終點參數可以是v,也可以是一個向量vector。
第10行if isinstance(v2, Template):,如果傳了v2,則判斷v2是不是Template,之后的邏輯同v1一樣。
第14行elif vector:,判斷有沒有傳vector參數。
第15行if vector[0] <= 1 and vector[1] <= 1:,如果傳了vector參數,且是傳的相對坐標,則在第16、17行將相對坐標換算成絕對坐標,賦值給vector。
第18行pos2 = (pos1[0] + vector[0], pos1[1] + vector[1]),將向量絕對坐標(直接傳入或是上面換算的)+v1的絕對坐標,得出pos2基於整個屏幕的絕對坐標。
第20行raise Exception("no enough params for swipe"),既沒有傳入v2,也沒傳入vector,則報錯提示缺少參數。
第22行G.DEVICE.swipe(pos1, pos2, **kwargs),執行當前設備的swipe()方法,Android、Windows、iOS的swipe內部邏輯是不一樣。
第24行return pos1, pos2,返回坐標,這個主要是針對傳入圖片的情況。
從源碼我們可以看出,最基本的swipe,還是分別傳入開始/結束絕對坐標;也支持開始/結束點是圖片的情況;還支持從一個圖片/坐標向一個相對方向滑動,這個相對方向可以是絕對坐標,也可以是相對坐標。
實例演示
以公眾號:測試工程師小站的文章列表為例,開始點是第2篇文章的黃色圖片,結束點是第1篇文章的燈泡圖片


1. 傳入v1是圖片,vector是相對坐標向量
這種方式是AirtestIDE默認的錄制方式,操作方法:點擊‘swipe’按鈕,在手機屏幕上拖動選取要識別的圖片,選擇完后,在向要滑動的地方點擊一下。
這里我就不演示了,放一張以前教學的動圖


操作完之后會生成如下


1# 代碼模式
2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), vector=[0.2117, -0.3541])
AirtestIDE截圖后的圖片名稱都是一串數字,為了好理解,我改了圖片名稱,怎么改圖片名稱可以看這:AirtestIDE高級功能
點擊運行(為了方便查看,我在手機Android開發者選項中打開了坐標顯示)


2. 傳入v1是圖片,vector是絕對坐標向量


在AirtestIDE設置中選中‘實時坐標顯示’,我們可以看到A點(560,1850),B點(820,1030)
那么A點到B點的向量x=820-560=260,A點到B點的向量y=1030-1850=-820,y為什么是負數,請復習初中的坐標系數學知識,你只需要記住如果是往左,x就是負數;往上,y就是負數。
我們只要把算出來的絕對坐標替換掉vector中的相對坐標即可
1# 代碼模式
2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), vector=[260, -820])
3. 傳入v1是絕對坐標,vector是絕對坐標向量
我們只需要把方法2中的v1改成A點絕對坐標即可
1# 代碼模式
2swipe((560,1850), vector=[260, -820])
4.傳入v1是絕對坐標,vector是相對坐標向量
1# 代碼模式
2swipe((560,1850), vector=[0.2117, -0.3541])
5. 傳入v1是圖片,v2是圖片
在AirtestIDE中,我們把vector刪掉,點擊左上截屏按鈕,框選燈泡圖片

1# 代碼模式
2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), Template(r"end.png", record_pos=(0.252, -0.109), resolution=(1080, 2340)))
6. 傳入v1是圖片,v2是絕對坐標
把v2換成絕對坐標,即B點
1# 代碼模式
2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), (820,1030))
7. 傳入v1是絕對坐標,v2是圖片
把v1換成絕對坐標,即A點
1# 代碼模式
2swipe((560,1850), Template(r"end.png", record_pos=(0.252, -0.109), resolution=(1080, 2340)))
8. 傳入v1是絕對坐標,v2是絕對坐標
1# 代碼模式
2swipe((560,1850), (820,1030)
Android和IOS平台
除了上述參數以外,swipe在Android和IOS平台下,還有幾個比較特別的參數:
-
duration – 在屏幕上滑動的時長,默認是0.5
-
steps – 滑動過程中的步數,默認為5
-
fingers – 滑動的手指數量,1或者2,默認為1
示例:滑動3秒,滑動5步,並且用兩只手指滑動
1swipe((150,1000),(900,1200),duration=3,steps=5,fingers=2)

Windows平台
與Android和IOS平台不同的是,Windows平台下的swipe接口只有duration和steps這倆個平台相關的參數;並且duration默認為0.8。
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~

