如果你還想從頭學起Appium,可以看看這個系列的文章哦!
https://www.cnblogs.com/poloyy/category/1693896.html
前言
前面介紹過根據id,classname, accessibilityid,xpath來定位元素,其他這些方法底層都是利用了 UI Automator 的 API 功能實現的
UI Automator 介紹
- UI Automator 測試框架提供了一組 API 來構建 UI 測試,用於在用戶應用和系統應用中執行交互
- 利用 UI Automator API,可以打開“設置”菜單或應用啟動器等操作
- UI Automator 測試框架非常適合編寫黑盒自動化測試,其中的測試代碼不依賴於目標應用的內部
UI Automator 提供的功能
- 自帶的元素定位工具
- 在設備上檢索狀態信息並執行操作的API
- 支持跨應用 UI 測試的API
UI Automator 訪問設備狀態
UI Automator 測試框架提供了一個 UiDevice 類,用於在 app 運行的設備上進行訪問和執行等操作,它提供了以下操作
- 更改設備旋轉
- 按D-pad按鈕
- 按返回、主屏幕、菜單按鈕
- 打開通知欄
- 對當前窗口進行屏幕截圖
更多的 UI Automator API
利用 UI Automator API,可以編寫穩健可靠的測試,而無需了解目標應用的實現詳情
下面將列出常見的類,它們都是在 android.support.test.uiautomator 這個庫下的
類 | 類名 | 作用 |
UiDevice | 設備封裝類 | 上面說到的,獲取設備信息和設備交互 |
UiObject | 所有空間抽象類 | 表示設備上可見的一個Android控件 |
UiSelector | 控制選擇器 | 在設備上查詢一個或多個目標 UI 元素 |
Configurator | 配置基類 | 設置運行 UI Automator 測試所需的關鍵參數 |
UiScrollable | 滾動控件 | 當目標控件存在於屏幕之外時使用 |
UiCollection | 控件集合 | 控件遍歷,枚舉容器的 UI 元素以便計算子元素個數 |
划重點
- 其中 UiSelector 在 appium 自動化代碼選擇元素時候直接使用到的
- 用來生成一個定位器來選擇界面中的控件元素,可以通過text,content-desc,class,和一些狀態信息來進行條件過濾
-
UiSelector 類似於 appium中 find_element_by_xxx() 方法中函數值
- UiSelector官方文檔:https://developer.android.google.cn/reference/android/support/test/uiautomator/UiSelector
難點
- 使用 UI Automator API,需要寫Java 代碼哦!
- 當然如果沒有基礎的話,記住對應的語法格式就行
UiSelector 的栗子
Java語法
new UiSelector().resourceId(“io.manong.developerdaily:id/tv_tab_title”)
結合Appium 的用法
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label")')
還是結合boss直聘 app 做例子哦
環境要求:Android
代碼
# 此處省略配置代碼... # 通過resourceId test = driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label")') print(test.text) # 通過text test = driver.find_element_by_android_uiautomator('new UiSelector().text("附近")') print(test.text) # 通過className test = driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView")') print(test.text)
輸出結果
推薦
附近
自動化測試
UiSelector 還可以通過哪些方法來定位元素
基本上除了xpath之外,可以通過appium實現的元素定位方式,UIAutomator也有,因為底層就是靠他實現的
xpath 雖然沒有直接對應的方法,但是像下面這種 xpath 寫法,UIAutomator 也有對應的方法
- // :表示任意后代關系
- x[n] : 表示第幾個子節點
小栗子
# 正常appium寫法 test = driver.find_elements_by_id("com.hpbr.bosszhipin:id/tv_tab_label")[1] # 結合uiautomator寫法 test = driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.hpbr.bosszhipin:id/tv_tab_label").enabled(true).instance(1)')
emmm...兩種寫法得到的結果是一樣的,但第二種寫法有點復雜就是了...太長了
UI Automator 的總結
- 當 Appium 封裝的方法無法滿足你的需求的時候可以嘗試用 UI Automator API 去解決問題
- 但不建議,在日常工作中全都用 UI Automator API,學習成本 & 編寫成本 & 維護成本都會高很多(當然,你想裝逼也不是不可以)