一、元素屬性介紹
iOS自動化元素查找工具,我使用的是Appium的inspector。最新版的appium自動展示多種元素定位表達式,還可以查看每種定位表達式的執行效率。
1、元素屬性
type |
元素類型,與className作用一致,如:XCUIElementTypeButton |
value |
一般不用 |
name |
元素的文本內容,可用作 AccessibilityId定位方式,如:ClearEmail |
label |
絕大多數情況下,與 name 作用一致 |
enabled |
元素是否可點擊,一般值為true或者false |
visible |
元素是否可見,一般值為true或者false |
2、查看各定位方式執行效率
Appium的inspector功能中,選擇某個元素后在“selected Element”中會展示多個定位表達式,而且點擊定位表達式后面的“Get Timing”,可以顯示每個定位表達式的執行時間。
二、iOS常用定位方法
1、accessibility_id
iOS自動化測試元素定位的accessibility_id主要使用元素的label或name(兩個屬性的值都一樣)屬性進行定位。
例如:第一張截圖中label或name都是“我的功能”
driver.find_element_by_accessibility_id("我的功能") driver.find_element(MobileBy.ACCESSIBILITY_ID, "我的功能")
2、class_name
class_name定位方法使用元素的type屬性,type屬性表示控件類型,一般不具有唯一性,因此class_name不常用。
例如:type屬性為:XCUIElementTypeButton
driver.find_element_by_class_name("XCUIElementTypeButton") driver.find_element(MobileBy.CLASS_NAME, "XCUIElementTypeButton")
3、Xpath
Appium對app原生環境的xpath定位方法執行效率很低,從iOS 10開始使用的 XCUITest 框架原生不支持,定位速度很慢,官方不推薦這種方式。但是在實際使用中,當其他定位方式都不能找到元素時,可以嘗試xpath定位。
例如:第一張截圖中“我的功能”定位
driver.find_element_by_xpath("//XCUIElementTypeStaticText[@name='我的功能']") driver.find_element(MobileBy.XPATH, "//XCUIElementTypeStaticText[@name='我的功能']")
4、ios_class_chain(類型鏈)
ios_class_chain僅支持iOS 10或以上,且僅限於WebDriverAgent 框架中使用。此方法用於替代xpath,但該方法還有待完善,沒有納入官方文檔。
Github說明地址:https://github.com/appium/appium-xcuitest-driver
例如:第一張截圖中“我的功能”定位
driver.find_element_by_ios_class_chain('**/XCUIElementTypeStaticText[`label == "我的功能"`]') driver.find_element(MobileBy.IOS_CLASS_CHAIN, '**/XCUIElementTypeStaticText[`label == "我的功能"`]')
5、ios_predicate(謂詞)
iOS Predicate 即謂詞邏輯。ios_predicate定位方法支持iOS所有的版本,也就是能適配XCUITest 和 UIAutomation底層測試框架,使用的就是iOS編程語言,因此可以把此方法作為首選定位方式。
謂詞表達式由屬性、運算符和值構成。
1.1、常用的屬性
在上面的表格中已經介紹,可以使用的元素屬性:type、value、name、label、enabled、visible
1.2、運算符
1.2.1、比較運算符
比較運算符 |
>, <, ==, >=, <=, != |
可用於數值和字符串的比較,如:label == ‘我的功能’,label >= 500
示例:
driver.find_element_by_ios_predicate("label == '我的功能'") driver.find_element(MobileBy.IOS_PREDICATE, "label == '我的功能'") driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
1.2.2、范圍運算符
常用的范圍運算符有:
范圍運算符 |
說明 |
實例 |
IN |
用於字符串的范圍核對 |
name IN {'Alan','May'} |
BETWEEN |
用於數值的范圍核對 |
|
示例:
driver.find_element(MobileBy.IOS_PREDICATE, "name IN {'id_cell', 'id_alert'}") driver.find_element_by_ios_predicate("value BETWEEN {5, 7}")
1.2.3、字符串相關
字符串相關 運算符 |
說明 |
CONTAINS |
表示包含某個字符串 |
BEGINSWITH |
表示以某個字符串開頭 |
ENDSWITH |
表示以某個字符串結束 |
以字符串“自動化軟件測試”為例:
- 包含某個字符串:label CONTAINS ‘軟件’
- 以某個字符串開頭:label BEGINSWITH ‘自動’
- 以某個字符串結束:label ENDSWITH ‘測試’
擴展:在三個關鍵字后加上[c]、或者[d]、[cd]
-
[c]:表示不區分大小寫,可用於字母的校驗;
-
[d]:不區分發音符號,即沒有重音符號($、#等);
-
[cd]:既不區分大小寫,也不區分發音符號;
例如:name CONTAINS[c] ABcd 和 name CONTAINS abcd是等同的
示例:
driver.find_element_by_ios_predicate("label CONTAINS ‘軟件’")
1.2.4、模糊匹配:LIKE
模糊匹配也可以稱為通配符匹配,?代表一個字符,*代表多個字符。
示例:現有元素的label屬性:“自動化軟件測試”
label LIKE ‘自動化軟件測試’ # 完全匹配
label LIKE ‘自動化?件測試’ # ? 匹配一個字符
label LIKE ‘自動化??測試’ # 兩個?號匹配兩個字符
label LIKE ‘自?化?件測試’
label LIKE ‘*軟件測試’ # *代表多個字符
label LIKE ‘自動化軟件*’
label LIKE ‘自動化*件測*’
示例:
driver.find_element(MobileBy.IOS_PREDICATE, "label LIKE ‘*軟件測試")
1.2.5、邏輯運算符
邏輯運算符 |
說明 |
實例 |
AND |
邏輯與:必須同時滿足所有條件 |
type == XCUIElementTypeStaticText AND label CONTAINS '測試 |
&& |
type == XCUIElementTypeStaticText && label CONTAINS '測試 |
|
OR |
邏輯或:只需要滿足一個條件即可 |
enabled == true OR visible == false |
|| |
enabled == true || visible == false |
|
NOT |
邏輯非:取反 |
|
! |
|
1.2.6、正則表達式:MATCHES
以字符串的匹配為例:匹配字符串“自動化軟件測試”,以“自”開頭,然后以“試”結尾。
表達式:label MATCHES ‘^自.+試$’
示例:
driver.find_element(MobileBy.IOS_PREDICATE, " label MATCHES ‘^自.+試$’")
符號說明: ^ 匹配字符串的開頭
. 匹配任意字符,除了換行符
+ 匹配 1 個或多個的表達式。
$ 匹配字符串的末尾
關於正則匹配更多的說明可以參考:https://www.jianshu.com/p/7fa6fe0b39af