1 前言
由於使用id、className、AccessibilityId定位方式較爲簡單,多數情況下,在同一個頁面,都不是唯一存在的,不能識別一個元素。而 xpath定位方式在 xcui 底層原生不支持,由 appium 額外支持的,定位速度很慢,而且有時候定位不到元素的情況存在。綜上所述,在 iOS 的 UI 自動化中,使用原生支持的iOSNsPredicateString定位方式是最好,支持也是最好的。
2 定位方式
iOS 版本全支持,底層測試框架無論是XCUITest 或 UIAutomation,可支持元素的單個屬性和多個屬性定位,推薦使用。一個元素有這些屬性:type、value、name、label、enabled、visible,有些元素的屬性只有以上的部分屬性,如下圖所示,可根據這些屬性進行元素定位。
3 元素屬性的介紹
type:元素類型,與className作用一致,如:XCUIElementTypeStaticText
value: 一般不用
name:元素的文本內容,可用作 AccessibilityId定位方式,如:測試420班級羣
label:絕大多數情況下,與 name 作用一致
enabled:元素是否可點擊,一般值爲true或者false
visible:元素是否可見,一般值爲true或者false
4 元素定位方式
元素的定位方式都是一個屬性+運算符+值形式存在
1、比較運算符:>,<,==,>=,<=,!=
可用於數值和字符串的比較,
如:name>100 或name == '測試'
2、範圍運算符:IN,BETWEEN
可用於數值和字符串的範圍覈對
如:name BETWEEN {3,10},name IN {'Alan','May'}
3、字符串相關:CONTAINS、BEGINSWITH、ENDSWITH
包含某個字符串,如:label CONTAINS '測試'
以某個字符串開頭,如:label BEGINSWITH '420'
以某個字符串結束,如:label ENDSWITH '班級羣'
PS:在三個關鍵字後加上[c]不區分大小寫,可用於字母的校驗;[d]不區分發音符號,即沒有重音符號($、#、%等);[cd]即不區分大小寫,也不區分發音符號,如:name CONTAINS[c] ABcd和name CONTAINS abcd、name CONTAINS ABCD是等同的,注意後面兩個沒帶[c]的不相等
4、通配符: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*試*羣'
以上這麼多種文本都可以被識別爲同一個元素。
5、正則表達式:MATCHES
如:以4開頭,以羣結束,
label MATCHES '^4.+羣$'
5 以一種屬性定位元素
可以用元素的屬性:type、value、name、label、enabled、visible,進行定位:
type == XCUIElementTypeStaticText,
label CONTAINS '測試'
label LIKE '*試班級羣'
enabled == true
visible == false
6 以兩種或兩種以上屬性定位元素
就是以上單個屬性定位用符號AND連接起來即可。如:
type == XCUIElementTypeStaticText AND labelCONTAINS '測試
type == XCUIElementTypeStaticText AND labelCONTAINS '測試' AND enabled == true
7 使用方法
// 等於
MobileElement photo = driver.findElementByIosNsPredicate("name= ‘head new‘");
// 模糊匹配
MobileElement photo =driver.findElementByIosNsPredicate("name LIKE ‘*new‘");
// 正則表達式匹配
MobileElement photo = driver.findElementByIosNsPredicate("nameMATCHES ‘^$‘");
// 包含
List<IOSElement> items1 = driver.findElementsByIosNsPredicate("nameCONTAINS ‘我的‘");
// 以"我的"開始
List<IOSElement> items2 = driver.findElementsByIosNsPredicate("nameBEGINSWITH ‘我的‘");
// 以"我的"開始並且以"消息"結尾
List<IOSElement> items3 = driver.findElementsByIosNsPredicate("nameBEGINSWITH ‘我的‘ && name ENDSWITH ‘消息‘");
其中屬性名參照inspector的屬性字段,關鍵字LIKE,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH必須是大寫,匹配的字符需要用單引號
參考資料:
https://testerhome.com/topics/9405
http://www.mamicode.com/info-detail-1839942.html
作者作品:
《Selenium、Appium、OkHttp自動化測試實戰》
https://yuedu.baidu.com/ebook/1e229edbbdeb19e8b8f67c1cfad6195f302be803
《Selenium、Appium、Requests自動化測試實戰Python版》
https://yuedu.baidu.com/ebook/fd0737a709a1284ac850ad02de80d4d8d05a0160
《Fiddler使用教程》
https://yuedu.baidu.com/ebook/eb57a65de97101f69e3143323968011ca300f73d