一、在AirtestIDE里連接Android手機
使用AirtestIDE對Android應用進行自動化測試時,第一步就需要連接Android設備。
設備的支持情況
目前支持市面上幾乎絕大多數Android手機、Android模擬器
設備連接的特殊選項設置
有少數非手機的Android設備(例如智能電視、智能后視鏡等),直接點擊connect
按鈕不能連接,但是可以嘗試通過勾選connect
下拉菜單中的選項來嘗試連接。
例如,我們的默認連接方式不支持模擬器,因此在連接模擬器時,需要先勾選Use Javacap
選項(部分品牌模擬器還要同時勾選Use ADB orientation
)。這里connect
下拉菜單的三個選項,是截屏、旋轉和點擊的三個備選方案,在默認方案無法生效的時候,使用這3個備選方案可能就可以支持設備了。
注意:部分品牌手機不支持某個功能,可能僅僅只是因為選項沒有開啟,例如小米手機必須要開啟了允許模擬點擊
才能夠在AirtestIDE中使用默認方式點擊手機(速度更快,效果更好)。如果是正常的手機設備,遇到問題時請盡量先查閱文檔排查問題。這幾個備選方案的效率都比默認方案低,只有部分特殊的Android設備才需要使用到備選方案。
每個接口支持的平台可能各不相同,而Android支持的接口是最全面、最豐富的。基本上airtest.core.api
中的接口(
# 清理某個應用數據 clear_app("org.cocos2d.blackjack") # 啟動某個應用 start_app("org.cocos2d.blackjack") # 傳入某個按鍵響應 keyevent("BACK")
Android設備接口
除了在airtest.core.api
中提供的跨平台接口之外,Android設備對象還有很多內置的接口可以調用,可以在
dev = device() # 獲取到當前設備的Android對象 print(dev.get_display_info()) # 查看當前設備的顯示信息 print(dev.list_app()) # 打印出當前安裝的app列表
ADB指令調用
在Android設備的測試腳本中,有時候我們需要輸入一些ADB
指令,如果在普通的Python腳本中想要調用ADB
指令,也許需要用到subprocess
等模塊單獨啟動進程運行命令行才能實現。
但是在Airtest腳本中,調用ADB指令是非常簡單的事情:
# 對當前設備執行指令 adb shell ls print(shell("ls")) # 對特定設備執行adb指令 dev = connect_device("Android:///device1") dev.shell("ls") # 切換到某台設備,執行adb指令 set_current(0) shell("ls")
三、啟動安卓APP
1.方式一:
通過touch方法點擊
touch(Template(r"tpl1621082666068.png", record_pos=(0.362, 0.017), resolution=(720, 1280)))
2.方式二:
通過APP的包名打開,包名就類似人的身份證,用來唯一標識身份使用的
a.查看app的包名
查看APP包名分兩種情況:
-
應用已經安裝到手機
adb shell dumpsys window w | findstr \/ | findstr name= 或 adb shell dumpsys window |findstr mCurrent 或 adb shell "dumpsys window w|grep \/|grep name=|sed 's/mSurface=Surface(name=//g'|sed 's/)//g'|sed 's/ //g'"
-
已經獲得了apk安裝包,通過安卓sdk自帶的aapt工具實現
D:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging D:\bainianaolai.apk
b.代碼實現
# -*- encoding=utf8 -*- __author__ = "11200" from airtest.core.api import * auto_setup(__file__) #百年奧萊包名 bainianaolai = "com.yunmall.lc" #根據包名 停止抖音 stop_app(bainianaolai) #回到桌面 home() #列出當前設置中所有的包名,存放為一個字典 d = device() all_package = d.list_app() if bainianaolai in all_package: start_app(bainianaolai)
四、實戰:百年奧萊登錄操作
# -*- encoding=utf8 -*- from airtest.core.api import * from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) #百年奧萊包名 bainianaolai = "com.yunmall.lc" #根據包名 停止抖音 stop_app(bainianaolai) #回到桌面 home() #列出當前設置中所有的包名,存放為一個字典 d = device() all_package = d.list_app() if bainianaolai in all_package: start_app(bainianaolai) sleep(1.0) #點擊 我 poco(name="com.yunmall.lc:id/tab_me").click() #點擊 選擇 已有賬戶 去登錄 poco(name="android.widget.ImageView").click() #輸入用戶名,注意先需要點擊一下,需要輸入的內容,聚焦到該元素,然后在輸入內容 username = poco(name="com.yunmall.lc:id/logon_account_textview") username.click() username.set_text("Auguses") #輸入密碼,同用戶名輸入一樣 password = poco(resourceId="com.yunmall.lc:id/logon_password_textview") password.click() password.set_text("qweasd1234") #點擊 登錄 按鈕 poco(name="com.yunmall.lc:id/logon_button").click() sleep(3) #獲取用戶名 get_text() 可以獲取選擇中元素的文本信息 name = poco(name="com.yunmall.lc:id/tv_user_nikename").get_text() #斷言 assert_equal(name, "Auguses") #點擊 設置按鈕 poco(name="com.yunmall.lc:id/ymtitlebar_left_btn_image").click() #向下滑動 #swipe(Template(r"tpl1621086981253.png", record_pos=(-0.344, 0.849), resolution=(720, 1280)), vector=[0.0228, -0.7056]) poco.swipe([0.5,0.8],[0.5,0.2]) #點擊 退出 按鈕 poco(name="com.yunmall.lc:id/setting_logout").click() #確認退出 poco(name="com.yunmall.lc:id/ymdialog_right_button").click()