前言:
最近在做IOS自動(dòng)化測(cè)試撬呢,IOS的Appium環(huán)境都配置OK,執(zhí)行起來真的慢虱疏,慢到懷疑人生惹骂,那么今天就來總結(jié)一下IOS定位方式和各個(gè)定位方式的速度排序。
據(jù)我觀察做瞪,按查找元素的順序速度对粪,從快到慢的順序如下:
ios_predicate >> accessibility_id >> class_name >>xpath
注??:(論壇比較多的說法是class_name>>accessibility_id,在這里我們姑且認(rèn)為它們的速度是一樣的。)
1装蓬、元素屬性介紹
type
:元素類型著拭,與className作用一致,如:XCUIElementTypeButton
value
: 一般不用
name
:元素的文本內(nèi)容牍帚,可用作 AccessibilityId定位方式儡遮,如:ClearEmail
label
:絕大多數(shù)情況下,與 name 作用一致
enabled
:元素是否可點(diǎn)擊暗赶,一般值為true或者false
visible
鄙币;元素是否可見,一般值為true或者false
2蹂随、ios_predicate
在 iOS 的 UI 自動(dòng)化中十嘿,使用原生支持的Predicate定位方式是最好,可支持元素的單個(gè)屬性和多個(gè)屬性定位岳锁,強(qiáng)烈推薦使用绩衷。
使用方法,舉例如下:
driver.find_element_by_ios_predicate("value == 'ClearEmail'")
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
1)比較運(yùn)算符:>、<唇聘、==版姑、>=、<=迟郎、!=
可用于數(shù)值和字符串的比較:
如:value>100
或value == 'ClearEmail'
或 value != 'ClearEmail'
driver.find_element_by_ios_predicate("value>100")
2)范圍運(yùn)算符:IN剥险、BETWEEN
可用于數(shù)值和字符串的范圍核對(duì)
如:value BETWEEN {1,6}
或 value IN {'Clear','Email'}
driver.find_element_by_ios_predicate("value BETWEEN {1,6}")
3)字符串相關(guān):CONTAINS、BEGINSWITH宪肖、ENDSWITH
包含某個(gè)字符串表制,如:value CONTAINS 'Email'
以某個(gè)字符串開頭,如:value BEGINSWITH 'Clear'
以某個(gè)字符串結(jié)束控乾,如:value ENDSWITH '班級(jí)Email'
driver.find_element_by_ios_predicate("value CONTAINS 'Email'")
4)通配符: LIKE
其中:?
代表一個(gè)字符么介,*
代表多個(gè)字符
如:一個(gè)元素的value屬性為ClearEmail:
value LIKE 'Clear?mail'
value LIKE 'Clear*'
以上這么多種文本都可以被識(shí)別為同一個(gè)元素。
driver.find_element_by_ios_predicate("value LIKE 'Clear*'")
5)正則表達(dá)式:MATCHES
如:一個(gè)元素的value屬性為ClearEmail:
value MATCHES '^C.+l$'
driver.find_element_by_ios_predicate("value MATCHES '^C.+l$'")
注??:正則表達(dá)式詳情可參考我的另一篇文章《Python-正則表達(dá)式》
6)兩種及兩種以上屬性定位元素:AND
單個(gè)屬性定位用符號(hào)AND連接起來即可,如下:
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
3蜕衡、accessibility_id
替代以前的name
定位方式壤短,在 iOS 上,主要使用元素的label
或name
(兩個(gè)屬性的值都一樣)屬性進(jìn)行定位慨仿,如該屬性為空久脯,也是不能使用該屬性。
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 框架原生不支持牢硅,定位速度很慢蹬耘,所以官方現(xiàn)在不推薦大家使用,也有其他替代的定位方式可使用减余。
1)使用絕對(duì)路徑定位:
driver.find_element_by_xpath('/XCUIElementTypeApplication/XCUIElementTypeButton')
2)使用相對(duì)路徑定位
driver.find_element_by_xpath('//XCUIElementTypeButton')
3)通過元素的索引定位
driver.find_element_by_xpath('//XCUIElementTypeButton[index]')
4.通過元素的屬性定位
一種屬性:
driver.find_element_by_xpath("http://className[@value='ClearEmail']")
兩種屬性:
driver.find_element_by_xpath("http://className[@value='ClearEmail'][@ visible =true]")
部分屬性(最強(qiáng)大):driver.find_element_by_xpath("http://className[contains(@value,'ClearEmail')]")
以上婆赠,對(duì)你有幫助的話,點(diǎn)贊??吧~~
歡迎關(guān)注我的簡(jiǎn)書,博客,TesterHome,Github~~~