元素定位
本章节讲解是指在原生(APP)下进行元素定位,如果是Web(移动端里的浏览器)、混合(APP与WEBVIEW)里含有WEBVIEW页面进行元素定位,元素定位方法同Selenium WebDriver一致,则可以参考Selenium章节里的元素定位子章节。
本章节讲解使用的元素定位工具与jar包:
Android使用Android SDK里的uiautomatorviewer工具。
IOS使用Appium Desktop里的Appium Inspector检查器。
Appium Clients使用java-client-6.1.0.jar包。
Selenium使用selenium-server-standalone-3.12.0.jar包。
通过Id定位元素,IOS应用上的元素没有这个属性,所以仅支持Android。
driver.findElement(By.id("id"));
driver.findElements(By.id("id"));
如图所示:利用uiautomatorviewer工具查看,id指的是resource-id属性。
driver.findElement(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.findElement(By.name("name"));
driver.findElements(By.name("name"));
如图所示:利用Appium Inspector检查器,name指的是name属性。
driver.findElement(By.name("3个月"));
通过ClassName定位元素。
driver.findElement(By.className("class"));
driver.findElements(By.className("class"));
Android:
如图所示:利用uiautomatorviewer工具查看,ClassName指的是class属性。
driver.findElement(By.className("android.widget.EditText"));
IOS:
如图所示:利用Appium Inspector检查器,ClassName指的是type属性。
driver.findElement(By.className("XCUIElementTypeStaticText"));
通过xpath定位元素。
driver.findElement(By.xpath("xpath"));
driver.findElements(By.xpath("xpath"));
Android:
如图所示:利用uiautomatorviewer工具查看,xpath指的是xpath属性。
driver.findElement(By.xpath("//android.widget.EditText[@text='手机号码']"));
IOS:
如图所示:利用Appium Inspector检查器,xpath指的是xpath属性。
driver.findElement(By.xpath("//XCUIElementTypeStaticText[@name='Text View']"));
通过AccessibilityId查找元素。表示附加到给定元素的辅助功能标识或标签的字符串。
例如:针对IOS的辅助功能标识符和针对Android的内容描述。
driver.findElementByAccessibilityId("AccessibilityId");
driver.findElementsByAccessibilityId("AccessibilityId");
Android:
如图所示:利用uiautomatorviewer工具查看,AccessibilityId指的是content-desc属性。
driver.findElementByAccessibilityId("等于");
IOS:
如图所示:利用Appium Inspector检查器,AccessibilityId指的是accessibility id或name或label属性。
driver.findElementByAccessibilityId("More Info");
通过Android UIAutomator搜索查找元素。
这允许使用UIAutomator库使用递归元素搜索来找到Android应用程序中的元素。
driver.findElementByAndroidUIAutomator("AndroidUIAutomator");
driver.findElementsByAndroidUIAutomator("AndroidUIAutomator");
如图所示:利用uiautomatorviewer工具查看元素。
// text属性的方法(text指的是text属性)
driver.findElementByAndroidUIAutomator("new UiSelector().text('AndroidUI')");
driver.findElementByAndroidUIAutomator("new UiSelector().textContains('Android')");
driver.findElementByAndroidUIAutomator("new UiSelector().textStartsWith('AndroidUI')");
driver.findElementByAndroidUIAutomator("new UiSelector().textMatches('^Android.*')");
// className属性的方法(className指的是class属性)
driver.findElementByAndroidUIAutomator("new UiSelector().className('android.widget.TextView').text('AndroidUI')");
driver.findElementByAndroidUIAutomator("new UiSelector().classNameMatches('.*TextView$').text('AndroidUI')");
// xpath方法定位
driver.findElementByAndroidUIAutomator("new UiSelector().className('android.widget.TextView').childSelector(new UiSelector().text('AndroidUI'))");
如图所示:利用uiautomatorviewer工具查看元素。
// resourceId属性的方法(resourceId指的是resource-id属性)
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId('com.android.calculator2:id/op_add')");
driver.findElementByAndroidUIAutomator("new UiSelector().resourceIdMatches('.*id/op_add$')");
// description属性的方法(description指的是content-desc属性)
driver.findElementByAndroidUIAutomator("new UiSelector().description('加')");
driver.findElementByAndroidUIAutomator("new UiSelector().descriptionStartsWith('加')");
driver.findElementByAndroidUIAutomator("new UiSelector().descriptionMatches('^加.*')");
通过IOS UIAutomation搜索查找元素。现在基本上很少使用。
这允许使用UIAutomation库使用递归元素搜索来找到IOS应用程序中的元素。在仍支持UIAutomation的IOS设备上支持此方法,即在XCUITEST之前的版本。
driver.findElementByIosUIAutomation("IosUIAutomation");
driver.findElementsByIosUIAutomation("IosUIAutomation");
如图所示:定位Action Sheets。
driver.findElementByIosUIAutomation(".tableViews()[0].cells().firstWithPredicate(\"name beginswith 'Action Sheets'\")");
通过IOS类链查找元素。此方法仅适用于XCUITEST驱动程序。灵活性没有XPath和IosNsPredicate好。
该方法允许使用IOS类链查找元素。这些方法采用包含元素类型的类链格式的字符串。
driver.findElementByIosClassChain("IosClassChain");
driver.findElementsByIosClassChain("IosClassChain");
如图所示:利用Appium Inspector检查器查看元素。
driver.findElementByIosClassChain("XCUIElementTypeWindow/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]");
通过IOS谓词查找元素。
此方法允许使用IOS谓词查找元素。这些方法采用谓词格式的字符串,包括元素类型和字段值。
driver.findElementByIosNsPredicate("IosNsPredicate");
driver.findElementsByIosNsPredicate("IosNsPredicate");
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
// 等于
MobileElement ele1 = driver.findElementByIosNsPredicate("name == 'Alert Views'");
// 模糊匹配
MobileElement ele2 = driver.findElementByIosNsPredicate("name LIKE '*Views'");
// 正则表达式匹配
MobileElement ele3 = driver.findElementByIosNsPredicate("name MATCHES '^$'");
// 包含
Listitems1 = driver.findElementsByIosNsPredicate("name CONTAINS 'Alert'");
// 以"Alert"开始
Listitems2 = driver.findElementsByIosNsPredicate("name BEGINSWITH 'Alert'");
// 以"Alert"开始并且以"Views"结尾
Listitems3 = driver.findElementsByIosNsPredicate("name BEGINSWITH 'Alert' && name ENDSWITH 'Views'");
其中属性名参照Appium Inspector的属性字段,关键字LIKE,MATCHES,CONTAINS,BEGINSWITH,ENDSWITH必须是大写,匹配的字符需要用单引号。
本文分享自 AllTests软件测试 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!