參考鏈接:1.2 在Android手機上進行測試
==========================================================================================================
寫在前面:
使用計算器和芒果TV的app自己練手做了 一個簡單的數據頁面
==========================================================================================================
# -*- encoding=utf8 -*-
__author__ = "pc06"
from airtest.core.api import *
# 初始化Poco,非常重要!
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco()
auto_setup(__file__)
# 啟動計算器
#start_app("com.bbk.launcher2")
poco("計算器").child("com.bbk.launcher2:id/item_icon").click()
poco("com.android.bbkcalculator:id/clear").click()
poco("com.android.bbkcalculator:id/digit1").click()
poco("com.android.bbkcalculator:id/plus").click()
poco("com.android.bbkcalculator:id/digit2").click()
poco("com.android.bbkcalculator:id/equal").click()
result = poco('com.android.bbkcalculator:id/input_edit').get_text()
assert_equal(result, '3', '1+2=3 ^^')

1.2 在Android手機上進行測試
1. 連接Android手機
關於Android手機的連接方法,可以查閱我們的設備連接文檔,若在連接過程中遇到問題請查閱FAQ獲取更多幫助。
在成功連上手機后(也就是說,在AirtestIDE中必須要能夠順利看到手機畫面和操作手機,才算是連接成功),我們就可以開始順利地編寫腳本內容了。
指定運行某台手機
假設我們已經熟練掌握連接手機的方法,並且寫出了一個簡單的腳本后,現在我們迫不及待地想要讓腳本在手機上跑起來了,應該怎么做呢?
首先,假如你使用了AndroidIDE,現在想要讓當前腳本在當前連接的手機上運行的話,只需要輕點“運行”按鈕,或者按下快捷鍵F5,就可以看到腳本開始運行了。
其次,在AirtestIDE中點下運行按鈕時,下方的log窗口會打印出一個腳本執行的命令行,類似這樣:
"D:\AirtestIDE\AirtestIDE" runner "untitled.air" --device Android://127.0.0.1:5037/F8UDU16409004135 --log "D:\log"
關於命令行執行腳本的細節,請參閱文檔的腳本運行章節。在這里我們只需要重點關注--device Android://127.0.0.1:5037/F8UDU16409004135這個參數,它將我們想要指定的本機連接的序列號為F8UDU16409004135的手機傳給了Airtest,讓它明白我們需要初始化這台手機。
在連接串Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>里, adbhost是adb server所在主機的ip,adb port默認是5037,serialno是android手機的序列號。更多adb的方面的內容請參考文檔developer.google。
最后,假如我們在命令行運行腳本時並沒有指定手機,我們希望在腳本內通過代碼來連接手機,可以使用connect_device接口:
from airtest.core.api import connect_device # 傳入連接串 dev = connect_device('Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>')
多機協作
在我們編寫的腳本里,支持同時連接多台手機,來編寫一個“多機協作”腳本,例如讓兩台手機登錄同一個APP並相互“添加好友”。
假如我們現在正在使用AirtestIDE編寫腳本,同時連上多台手機,在運行腳本的時候AirtestIDE將會自動添加多個--device參數,把當前連接的手機都告訴腳本,無需其他額外操作。
否則的話,可以直接在腳本里使用多個上述的connect_device語句,分別傳入手機連接串信息即可。
from airtest.core.api import connect_device dev1 = connect_dev("Android://127.0.0.1:5037/serialno1") # 連上第一台手機 dev2 = connect_dev("Android://127.0.0.1:5037/serialno2") # 第二台手機 # 此時設備列表為[dev1, dev2],傳入數字0切換當前操作的手機到第1台 set_current(0) # 切換當前操作的手機到序列號為serialno2的手機 set_current("serialno2")
2. 手機設備的相關操作
我們在Android設備上進行測試時,還可能會需要獲取部分設備/App相關的信息,或是執行ADB指令並獲取輸出結果。在Airtest中,我們除了一些常見接口之外,還封裝了不少Android獨有的接口來方便腳本在Android平台上運行。
例如,我們可能會希望在腳本開始的時候,先將待測APP啟動:
from airtest.core.api import * start_app('package_name')
在這段示例代碼中使用的start_app接口是平台通用的接口,也就是說,不僅僅在Android上可以用來啟動對應的APP,在Windows和iOS平台上也可以用這個接口來啟動對應的應用程序,具體支持的平台信息可以通過查閱start_app接口文檔里的Platforms字段來獲取。
在這里我們只需要使用from airtest.core.api import *這行代碼來將airtest.core.api中定義的API引入,即可使用Airtest封裝好的常用API了。
注意: AirtestIDE中新建腳本時會自動添加這一行,請不要刪除,否則airtest的api將不能使用!
Android設備接口
在上一段教程中我們提到過了可以使用connect_device來連接手機並獲取到連接后的Device對象,我們也可以通過device()接口獲取到當前操作的Device對象進行操作。
接下來的第二個例子是,假如我們想要列出當前已連接的Android手機設備上所有已安裝的APP列表,我們可以這樣寫:
# 獲取當前連接中的手機
dev = device() # 打印出app列表 print(dev.list_app())
例子中所使用到的list_app是airtest.core.android.android中,設備對象Android的獨有接口,我們還封裝了不少常用的安卓操作可供調用,例如install_app,get_top_activity()等,具體可以查閱airtest.core.android.android的文檔。
ADB指令調用
在Android設備的測試腳本中,有時候我們需要輸入一些ADB指令,如果在普通的Python腳本中想要調用ADB指令,也許需要用到subprocess等模塊才能運行指令。
但是在Airtest Project的腳本中,調用ADB指令是非常簡單的事情:
# 對當前設備執行指令 adb shell ls
print(shell("ls")) # 對特定設備執行adb指令 dev = connect_device("Android:///device1") dev.shell("ls") # 切換到某台設備,執行adb指令 set_current(0) shell("ls")
3. 測試Android原生應用
poco支持直接對任何Android原生應用(非游戲引擎、非webview)進行UI層次結構識別,用法上與poco在其他平台上一模一樣。
基於webview的應用比較特殊(如微信小程序或瀏覽器),請見webview應用使用poco指引
准備
在AirtestIDE的Poco Assistant面板中選擇Android模式,此時會自動向手機里安裝 PocoService.apk,以及對應的test apk,並自動啟動PocoService,這個是用來自動抓取 Android上界面層次結構的Service,稍等片刻就可以在AirtestIDE界面中看到UI層次結構。 點擊任意節點可以Log面板中看到其所有屬性並在設備畫面中框出對應位置。
以上即准備好了Android原生應用測試的開發環境,跟着下面的例子即可開始一個最簡單的測試。
例子
點這里下載示例App(calculator),並事先將此App安裝到手機上。
首先必須初始化poco實例,才能使用poco實例的方法進行對象選擇和操作。
下面的例子演示最簡單的功能,點擊calculator的界面,實現一個1+1=2的運算驗證。 這只是一個簡單的例子,更多的poco用法和例子請見poco tutorial
from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco() poco('com.google.android.calculator:id/digit_1').click() poco('com.google.android.calculator:id/op_add').click() poco('com.google.android.calculator:id/digit_1').click() poco('com.google.android.calculator:id/eq').click() result = poco('com.google.android.calculator:id/formula').get_text() self.assertEqual(result, '2', '1+1=2 ^^')
如果連接了多個Android設備,則初始化時需要手動指定設備,不然無法識別需要控制哪一台。 使用airtest.core.api.connect_device 連接指定設備,示例見上一章節。
使用connect_device連接好指定設備后,會返回一個Device對象,將這個對象傳入AndroidUiautomationPoco第一個參數里進行poco的初始化,接下來使用此poco 實例將會獲取所指定的設備的UI和對其進行操作。
from airtest.core.api import connect_device from poco.drivers.android.uiautomation import AndroidUiautomationPoco dev = connect_device('Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>') poco = AndroidUiautomationPoco(dev) # ...
注意事項
需要Android SDK API version ≥ 19,即Android 4.4及以上,越高版本兼容性越好。
在Android原生應用上使用poco不需要配置任何依賴,只需手機處於usb調試模式即可(部分手機需要連同usb安裝、usb模擬點擊等權限一起打開,均位於開發者選項里)。在初始化poco 實例時,會自動向手機里安裝PocoService.apk,如果此時彈出安裝提示,請點擊同意,否則poco無法使用,一共會安裝兩個app進去。
如果PocoService已經裝進去了並且看到了”poco service is running!”的toast,但是仍然無法運行,那可能是還需要打開額外的手機權限,看下手機里有沒有其余的權限設置,參考 文檔。
4. API指引
- 設備操作相關:airtest core API
- 圖像識別相關:airtest doc
- UI選擇與操作:poco doc
