Airtest簡單上手講解


Airtest是網易開發的手機UI界面自動化測試工具,它原本的目的是通過所見即所得,截圖點擊等等功能,簡化手機App圖形界面測試代碼編寫工作。

安裝和使用

安裝Airtest
從Airtest官網:https://airtest.netease.com下載Airtest,然后像安裝普通軟件一樣安裝即可。安裝過程沒有什么需要特別說明的地方。Airtest已經幫你打包好了開發需要的全部環境,所以安裝完成Airtest以后就能夠直接使用了。

Airtest運行以后的界面如下圖所示。

連接手機
以Android手機為例,由於Airtest會通過adb命令安裝兩個輔助App到手機上,再用adb命令通過控制這兩個輔助App進而控制手機,因此首先需要確保手機的adb調試功能是打開的,並允許通過adb命令安裝App到手機上。

啟動Airtest以后,把Android手機連接到電腦上,點擊下圖方框中的refresh ADB:

此時在Airtest界面右上角應該能夠看到手機的信息,如下圖所示。(本人以mumu模擬器為例)

點擊connect按鈕,此時可以在界面上看到手機的界面,並且當你手動操作手機屏幕時,Airtest中的手機畫面實時更新。如下圖所示。

對於某些手機,例如小米,在第一次使用Airtest時,請注意手機上將會彈出提示,詢問你是否允許安裝App,此時需要點擊允許按鈕。

打開雪球股票app
先通過一個簡單的例子,來看看如何快速上手Airtest,稍后再來詳解。

例如我現在想使用電腦控制手機,打開雪球股票app。

此時,點擊下圖中方框框中的touch按鈕:

此時,把鼠標移動到Airtest右邊的手機屏幕區域,鼠標會變成十字型。在雪球股票app圖標的左上角按下鼠標左鍵不放,並拖到雪球股票app右下角松開鼠標。此時請注意中間代碼區域發生了什么變化,如下圖所示。

好了。以上就是你需要使用電腦打開雪球股票app所要進行的全部操作。

點擊上方工具欄中的三角形圖標,運行代碼,如下圖所示。

代碼運行完成以后,雪球股票app被打開了。

界面介紹

在有了一個直觀的使用以后,我們再來介紹一下Airtest的界面,將會更加有針對性。

Airtest的界面如下圖所示。

這里,我把Airtest分成了A-F6個區域,他們的功能如下:

  • A區:常用操作功能區
  • B區:Python代碼編寫區
  • C區:運行日志區
  • D區:手機屏幕區
  • E區:App頁面布局信息查看區
  • F區:工具欄

A區是常用的基於圖像識別的屏幕操作功能,例如:

  • touch: 點擊屏幕元素
  • swipe: 滑動屏幕
  • exists: 判斷屏幕元素是否存在
  • text: 在輸入框中輸入文字
  • snashot: 截圖
    ……

一般來說,是點擊A區里面的某一個功能,然后在D區屏幕上進行框選操作,B區就會自動生成相應的操作代碼。

B區用來顯示和編寫Python代碼。在多數情況下,不需要手動寫代碼,因為代碼會根據你在手機屏幕上面的操作自動生成。只有一些需要特別定制化的動作才需要修改代碼。

D區顯示了手機屏幕,當你操作手機真機時,這個屏幕會實時刷新。你也可以直接在D區屏幕上使用鼠標操作手機,你的操作動作會被自動在真機上執行。

F區是一些常用工具,從左到右,依次為:

  1. 新建項目
  2. 打開項目
  3. 保存項目
  4. 運行代碼
  5. 停止代碼
  6. 查看運行報告

其中1-5很好理解,那么什么是查看運行報告呢?

當你至少運行了一次以后,點擊這個功能,會自動給你打開一個網頁。網頁如下圖所示,這是你的代碼的運行報告,詳細到每一步操作了什么元素。

通過截圖功能操作手機雖然方便,但是截圖涉及到分辨率的問題,代碼不能在不同的手機上通用。所以對於A區的功能,做點簡單操作即可,不用深入了解。

更高級的功能,需要通過E區實現。

基於App布局信息操作手機

初始化代碼
App的布局信息就像網頁的HTML一樣,保存了App上面各個元素的相對位置和各個參數。對於一個App而言,在不同分辨率的手機上,可能相同的元素有着不同的坐標點,但是這個元素的屬性參數一般是不會變的。因此,如果使用元素的屬性參數來尋找並控制這個元素,就能實現在不同分辨率手機上的精確定位。

App的布局信息的格式與App的開發環境有關。點擊F區的下拉菜單,可以看到這里能夠指定不同的App開發環境。其中的Unity、Cocos-*等等一般是做游戲用的,Android是安卓原生App,iOS是蘋果的App……如下圖所示。

同樣以雪球股票APP為例,由於它是Android原生的App,所以在F區下拉菜單選擇Android,此時注意B區彈出提示,詢問你是否要插入poco初始代碼到當前輸入光標的位置,點擊Yes,如下圖所示。

此時,B區自動插入了一段代碼,如下圖所示。

定位並點擊
現在,點擊E區的鎖形圖標,如下圖所示。

鎖形圖標激活以后,你再操作D區的屏幕,點擊雪球股票App下面的雪球股票四個字,會發現屏幕上被點擊的App並不會打開。但E區和C區卻發生了變化,如下圖所示。

