1. 程式人生 > 其它 >八、UI自動化移動端

八、UI自動化移動端

UI自動化APP

環境介紹

  • 模擬器
    • 模擬真機和android作業系統
  • adb
    • 谷歌公司提供的安卓系統除錯工具
  • appium
    • 移動端自動化測試, 連線adb一個工具
  • Appium-Python-Client
    • 在python中的一個包, 作用是通過python代表編寫自動化測試指令碼

adb常用命令

adb devices

  • 顯示或者連線到android系統
adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
emulator-5554   offline      
# 檢測到了一個裝置, offline離線(裝置存在, 但並沒有連線到adb), 
# 解決辦法, 再次執行adb devices
List of devices attached
emulator-5554   device  
# 顯示device,代表連線裝置成功

獲取app的包名和介面名

  • 每個app都有一個包名
  • 一個app中不同的介面都有自己的介面名
  • 在移動端自動化測試中, 如果要測試一個app,那麼就一定要知道這個app的包名和介面名
adb shell dumpsys window windows | findstr mFocusedApp
  • 檢視tpshopApp的包名和介面名
第一步: 在安卓中啟動app
第二步: 在windows的cmd中執行如下命令:
adb shell dumpsys window windows | findstr mFocusedApp
mFocusedApp=AppWindowToken{5c9352d token=Token{c2ef044 ActivityRecord{aaedd57 u0 com.tpshop.malls/.SPMainActivity t5
  • 包名com.tpshop.malls
  • 介面名.SPMainActivity

安卓檔案與windows的同步

adb pull

  • 把安卓中的檔案, 下載的windows
adb pull 安卓的檔案路徑檔名 windows的檔案存放路徑
adb pull /default.prop c:\file
# 把安卓根目錄下的檔案default.prop, 下載到windows的c盤file目錄裡
adb pull /lib/libz.so c:\file
# 把安卓根目錄的lib目錄下的檔案libz.so, 下載到windows的c盤file目錄裡

adb push

  • 把windows的檔案上傳到安卓
adb push windows的檔案路徑 安卓的檔案位置
adb push c:\file\a.txt /sdcard
# 把windos上的c盤file目錄下的a.txt上傳到安卓的根目錄的sdcard裡

adb啟動指定的app

adb shell am start -W 包名/介面名
adb shell am start -W com.tpshop.malls/.SPMainActivity # 啟動tpshop
Status: ok
Activity: com.tpshop.malls/.SPMainActivity
ThisTime: 3662    # 介面啟動需要的時間
TotalTime: 3662   # 包啟動需要的時間
WaitTime: 3786    # 安卓為啟動app需要的時間
Complete  # 完成

檢視安卓系統日誌

  • adb logcat

adb安裝和解除安裝app

  • adb install apk檔案所在的路徑
adb install c:\file\tn3180.apk  # 安裝c盤file目錄裡的tn3180.apk這個安裝檔案
  • adb uninstall 包名
adb uninstall com.tencent.news  # 把包com.tencent.news解除安裝

重啟adb服務

  • adb kill-server 關閉服務
  • adb start-server 啟動服務
adb後臺有個服務程序, 有時候這個程序會工作出問題, 通過以上兩個命令, 可以重啟adb的服務

檢視adb幫助

  • adb --help

基礎操作

入門程式碼

from appium import webdriver
import time


dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 隨便填一個值, 但不能空
         "unicodeKeyboard":True, # 中文支援
        "resetKeyboard":True, # 中文支援
         "appPackage":"com.android.settings", # 啟動的包名
         "appActivity":".Settings" # 介面名
         }
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.find_element_by_id("dashboard_tile").click()
time.sleep(5)
driver.quit()

啟動指定包和介面

  • driver.start_activity(包名, 介面名)
# 開啟通訊錄
driver.start_activity("com.android.contacts", ".activities.PeopleActivity")

獲取包名和介面名

  • driver.current_package # 包名
  • driver.current_activity # 介面名
print(driver.current_package)
print(driver.current_activity)

關閉驅動和app

  • 關閉app後驅動物件還可以繼續控制
driver.close_app()

安裝和解除安裝app

  • 判斷是否安裝指定app
    • driver.is_app_installed("包名")
  • 安裝app
    • driver.install_app(r"apk檔案路徑")
  • 解除安裝app
    • driver.remove_app("包名")
if driver.is_app_installed("com.tencent.news"): 
    driver.remove_app("com.tencent.news") # 如果已經安裝騰訊新聞, 解除安裝
else:
    driver.install_app(r"C:\app\TencentNews_3180.apk") # 如果沒有安裝騰訊新聞, 安裝

應用置於後臺

  • driver.background_app(秒數)
driver.background_app(3)

定位元素

定位單個元素

  • id定位
    • driver.find_element_by_id(resource-id屬性值)
  • class定位
    • driver.find_element_by_class_name(class屬性值)
  • name定位
    • driver.find_element_by_accessibility_id(content-desc屬性)
  • 當定位到多個符合條件的元素時,預設返回第一個

定位多個元素

  • 定位一組元素時, 返回資料型別為列表
# 1.點選系統設定中的WLAN
# 2.點選WLAN中的開關按鈕
from appium import webdriver
import time
dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 隨便填一個值, 但不能空
         "unicodeKeyboard":True, # 中文支援
        "resetKeyboard":True, # 中文支援
         "appPackage":"com.android.settings",
         "appActivity":".Settings"}
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.find_element_by_id("dashboard_tile").click()
time.sleep(2)
driver.find_element_by_id("switch_widget").click() # 點選WLAN開關
# 如果有多個id為"dashboard_tile"的元素, 點選第二個
# driver.find_elements_by_id("dashboard_tile")[1].click()
time.sleep(5)
driver.quit()

總結