Appium iOS萬能的定位方式--Predicate(iOSNsPredicate)
所謂Predicate定位即Java-Client -5.0.版本以及Appium-Python-Client 0.31版本更新後增加的新的定位方式:
舉個例子:
JAVA代碼:
//輸入賬號和密碼 driver.findElementByIosNsPredicate("value ==‘11‘").sendKeys("[email protected]"); driver.findElementByIosNsPredicate("name == ‘login_default_icon‘").click(); driver.findElementByIosNsPredicate("value ==‘請輸入登錄密碼‘").sendKeys("1111"); driver.findElementByIosNsPredicate("name == ‘login_default_icon‘").click(); driver.findElement(By.id("登錄")).click();
Python代碼:
//輸入賬號和密碼 driver.find_element_by_ios_predicate("value ==‘11‘").sendKeys("[email protected]"); driver.find_element_by_ios_predicate("name == ‘login_default_icon‘").click(); driver.find_element_by_ios_predicate("value ==‘請輸入登錄密碼‘").sendKeys("1111"); driver.find_element_by_ios_predicate("name == ‘login_default_icon‘").click(); driver.find_element_by_id("登錄")).click();
由於使用id
、className
、AccessibilityId
定位方式較為簡單,多數情況下,在同一個頁面,都不是唯一存在的,不能識別一個元素。而 xpath
定位方式在 xcui 底層原生不支持,由 appium 額外支持的,定位速度很慢,而且有時候定位不到元素的情況存在。綜上所述,在 iOS 的 UI 自動化中,使用原生支持的iOSNsPredicateString
定位方式
iOS 版本全支持,底層測試框架無論是 XCUITest 或 UIAutomation,可支持元素的單個屬性和多個屬性定位,推薦使用。一個元素有這些屬性:type
、value
、name
、label
、enabled
、visible
,有些元素的屬性只有以上的部分屬性,如下圖所示,可根據這些屬性進行元素定位。
元素屬性的介紹
type
:元素類型,與className
作用一致,如:XCUIElementTypeStaticText
value
: 一般不用
name
:元素的文本內容,可用作 AccessibilityId
定位方式,如:測試420班級群
label
:絕大多數情況下,與 name 作用一致
enabled
:元素是否可點擊,一般值為true
或者false
visible
:元素是夠可見,一般值為true
或者false
定位方式
元素的定位方式都是一個屬性+運算符+值
形式存在
-
比較運算符:
>,<,==,>=,<=,!=
可用於數值和字符串的比較,
如:name>100
或name == ‘測試‘
-
範圍運算符:
IN
,BETWEEN
可用於數值和字符串的範圍核對
如:name BETWEEN {3,10}
,name IN {‘Alan‘,‘May‘}
-
字符串相關:
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]
的不相等
-
通配符:
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
開頭,以群
結束,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
原文詳見:https://testerhome.com/topics/9405
Appium iOS萬能的定位方式--Predicate(iOSNsPredicate)