元素定位
本章节讲解是指在原生(APP)下进行元素定位,如果是Web(移动端里的浏览器)、混合(APP与WEBVIEW)里含有WEBVIEW页面进行元素定位,元素定位方法同Selenium一致,则可以参考Selenium章节里的元素定位子章节。
本章节讲解使用的元素定位工具:
Android使用Android SDK里的uiautomatorviewer工具。
IOS使用Appium Desktop里的Appium Inspector检查器。
通过id定位元素,IOS应用上的元素没有这个属性,所以仅支持Android。
driver.find_element_by_id("id")
driver.find_elements_by_id("id")
如图所示:利用uiautomatorviewer工具查看,id指的是resource-id属性。
driver.find_element_by_id("com.xiaoV.BWalletBeta:id/phoneNumber")
Appium版本在1.5之后,Android就不再支持name的元素定位方法。
Android如果使用name方法,则报如下错误:
selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session
IOS可以正常使用name元素定位。
driver.find_element_by_name("name")
driver.find_elements_by_name("name")
如图所示:利用Appium Inspector检查器,name指的是name属性。
driver.find_element_by_name("3个月")
通过class_name定位元素。
driver.find_element_by_class_name("class")
driver.find_elements_by_class_name("class")
Android:
如图所示:利用uiautomatorviewer工具查看,class_name指的是class属性。
driver.find_element_by_class_name("android.widget.EditText")
IOS:
如图所示:利用Appium Inspector检查器,class_name指的是type属性。
driver.find_element_by_class_name("XCUIElementTypeStaticText")
通过xpath定位元素。
driver.find_element_by_xpath("xpath")
driver.find_elements_by_xpath("xpath")
Android:
如图所示:利用uiautomatorviewer工具查看,xpath指的是xpath属性。
driver.find_element_by_xpath("//android.widget.EditText[@text='手机号码']")
IOS:
如图所示:利用Appium Inspector检查器,xpath指的是xpath属性。
driver.find_element_by_xpath("//XCUIElementTypeStaticText[@name='Text View']")
通过accessibility_id查找元素。表示附加到给定元素的辅助功能标识或标签的字符串。
针对IOS的辅助功能标识符和针对Android的内容描述。
driver.find_element_by_accessibility_id("accessibility_id")
driver.find_elements_by_accessibility_id("accessibility_id")
Android:
如图所示:利用uiautomatorviewer工具查看,accessibility_id指的是content-desc属性。
driver.find_element_by_accessibility_id("等于")
IOS:
如图所示:利用Appium Inspector检查器,accessibility_id指的是accessibility id或name或label属性。
driver.find_element_by_accessibility_id("More Info")
通过Android UIAutomator搜索查找元素。
这允许使用UIAutomator库使用递归元素搜索来找到Android应用程序中的元素。
driver.find_element_by_android_uiautomator("android_uiautomator")
driver.find_elements_by_android_uiautomator("android_uiautomator")
如图所示:利用uiautomatorviewer工具查看元素。
# text属性的方法(text指的是text属性)
driver.find_element_by_android_uiautomator('new UiSelector().text("AndroidUI")')
driver.find_element_by_android_uiautomator('new UiSelector().textContains("Android")')
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("AndroidUI")')
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^Android.*")')
# className属性的方法(className指的是class属性)
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("AndroidUI")')
driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches(".*TextView$").text("AndroidUI")')
# xpath方法定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").childSelector(new UiSelector().text("AndroidUI"))')
如图所示:利用uiautomatorviewer工具查看元素。
# resourceId属性的方法(resourceId指的是resource-id属性)
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/op_add")')
driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".*id/op_add$")')
# description属性的方法(description指的是content-desc属性)
driver.find_element_by_android_uiautomator('new UiSelector().description("加")')
driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("加")')
driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches("^加.*")')
通过IOS UIAutomation搜索查找元素。现在基本上很少使用。
这允许使用UIAutomation库使用递归元素搜索来找到IOS应用程序中的元素。在仍支持UIAutomation的IOS设备上支持此方法,即在XCUITEST之前的版本。
driver.find_element_by_ios_uiautomation("ios_uiautomation")
driver.find_elements_by_ios_uiautomation("ios_uiautomation")
如图所示:定位Action Sheets。
driver.find_element_by_ios_uiautomation(".tableViews()[0].cells().firstWithPredicate(\"name beginswith 'Action Sheets'\")")
通过IOS类链查找元素。此方法仅适用于XCUITEST驱动程序。灵活性没有by_xpath和by_ios_predicate好。
该方法允许使用IOS类链查找元素。这些方法采用包含元素类型的类链格式的字符串。
driver.find_element_by_ios_class_chain("ios_class_chain")
driver.find_elements_by_ios_class_chain("ios_class_chain")
如图所示:利用Appium Inspector检查器查看元素。
driver.find_element_by_ios_class_chain("XCUIElementTypeWindow/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]")
通过IOS谓词查找元素。
此方法允许使用IOS谓词查找元素。这些方法采用谓词格式的字符串,包括元素类型和字段值。
driver.find_element_by_ios_predicate("ios_predicate")
driver.find_elements_by_ios_predicate("ios_predicate")
IOS版本全支持,底层测试框架无论是XCUITEST或UIAutomation,可支持元素的单个属性和多个属性定位,推荐使用。一个元素有这些属性:type、value、name、label、enabled、visible,有些元素的属性只有以上的部分属性,如图所示:利用Appium Inspector检查器查看元素,可根据这些属性进行元素定位。
type:与class_name作用一致,如:XCUIElementTypeStaticText value:一般不用 name:元素的文本内容,可用作accessibility_id定位方式,如:Alert Views label:绝大多数情况下,与name作用一致 enabled:元素是否可点击,一般值为true或者false visible:元素是否可见,一般值为true或者false
元素的定位方式都是一个属性+运算符+值形式存在
1、比较运算符:>,<,==,>=,<=,!= 可用于数值和字符串的比较。 例如:name>100 或name == 'Alert Views'
2、范围运算符:IN,BETWEEN 可用于数值和字符串的范围核对。 例如:name BETWEEN {3,10},name IN {'Alan','May'}
3、字符串相关:CONTAINS、BEGINSWITH、ENDSWITH 包含某个字符串,例如:label CONTAINS 'Alert' 以某个字符串开头,例如:label BEGINSWITH 'Alert' 以某个字符串结束,例如:label ENDSWITH 'Views' 注:在三个关键字后加上[c]不区分大小写,可用于字母的校验;[d]不区分发音符号,即没有重音符号($、#、%等);[cd]即不区分大小写,也不区分发音符号,如:name CONTAINS[c] ABcd和name CONTAINS abcd、name CONTAINS ABCD是等同的,注意后面两个没带[c]的不相等。
4、通配符:LIKE 通配符也接受[cd],?代表一个字符,*代表多个字符。 例如:一个元素的label属性为
label LIKE 'Alert Views'
label LIKE 'Alert ?iews'
label LIKE 'Alert ??ews'
label LIKE 'Aler? Vie?s'
label LIKE '*rt Views'
label LIKE 'Alert Vie*'
label LIKE 'Ale*ws'
label LIKE 'A*V*s'
以上这么多种文本都可以被识别为同一个元素。
5、正则表达式:MATCHES 例如:以A开头,以s结束。
label MATCHES '^A.+s$'
可以用元素的属性:type、value、name、label、enabled、visible进行定位。
例如:
type == XCUIElementTypeStaticText
label CONTAINS 'Alert'
label LIKE '*rt Views'
enabled == true
visible == true
就是以上单个属性定位用符号AND连接起来即可。
例如:
type == XCUIElementTypeStaticText AND label CONTAINS 'Alert'
type == XCUIElementTypeStaticText AND label CONTAINS 'Alert' AND enabled == true
# 等于
driver.find_element_by_ios_predicate("name == 'Alert Views'")
# 模糊匹配
driver.find_element_by_ios_predicate("name LIKE '*Views'")
# 正则表达式匹配
driver.find_element_by_ios_predicate("name MATCHES '^$'")
# 包含
driver.find_elements_by_ios_predicate("name CONTAINS 'Alert'")
# 以"Alert"开始
driver.find_elements_by_ios_predicate("name BEGINSWITH 'Alert'")
# 以"Alert"开始并且以"Views"结尾
driver.find_elements_by_ios_predicate("name BEGINSWITH 'Alert' && name ENDSWITH 'Views'")
其中属性名参照Appium Inspector的属性字段,关键字LIKE,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH必须是大写。
本文分享自 AllTests软件测试 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!