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
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。

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章