Appium - iOS 定位方式 iOSNsPredicate 詳解

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章