IOS定位方式和各個定位方式的速度排序,正則匹配(轉發)
轉發,僅供學習參考
按查詢元素的順序速度,從快到慢的順序如下:
ios_predicate >> accessibility_id >> class_name >>xpath
注⚠️:(論壇比較多的說法是class_name>>accessibility_id,在這裡我們姑且認為它們的速度是一樣的。)
1、元素屬性介紹
image.png
type
:元素型別,與className作用一致,如:XCUIElementTypeButtonvalue
: 一般不用name
:元素的文字內容,可用作 AccessibilityId定位方式,如:ClearEmaillabel
:絕大多數情況下,與 name 作用一致enabled
:元素是否可點選,一般值為true或者falsevisible
;元素是否可見,一般值為true或者false
2、ios_predicate
在 iOS 的 UI 自動化中,使用原生支援的Predicate定位方式是最好,可支援元素的單個屬性和多個屬性定位,強烈推薦使用。
使用方法,舉例如下:
driver.find_element_by_ios_predicate("value == 'ClearEmail'")
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
1)比較運算子:>、<、==、>=、<=、!=
可用於數值和字串的比較:
如:value>100
或value == 'ClearEmail'
或value != 'ClearEmail'
driver.find_element_by_ios_predicate("value>100")
2)範圍運算子:IN、BETWEEN
可用於數值和字串的範圍核對
如:value BETWEEN {1,6}
或value IN {'Clear','Email'}
driver.find_element_by_ios_predicate("value BETWEEN {1,6}")
3)字串相關:CONTAINS、BEGINSWITH、ENDSWITH
包含某個字串,如:value CONTAINS 'Email'
以某個字串開頭,如:value BEGINSWITH 'Clear'
以某個字串結束,如:value ENDSWITH '班級Email'
driver.find_element_by_ios_predicate("value CONTAINS 'Email'")
4)萬用字元:LIKE
其中:?
代表一個字元,*
代表多個字元
如:一個元素的value屬性為ClearEmail:value LIKE 'Clear?mail'
value LIKE 'Clear*'
以上這麼多種文字都可以被識別為同一個元素。
driver.find_element_by_ios_predicate("value LIKE 'Clear*'")
5)正則表示式:MATCHES
如:一個元素的value屬性為ClearEmail:value MATCHES '^C.+l$'
driver.find_element_by_ios_predicate("value MATCHES '^C.+l$'")
注⚠️:正則表示式詳情可參考我的另一篇文章《Python-正則表示式》
6)兩種及兩種以上屬性定位元素:AND
單個屬性定位用符號AND連線起來即可,如下:
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
3、accessibility_id
替代以前的name
定位方式,在 iOS 上,主要使用元素的label
或name
(兩個屬性的值都一樣)屬性進行定位,如該屬性為空,也是不能使用該屬性。driver.find_element_by_accessibility_id('ClearEmail')
4、class_name
使用元素的type
屬性定位,特別注意該屬性的唯一性!class_name
唯一的情況並不多,一般情況下用不上。driver.find_element_by_class_name('XCUIElementTypeButton')
5、xpath
由於 iOS 10開始使用的 XCUITest 框架原生不支援,定位速度很慢,所以官方現在不推薦大家使用,也有其他替代的定位方式可使用。
1)使用絕對路徑定位:driver.find_element_by_xpath('/XCUIElementTypeApplication/XCUIElementTypeButton')
2)使用相對路徑定位driver.find_element_by_xpath('//XCUIElementTypeButton')
3)通過元素的索引定位driver.find_element_by_xpath('//XCUIElementTypeButton[index]')
4.通過元素的屬性定位
一種屬性:driver.find_element_by_xpath("//className[@value='ClearEmail']")
兩種屬性:driver.find_element_by_xpath("//className[@value='ClearEmail'][@ visible =true]")
部分屬性(最強大):driver.find_element_by_xpath("//className[contains(@value,'ClearEmail')]")