其中E區顯示的樹狀結構就是當前屏幕的布局信息,這與Chrome開發者工具里面顯示的HTML結構如出一轍。C區顯示的是當前被我點中的元素的信息。

請注意在這些元素信息中,有一個text屬性,它的值為雪球股票。那么,這個屬性就可以作為一個定位元素,於是可以在B區編寫代碼:

poco(text="雪球股票").click()

寫完代碼以后運行程序,可以看到雪球股票App被打開了。如下圖所示。

注意,如果你發現手機真機顯示的界面與Airtest屏幕顯示的手機界面不一致,可能是因為Airtest的屏幕被你鎖定了。在F區點一下鎖形圖標,取消鎖定,Airtest中的手機屏幕就會更新了。

定位並輸入
打開知乎以后,我想使用雪球股票的搜索功能,那么繼續,把鎖形圖標激活,然后點擊雪球股票頂部的搜索框,如下圖所示:

繼續看C區顯示的搜索框屬性,可以看到這里有一個name屬性,它的值是com.xueqiu.android:id/tv_banner。所以此時需要使用name這個屬性。

常見的基本上不會變化的屬性包含但不限於:name type resourceId package

另外還有一點,知乎首頁的這個搜索框,實際上是不能輸入內容的,當你點擊以后,會跳轉到另一個頁面,如下圖所示。

因此你需要先點擊一下這個輸入框,跳轉到真正的搜索界面:

poco(name="com.xueqiu.android:id/tv_banner").click()

在真正的搜索界面如下圖所示。

可以看到,name屬性的值依然是com.xueqiu.android:id/search_input_text,,還有一個text屬性,它的值為招商銀行去年凈利同比增四個點 。能不能像前面打開雪球一樣,使用text這個屬性呢?也行,也不行。說它行,是因為你這么做確實現在能工作;說它不行,因為這是雪球的熱門搜索關鍵詞,隨時會改變。你今天使用這一句話成功了,明天熱門關鍵詞變化了,那么你的代碼就無法使用了,所以此時需要使用name這個屬性。

輸入內容使用的方法為set_text,用法為:

poco(name="com.xueqiu.android:id/search_input_text").set_text('alibaba')

定位並篩選
輸入了搜索關鍵詞以后,再來看看當前頁面,搜索出現了6個結果:



通過對比這幾個結果的屬性信息,發現他們的name屬性都是相同的,而text不同。如果像下面這樣寫點擊動作:

poco(name="com.xueqiu.android:id/name").click()

那么默認就會點擊第一個搜索結果。
如果我想點擊第二個搜索結果怎么辦呢?可以這樣寫代碼:

poco(name='com.xueqiu.android:id/name', text='阿里巴巴-SW ').click()

或者你也可以像列表一樣使用索引定位:

poco(name='com.xueqiu.android:id/name')[1].click()

這兩種寫法的前提,都是我們已經知道了每個結果分別是什么。假設現在我就想搜索阿里巴巴,但我不知道搜索結果是第幾項,又應該怎么辦呢?此時還可以使用正則表達式:

poco(name='com.xueqiu.android:id/name', textMatches='^阿里巴巴*$').click()

滑動屏幕
進入搜索結果以后,需要查看下面的各種即如果,此時就需要不斷向上滑動屏幕。這里有一點需要特別注意,Airtest只能獲取當前屏幕上的元素布局信息,不在屏幕上的內容是無法獲取的。
滑動屏幕使用的命令為swipe,滑動屏幕需要使用坐標信息。但這種坐標和屏幕分辨率無關。這里的坐標定義為:(x, y),其中x為橫坐標,y為縱坐標。屏幕左上角為(0, 0),屏幕右下角為(1, 1),從左向右,橫坐標從0逐漸增大到1,從上到下,縱坐標從0逐漸增大到1。

現在我要把屏幕向上滑動,那么在真機上面,我是先按住屏幕下方,然后把屏幕向上滑動,所以代碼可以這樣寫:

# poco.swipe(起點坐標,終點左邊)
poco.swipe([0.5, 0.8], [0.5, 0.2])


在一般情況下:

向上滑動,只需要改動縱坐標,且起點值大於終點值
向下滑動,只需要改動縱坐標,且起點值小於終點值
向左滑動,只需要改動橫坐標,且起點值大於終點值
向右滑動,只需要改動橫坐標,且起點值小於終點值

單獨使用Python控制手機

在Airtest操作手機雖然方便,但是不可能在每一台電腦上都安裝Airtest吧。所以需要想辦法把代碼從Airtest這個程序中分離出來。
Airtest基於Python的一個開源庫Poco開發,而在Airtest的B區寫的Python代碼,實際上就是Poco的代碼。所以只要安裝Poco庫,就可以在Python中直接控制手機。
安裝Poco庫的命令為:

pip install pocoui

這個庫依賴的東西有點多,安裝稍稍慢一些。安裝完成以后,我們把代碼復制到PyCharm中,如下圖所示。


運行這段代碼,如果是Linux或者macOS的用戶,請注意看運行結果是不是有報錯,提示adb沒有運行權限。這是因為隨Poco安裝的adb沒有運行權限,需要給它添加權限,在終端執行命令:

# chmod +x 報錯信息中給出的adb地址

chmod +x /usr/local/lib/python3.9/site-packages/airtest/core/android/static/adb/mac/adb (實際執行時請換成你的地址)

命令運行完成以后再次執行代碼,可以看到代碼運行成功,手機被成功控制了,如下圖所示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM