最近在作IOS自動化測試,IOS的Appium環境都配置OK,執行起來真的慢,慢到懷疑人生,那麼今天就來總結一下IOS定位方式和各個定位方式的速度排序。ios
據我觀察,按查找元素的順序速度,從快到慢的順序以下:git
ios_predicate >> accessibility_id >> class_name >>xpathgithub
注⚠️:(論壇比較多的說法是class_name>>accessibility_id,在這裏咱們姑且認爲它們的速度是同樣的。)正則表達式
type
:元素類型,與className做用一致,如:XCUIElementTypeButton
value
: 通常不用
name
:元素的文本內容,可用做 AccessibilityId定位方式,如:ClearEmail
label
:絕大多數狀況下,與 name 做用一致
enabled
:元素是否可點擊,通常值爲true或者false
visible
;元素是否可見,通常值爲true或者false框架
在 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'
3d
driver.find_element_by_ios_predicate("value>100")
code
2)範圍運算符:IN、BETWEEN
可用於數值和字符串的範圍覈對
如:value BETWEEN {1,6}
或 value IN {'Clear','Email'}
blog
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'")
替代之前的name
定位方式,在 iOS 上,主要使用元素的label
或name
(兩個屬性的值都同樣)屬性進行定位,如該屬性爲空,也是不能使用該屬性。
driver.find_element_by_accessibility_id('ClearEmail')
使用元素的type
屬性定位,特別注意該屬性的惟一性!class_name
惟一的狀況並很少,通常狀況下用不上。
driver.find_element_by_class_name('XCUIElementTypeButton')
因爲 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')]")
以上,對你有幫助的話,點贊❤️吧~~
歡迎關注個人簡書,博客,TesterHome,Github~~~