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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM