Appium 同一個元素不同定位方式的區別

前言

使用過 Appium 的都知道,元素的定位方式有很多種,具體使用哪一種,主要看業務的需要和自己的使用愛好。下面總結一下,Appium 到底有哪些定位方式,定位的元素以下面截圖指定的元素為例子:

inspector

Appium 的定位方式種類

我說的定位方式都是基于我自己親測過,沒使用或比較少用的就在這里不列舉了,如有錯誤的地方,請多多包涵!常用的定位方式(僅限 Android 和 iOS 兩種系統)有 className、id、xpath、AccessibilityId、AndroidUIAutomator、iOSNsPredicateString、iOSClassChain、IosUIAutomation等

className

使用元素的className屬性定位,支持:Android 和 iOS,推薦使用。
MobileBy.className("XCUIElementTypeButton")

id

使用元素的Resource Id屬性定位,支持:Android,僅支持 Android 4.3或以上,推薦使用。反正我沒有在 iOS 用過,大家有正確使用過的例子,可以分享一下。
MobileBy.id("package.name:id/android")

xpath

支持:Android 和 iOS。但由于 iOS 10開始使用的 XCUITest 框架原聲不支持,定位速度很慢,所以官方現在不推薦大家使用,也有其他替代的定位方式可使用。

  1. 使用絕對路徑定位,如截圖所顯示的 xpath 路徑
    MobileBy.xpath("className/className/className/className")

  2. 使用相對路徑定位
    MobileBy.xpath("http://className")

  3. 通過元素的索引定位
    MobileBy.xpath("http://className[index]")

  4. 通過元素的屬性定位
    一種屬性:MobileBy.xpath("http://className[@label='更多信息']")
    兩種屬性:MobileBy.xpath("http://className[@label='更多信息'][@isVisible='1']")
    部分屬性(最強大):MobileBy.xpath("http://className[contains(@label,'更多')]")

AccessibilityId

替代以前的name定位方式,推薦使用。
在 Android 上,主要使用元素的content-desc屬性,如該屬性為空,不能使用此定位方式。
在 iOS 上,主要使用元素的labelname(兩個屬性的值都一樣)屬性進行定位,如該屬性為空,如該屬性為空,也是不能使用該屬性。
MobileBy.AccessibilityId("更多信息")

AndroidUIAutomator

僅支持 Android 4.2或以上,可支持元素的單個屬性和多個屬性定位,推薦使用。
一種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發送\")")
兩種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發送\").clickable(true)")
元素的所有屬性都可用做定位,功能非常強大,且速度很快。

iOSNsPredicateString

僅支持 iOS 10或以上,可支持元素的單個屬性和多個屬性定位,推薦使用。
一種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton'")
兩種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND label == '更多信息'")
具體 iOSNsPredicate語法結構可查看官方文檔,或期待我下一個帖子。

iOSClassChain

僅支持 iOS 10或以上,這是 github 的 Mykola Mokhnach 大神開發,僅限在 WebDriverAgent 框架使用,用于替代 xpath 的,但使用一陣子后,感覺靈活性沒有 xpath 和 iOSNsPredicate 好,應該還不完善吧。具體使用方法,請見:iOSClassChain
MobileBy.iOSClassChain('XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]')

IosUIAutomation

僅支持 iOS 9.3或以下,是 iOS 舊框架 UIAutomation 的定位方式,現在基本上很少使用。這個定位類型同樣可使用 iOS 謂詞進行定位,詳細可參考:iOSNsPredicate

總結:

以上這個多定位方式,很少說全部用完。根據我的經驗,推薦使用:Android:AndroidUIAutomator > className = id = AccessibilityId > xpath。iOS:iOSNsPredicateString > className = AccessibilityId

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,472評論 25 708
  • @DC_ing 貝聊 移動開發部 測試菜鳥 前言 相信大家在使用 Appium 時,都會遇到過一個問題,怎么更好地...
    貝聊科技閱讀 2,038評論 0 7
  • 前言 相信大家在使用 Appium 時,都會遇到過一個問題,怎么更好地在一個頁面中對某一個元素進行更快速的定位方式...
    DC_ing閱讀 5,073評論 6 7
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,251評論 4 61
  • (補3.3滴)今天如我所愿辦理好了離職手續,下午用心的用藍色太陽水擦拭自己用的電腦、電腦主機、鍵盤、鼠標、辦公桌、...
    Jocelynwang閱讀 261評論 0 0