iOS自動化測試元素定位


一、元素屬性介紹

  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

用於數值的范圍核對

name BETWEEN {3,10}

   示例:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM