1. 程式人生 > 其它 >Airtest API精講之swipe()

Airtest API精講之swipe()

上期回顧:Airtest API精講之touch()


以下基於
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
2defswipe(v1,v2=None,vector=None,**kwargs):
3ifisinstance(v1,Template):
4pos1=loop_find(v1,timeout=ST.FIND_TIMEOUT)
5else:
6try_log_screen()
7pos1=v1
8
9ifv2:
10ifisinstance(v2,Template):
11pos2=loop_find(v2,timeout=ST.FIND_TIMEOUT_TMP)
12else:
13pos2=v2
14elifvector:
15ifvector[0]<=1andvector[1]<=1:
16w,h=G.DEVICE.get_current_resolution()
17vector=(int(vector[0]*w),int(vector[1]*h))
18pos2=(pos1[0]+vector[0],pos1[1]+vector[1])
19else:
20raiseException("noenoughparamsforswipe")
21
22G.DEVICE.swipe(pos1,pos2,**kwargs)
23delay_after_operation()
24returnpos1,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。

---------------------------------------------------------------------------------

關注微信公眾號即可在手機上查閱,並可接收更多測試分享~