使用過 Appium 的都知道,元素的定位方式有很多種属提,具體使用哪一種权逗,主要看業(yè)務(wù)的需要和自己的使用愛好。下面總結(jié)一下冤议,Appium 到底有哪些定位方式斟薇,定位的元素以下面截圖指定的元素為例子:
這里給 Macaca 的 inspector 查看器打個廣告,的確很好用恕酸,有需要可到社區(qū)的 Macaca 版塊自己查找翱氨酢!
Appium 的定位方式種類
我說的定位方式都是基于我自己親測過蕊温,沒使用或比較少用的就在這里不列舉了袱箱,如有錯誤的地方,請多多包涵义矛!常用的定位方式(僅限 Android 和 iOS 兩種系統(tǒng))有 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 框架原聲不支持,定位速度很慢鞭达,所以官方現(xiàn)在不推薦大家使用司忱,也有其他替代的定位方式可使用皇忿。
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 上梳玫,主要使用元素的label或name(兩個屬性的值都一樣)屬性進行定位铺峭,如該屬性為空,如該屬性為空汽纠,也是不能使用該屬性卫键。
MobileBy.AccessibilityId("更多信息")
AndroidUIAutomator
僅支持 Android 4.2或以上,可支持元素的單個屬性和多個屬性定位虱朵,推薦使用莉炉。
一種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發(fā)送\")")
兩種屬性:MobileBy.AndroidUIAutomator("new UiSelector().text(\"發(fā)送\").clickable(true)")
元素的所有屬性都可用做定位,功能非常強大碴犬,且速度很快絮宁。
iOSNsPredicateString
僅支持 iOS 10或以上,可支持元素的單個屬性和多個屬性定位服协,推薦使用绍昂。
一種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton'")
兩種屬性:MobileBy.iOSNsPredicateString("type == 'XCUIElementTypeButton' AND label == '更多信息'")
具體 iOSNsPredicate語法結(jié)構(gòu)可查看官方文檔,或查看的這個帖子:iOS 定位方式 iOSNsPredicateString 詳解偿荷。
iOSClassChain
僅支持 iOS 10或以上窘游,這是 github 的 Mykola Mokhnach 大神開發(fā),僅限在 WebDriverAgent 框架使用跳纳,用于替代 xpath 的忍饰,但使用一陣子后,感覺靈活性沒有 xpath 和 iOSNsPredicate 好寺庄,應該還不完善吧艾蓝。具體使用方法,請見:https://github.com/appium/appium-xcuitest-driver/pull/391?斗塘。
MobileBy.iOSClassChain('XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]')
IosUIAutomation
僅支持 iOS 9.3或以下赢织,是 iOS 舊框架 UIAutomation 的定位方式,現(xiàn)在基本上很少使用馍盟,這個定位類型同樣可使用 iOS 謂詞進行定位于置,詳細可參考:iOSNsPredicate
總結(jié):
以上這個多定位方式,很少說全部用完朽合。根據(jù)我的經(jīng)驗俱两,推薦使用:Android:AndroidUIAutomator > className = id = AccessibilityId > xpath饱狂。iOS:iOSNsPredicateString > className = AccessibilityId