一:環境準備
硬體裝置:windows電腦
軟體:pycharm/藍疊或閃電模拟器/SDK manager
閃電模拟器下載下傳連結:https://www.ldmnq.com/?n=6000&bd_vid=11623493887955105097
二:自動化腳本編寫前需要掌握的基礎
python基礎
- 變量
- 變量常用的資料類型(字元串/int/dict/list)的聲明和調用,以及資料了類型間的轉換
- 函數(帶參函數/不帶參函數/有傳回值/沒有傳回傳回值)的聲明與調用
- 開源庫的安裝、調用
- 判斷語句與for循環
2. 常用的adb指令
(1)檢視已連接配接的裝置清單:adb devices
(2)開啟或關閉ADB服務:
開啟:adb start-server
結束:adb kill-server
(3)連接配接裝置:adb connect IP 斷開裝置:adb disconnect IP
如果是USB連接配接,直接會連接配接ADB,如果是想通過網絡連接配接(有線或者無線),則需要在同一個區域網路 ,通過裝置的ip位址連接配接即可。
(4) 安裝/解除安裝apk
安裝apk adb install -r apk路徑
常用參數說明:
- t 允許測試包
- l 鎖定該應用程式
- s 把應用程式安裝到sd卡上
- g 為應用程式授予所有運作時的權限
- r 替換已存在的應用程式,也就是說強制安裝
- d 允許進行将見狀,也就是安裝的比手機上帶的版本低
解除安裝apk adb uninstall apk包名
(5)抓取日志 logcat
常用參數說明
"-s"選項 : 隻顯示指定标簽的日志; ------>adb logcat -s SWVDEC 顯示SWVDEC标簽的日志
"-v"選項 : 設定日志的輸出格式;----->adb logcat -v threadtime 檢視日志輸出時間和線程資訊
"-c"選項 : 清空所有的日志緩存資訊;---->adb logcat -c
"-d"選項 : 将緩存的日志輸出到螢幕上, 并且不會阻塞;------->adb logcat -d
"-t"選項 : 輸出最近的幾行日志, 輸出完退出, 不阻塞;------>adb logcat -t 5 輸出日志緩沖區的最近5行
- 擷取cpu占用 :top
常用參數說明:
-m num Maximum number of processes to display. 最多顯示多少個程序
-n num Updates to show before exiting. 重新整理次數
-d num Seconds to wait between updates. 重新整理間隔時間(預設5秒)
-s col Column to sort by (cpu,vss,rss,thr). 按哪列排序
-t Show threads instead of processes. 顯示線程資訊而不是程序
- 擷取記憶體占用:dumpsys meminfo
擷取指定應用的記憶體 dumpsys meminfo 包名
- 擷取應用程序号 ps
(9) 從手機中拉取資訊到本地電腦上 adb pull <手機路徑> <本機路徑>
從本地電腦推送資訊到手機上 adb push <本機路徑> <手機路徑>
(10) 擷取目前運作的Activity
adb shell dumpsys activity | findstr/grep "mFocusedActivity"
(11) adb 截圖指令: screencap 儲存圖檔檔案路徑
(12) adb 錄屏指令: screenrecord 儲存視訊檔案路徑(預設錄制時間和最長錄制時間都是 180 秒)
常用參數說明
--size WIDTH*HEIGHT 視訊的尺寸,如1280*720,預設是螢幕分辨率
--bit-rate RATE 視訊的比特率,預設4Mbps
--time-limit TIME 錄制時長,機關:秒
三:自動化UI腳本編寫流程
模拟器配置
- 模拟器系統配置
性能設定選項設定為手機版/720*1280,如下圖所示
機型設定都一緻選擇MI 9(個别機型可能存在相容性bug,友善統一解決問題),如下圖所示
其他設定中開啟ROOT權限和ADB調試,如下圖所示
然後“儲存設定”,會提示重新開機系統才會生效,重新開機系統後,在cmd視窗中,輸入:adb devices,顯示如下資訊,證明連接配接成功。
然後安裝我們要測試的apk
安裝uiautomator(用來做xpath值擷取的工具)
(1)安裝uiautomator2庫
pip install --pre uiautomator2
pip install pillow (如果需要截圖,可安裝這個庫)
(2)安裝atx-agent
# init就是所有USB連接配接電腦的手機上都安裝uiautomator2
python -m uiautomator2 init
# 指定手機安裝uiautomator2, 用 --mirror
python -m uiautomator2 init --mirror --serial $SERIAL
# 嫌棄慢的話,可以用國内的鏡像
python -m uiautomator2 init --mirror
最後提示success,代表atx-agent初始化成功。
(3)安裝Weditor
pip install -U weditor
安裝好之後,就可以在指令行運作 weditor --help 确認是否安裝成功了。
Windows系統可以使用指令(weditor --shortcut)在桌面建立一個快捷方式,
如下圖所示:
啟動weditor的方式
方法1.指令行直接輸入 weditor 會自動打開浏覽器,輸入裝置的ip或者序列号,點選Connect即可;
方法2.桌面上輕按兩下WEditor快捷方式即可;
方法3.指令行中執行 python -m weditor
uiautomator常用API
參考教程https://vic.kim/2019/05/20/UIAutomator2%E7%9A%84%E4%BD%BF%E7%94%A8/
截至這裡,各種環境已經安裝完畢!
需求/用例熟悉
我們看2條注冊子產品的用例:
用例編号 | 子產品 | 預置條件 | 操作步驟 | 期望結果 | 測試結果 |
1 | 注冊 | 網絡正常 |
| 2.彈出toast,提示注冊成功,跳轉到登入頁面 | |
2 | 注冊 | 網絡正常 | 1.輸入已經注冊過的賬号和密碼 2.點選注冊 | 2.彈出賬号已經注冊的toast提示 |
拆解操作步驟,結果判斷等
操作步驟:打開app,點選注冊按鈕,然後定位到賬号和密碼文本框分别做出對應的操作
判斷:注冊成功後,彈出注冊成功後,會跳轉到登入頁面,重複注冊隻是給出toast提示
以上是操作步驟和預期結果,在實際工作中,我們還需要在問題出現的時候,截屏或錄屏并給開發抓取log,最好還要給出執行用例的時間。
操作步驟如下
然後我們用代碼實作如下圖:
import os
import time
import uiautomator2 as us
#導入uiautomator2庫 as是取個别名叫us
#通過連接配接執行個體化拿到裝置類
driver=us.connect_usb()
#通過包名啟動app
#錄制螢幕
os.system("start adb shell screenrecord --time-limit 60 /sdcard/test2.mp4 ")
driver.app_start('com.example.wenhaotest')#引号内為包名稱
time.sleep(5)
#通過xpath定位到注冊按鈕并點選
#driver.xpath('//*[@resource-id="com.example.wenhaotest:id/btn1"]').click()
driver.xpath('//*[@resource-id="com.example.wenhaotest:id/btn2"]').click()
time.sleep(5)
#當注冊頁面的某個xpath出現後,我們通過xpath定位到賬号和密碼并輸入對應的内容,然後點選注冊按鈕
if driver.xpath('//*[@resource-id="com.example.wenhaotest:id/register_button"]').exists:
#通過xpath定位到賬号輸入内容
driver.xpath('//*[@resource-id="com.example.wenhaotest:id/register_user"]').set_text("1kobe_brant2")
#通過xpath定位到密碼輸入内容
driver.xpath('//*[@resource-id="com.example.wenhaotest:id/register_mm"]').set_text("8888888888")
#通過xpath定位到注冊按鈕并點選
driver.xpath('//*[@resource-id="com.example.wenhaotest:id/register_button"]').click()
#硬等待
#通過登入頁面唯一xpath值定位,确認是否跳轉,如登入頁面有登入按鈕
#通過對應函數擷取app彈出的toast内容
textContent=driver.toast.get_message()
print(textContent)
# 硬等待
time.sleep(5)
if(driver.xpath('//*[@resource-id="com.example.wenhaotest:id/btn1"]').exists and str(textContent) == "注冊成功"):
print("pass")
# 抓取日志
os.system('adb logcat -t 100000 >> "C:\\Users\\LENOVO\\Desktop\\test1.log" ')
else:
print("failed")
#抓取日志
os.system('adb logcat -t 100000 >> "C:\\Users\\LENOVO\\Desktop\\test1.log" ')