使用過 Appium 的都知道,元素的定位方式有不少種,具體使用哪種,主要看業務的須要和本身的使用愛好。下面總結一下,Appium 到底有哪些定位方式,定位的元素如下面截圖指定的元素爲例子:android
這裏給 Macaca 的 inspector 查看器打個廣告,的確很好用,有須要可到社區的 Macaca 版塊本身查找啊!git
我說的定位方式都是基於我本身親測過,沒使用或比較少用的就在這裏不列舉了,若有錯誤的地方,請多多包涵!經常使用的定位方式(僅限 Android 和 iOS 兩種系統)有 className、id、xpath、AccessibilityId、AndroidUIAutomator、iOSNsPredicateString、iOSClassChain、IosUIAutomation等github
使用元素的className
屬性定位,支持:Android 和 iOS,推薦使用。MobileBy.className("XCUIElementTypeButton")
app
使用元素的Resource Id
屬性定位,支持:Android,僅支持 Android 4.3或以上,推薦使用。反正我沒有在 iOS 用過,你們有正確使用過的例子,能夠分享一下。MobileBy.id("package.name:id/android")
框架
支持:Android 和 iOS。但因爲 iOS 10開始使用的 XCUITest 框架原聲不支持,定位速度很慢,因此官方如今不推薦你們使用,也有其餘替代的定位方式可以使用。ui
使用絕對路徑定位,如截圖所顯示的 xpath 路徑spa
`MobileBy.xpath("className/className/className/className")`
使用相對路徑定位code
`MobileBy.xpath("//className")`
經過元素的索引定位blog
`MobileBy.xpath("//className[index]")`
經過元素的屬性定位索引
一種屬性:`MobileBy.xpath("//className[@label='更多信息']")` 兩種屬性:`MobileBy.xpath("//className[@label='更多信息'][@isVisible='1']")` 部分屬性(最強大):`MobileBy.xpath("//className[contains(@label,'更多')]")`
替代之前的name
定位方式,推薦使用。
在 Android 上,主要使用元素的content-desc屬性
,如該屬性爲空,不能使用此定位方式。
在 iOS 上,主要使用元素的label
或name
(兩個屬性的值都同樣)屬性進行定位,如該屬性爲空,如該屬性爲空,也是不能使用該屬性。MobileBy.AccessibilityId("更多信息")
僅支持 Android 4.2或以上,可支持元素的單個屬性和多個屬性定位,推薦使用。
一種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發送\")")
兩種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發送\").clickable(true)")
元素的全部屬性均可用作定位,功能很是強大,且速度很快。
僅支持 iOS 10或以上,可支持元素的單個屬性和多個屬性定位,推薦使用。
一種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton'")
兩種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND label == '更多信息'")
具體 iOSNsPredicate語法結構可查看官方文檔,或期待我下一個帖子。
僅支持 iOS 10或以上,這是 github 的 Mykola Mokhnach 大神開發,僅限在 WebDriverAgent 框架使用,用於替代 xpath 的,但使用一陣子後,感受靈活性沒有 xpath 和 iOSNsPredicate 好,應該還不完善吧。具體使用方法,請見:https://github.com/appium/app... 。MobileBy.iOSClassChain('XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]')
僅支持 iOS 19.3或如下,是 iOS 舊框架 UIAutomation 的定位方式,如今基本上不多使用
總結:以上這個多定位方式,不多說所有用完。根據個人經驗,推薦使用:Android:AndroidUIAutomator > className = id = AccessibilityId > xpath。iOS:iOSNsPredicateString > className = AccessibilityId