Appium自動化(10) - appium高階元素定位方式之 UI Automator API 的詳解

小菠蘿測試筆記發表於2020-05-20

如果你還想從頭學起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 元素以便計運算元元素個數

劃重點

難點

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

相關文章