airtest實現安卓app自動化測試


一、在AirtestIDE里連接Android手機

使用AirtestIDE對Android應用進行自動化測試時,第一步就需要連接Android設備。安裝好驅動、打開手機里的開發者選項允許USB調試選項后,用USB線連上手機並在AirtestIDE中嘗試連接。有些品牌手機有專屬的選項需要另行開啟(例如小米、Vivo/Oppo),請同樣查閱對應品牌的注意事項來避免問題。

設備的支持情況

目前支持市面上幾乎絕大多數Android手機Android模擬器

設備連接的特殊選項設置

有少數非手機的Android設備(例如智能電視、智能后視鏡等),直接點擊connect按鈕不能連接,但是可以嘗試通過勾選connect下拉菜單中的選項來嘗試連接。

例如,我們的默認連接方式不支持模擬器,因此在連接模擬器時,需要先勾選Use Javacap選項(部分品牌模擬器還要同時勾選Use ADB orientation)。這里connect下拉菜單的三個選項,是截屏、旋轉和點擊的三個備選方案,在默認方案無法生效的時候,使用這3個備選方案可能就可以支持設備了。

注意:部分品牌手機不支持某個功能,可能僅僅只是因為選項沒有開啟,例如小米手機必須要開啟了允許模擬點擊才能夠在AirtestIDE中使用默認方式點擊手機(速度更快,效果更好)。如果是正常的手機設備,遇到問題時請盡量先查閱文檔排查問題。這幾個備選方案的效率都比默認方案低,只有部分特殊的Android設備才需要使用到備選方案。

二、Android平台專屬功能與接口

每個接口支持的平台可能各不相同,而Android支持的接口是最全面、最豐富的。基本上airtest.core.api中的接口(文檔地址),在Android平台上都可以直接使用,例如:

# 清理某個應用數據
clear_app("org.cocos2d.blackjack")
# 啟動某個應用
start_app("org.cocos2d.blackjack")
# 傳入某個按鍵響應
keyevent("BACK")

Android設備接口

除了在airtest.core.api中提供的跨平台接口之外,Android設備對象還有很多內置的接口可以調用,可以在airtest.core.android.android module這個文檔中查閱到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()


免責聲明!

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



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