https://segmentfault.com/a/1190000010205649
由于使用id睬辐、className溉委、AccessibilityId定位方式較為簡單瓣喊,多數(shù)情況下,在同一個頁面藻三,都不是唯一存在的洪橘,不能識別一個元素跪者。而 xpath定位方式在 xcui 底層原生不支持,由 appium 額外支持的熄求,定位速度很慢渣玲,而且有時候定位不到元素的情況存在。綜上所述弟晚,在 iOS 的 UI 自動化中忘衍,使用原生支持的iOSNsPredicateString定位方式是最好,支持也是最好的卿城。
定位方式
僅支持 iOS 10或以上(底層需要使用 XCUITest 框架)枚钓,可支持元素的單個屬性和多個屬性定位,推薦使用瑟押。一個元素有這些屬性:type搀捷、value、name多望、label嫩舟、enabled怀偷、visible,有些元素的屬性只有以上的部分屬性晋渺,如下圖所示随静,可根據(jù)這些屬性進行元素定位恋捆。
元素屬性的介紹
type:元素類型,與className作用一致愤钾,如:XCUIElementTypeStaticText
value: 一般不用
name:元素的文本內(nèi)容,可用作 AccessibilityId定位方式败玉,如:測試420班級群
label:絕大多數(shù)情況下谦疾,與 name 作用一致
enabled:元素是否可點擊六剥,一般值為true或者false
visible:元素是夠可見,一般值為true或者false
定位方式
元素的定位方式都是一個屬性+運算符+值形式存在
比較運算符:>,<,==,>=,<=,!=
可用于數(shù)值和字符串的比較,
如:name>100 或name == '測試'
范圍運算符:IN,BETWEEN
可用于數(shù)值和字符串的范圍核對
如:name BETWEEN {3,10},name IN {'Alan','May'}
字符串相關:CONTAINS、BEGINSWITH擦囊、ENDSWITH
包含某個字符串查剖,如:label CONTAINS '測試'
以某個字符串開頭弹砚,如:label BEGINSWITH '420'
以某個字符串結(jié)束桌吃,如:label ENDSWITH '班級群'
PS:在三個關鍵字后加上[c]不區(qū)分大小寫瑟俭,可用于字母的校驗;[d]不區(qū)分發(fā)音符號,即沒有重音符號($、#肃续、%等)畦韭;[cd]即不區(qū)分大小寫衍慎,也不區(qū)分發(fā)音符號赠法,如:name CONTAINS[c] ABcd和name CONTAINS abcd侧纯、name CONTAINS ABCD是等同的,注意后面兩個沒帶[c]的不相等
通配符:LIKE
通配符也接受[cd]拳缠,?代表一個字符哲鸳,*代表多個字符
如:一個元素的label屬性為
label LIKE '420測試班級群'
label LIKE '420測?班級群'
label LIKE '420??班級群'
label LIKE '42懒豹?測試班蝴乔?群'
label LIKE '*試班級群'
label LIKE '420測試班*'
label LIKE '42*級群'
label LIKE '4*試*群'
以上這么多種文本都可以被識別為同一個元素。
正則表達式:MATCHES
如:以4開頭,以群結(jié)束,
label MATCHES '^4.+群$'
PS:具體正則表達式語法篡诽,請百度一下,你就知道
以一種屬性定位元素
可以用元素的屬性:type板丽、value啃憎、name、label、enabled集绰、visible倒慧,進行定位:
type == XCUIElementTypeStaticText,
label CONTAINS '測試'
label LIKE '*試班級群'
enabled == true
visible == false
以兩種或兩種以上屬性定位元素
就是以上單個屬性定位用符號AND連接起來即可炫贤。如:
type == XCUIElementTypeStaticText AND label CONTAINS '測試
type == XCUIElementTypeStaticText AND label CONTAINS '測試' AND enabled == true