如果你還想從頭學起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,學習成本 & 編寫成本 & 維護成本都會高很多(當然,你想裝逼也不是不可以)