iOS 定位方式 iOSNsPredicateString 詳解

NO IMAGE

iOS 定位方式 iOSNsPredicateString 詳解

前言

由於使用idclassNameAccessibilityId定位方式較為簡單,多數情況下,在同一個頁面,都不是唯一存在的,不能識別一個元素。而 xpath定位方式在 xcui 底層原生不支援,由 appium 額外支援的,定位速度很慢,而且有時候定位不到元素的情況存在。綜上所述,在 iOS 的 UI 自動化中,使用原生支援的iOSNsPredicateString定位方式是最好,支援也是最好的。

定位方式

僅支援 iOS 10或以上(底層需要使用 XCUITest 框架),可支援元素的單個屬性和多個屬性定位,推薦使用。一個元素有這些屬性:typevaluenamelabelenabledvisible,有些元素的屬性只有以上的部分屬性,如下圖所示,可根據這些屬性進行元素定位。
inspector

元素屬性的介紹

type:元素型別,與className作用一致,如:XCUIElementTypeStaticText
value: 一般不用
name:元素的文字內容,可用作 AccessibilityId定位方式,如:測試420班級群
label:絕大多數情況下,與 name 作用一致
enabled:元素是否可點選,一般值為true或者false
visible:元素是夠可見,一般值為true或者false

定位方式

元素的定位方式都是一個屬性 運算子 值形式存在

  1. 比較運算子:>,<,==,>=,<=,!=
    可用於數值和字串的比較,
    如:name>100name == '測試'

  2. 範圍運算子:IN,BETWEEN
    可用於數值和字串的範圍核對
    如:name BETWEEN {3,10}name IN {'Alan','May'}

  3. 字串相關:CONTAINSBEGINSWITHENDSWITH
    包含某個字串,如:label CONTAINS '測試'
    以某個字串開頭,如:label BEGINSWITH '420'
    以某個字串結束,如:label ENDSWITH '班級群'
    PS:在三個關鍵字後加上[c]不區分大小寫,可用於字母的校驗;[d]不區分發音符號,即沒有重音符號($、#、%等);[cd]即不區分大小寫,也不區分發音符號,如:name CONTAINS[c] ABcdname CONTAINS abcdname 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. 群$'

    PS:具體正規表示式語法,請百度一下,你就知道

以一種屬性定位元素

可以用元素的屬性:typevaluenamelabelenabledvisible,進行定位:

type == XCUIElementTypeStaticText,
label CONTAINS '測試'
label LIKE '*試班級群'
enabled == true
visible == false

以兩種或兩種以上屬性定位元素

就是以上單個屬性定位用符號AND連線起來即可。如:

type == XCUIElementTypeStaticText AND label CONTAINS '測試
type == XCUIElementTypeStaticText AND label CONTAINS '測試' AND enabled == true