前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动化-Appium-元素定位(Java版)

自动化-Appium-元素定位(Java版)

作者头像
wangmcn
发布2022-07-25 13:07:10
1.6K0
发布2022-07-25 13:07:10
举报
文章被收录于专栏:AllTests软件测试

元素定位

本章节讲解是指在原生(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包。

1、Id

通过Id定位元素,IOS应用上的元素没有这个属性,所以仅支持Android。

代码语言:javascript
复制
driver.findElement(By.id("id"));
driver.findElements(By.id("id"));

如图所示:利用uiautomatorviewer工具查看,id指的是resource-id属性。

代码语言:javascript
复制
driver.findElement(By.id("com.xiaoV.BWalletBeta:id/phoneNumber"));

2、Name

Appium版本在1.5之后,Android就不再支持name的元素定位方法。

Android如果使用name方法,则报如下错误:

selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session

IOS可以正常使用name元素定位。

代码语言:javascript
复制
driver.findElement(By.name("name"));
driver.findElements(By.name("name"));

如图所示:利用Appium Inspector检查器,name指的是name属性。

代码语言:javascript
复制
driver.findElement(By.name("3个月"));

3、ClassName

通过ClassName定位元素。

代码语言:javascript
复制
driver.findElement(By.className("class"));
driver.findElements(By.className("class"));

Android:

如图所示:利用uiautomatorviewer工具查看,ClassName指的是class属性。

代码语言:javascript
复制
driver.findElement(By.className("android.widget.EditText"));

IOS:

如图所示:利用Appium Inspector检查器,ClassName指的是type属性。

代码语言:javascript
复制
driver.findElement(By.className("XCUIElementTypeStaticText"));

4、XPath

通过xpath定位元素。

代码语言:javascript
复制
driver.findElement(By.xpath("xpath"));
driver.findElements(By.xpath("xpath"));

Android:

如图所示:利用uiautomatorviewer工具查看,xpath指的是xpath属性。

代码语言:javascript
复制
driver.findElement(By.xpath("//android.widget.EditText[@text='手机号码']"));

IOS:

如图所示:利用Appium Inspector检查器,xpath指的是xpath属性。

代码语言:javascript
复制
driver.findElement(By.xpath("//XCUIElementTypeStaticText[@name='Text View']"));

5、AccessibilityId

通过AccessibilityId查找元素。表示附加到给定元素的辅助功能标识或标签的字符串。

例如:针对IOS的辅助功能标识符和针对Android的内容描述。

代码语言:javascript
复制
driver.findElementByAccessibilityId("AccessibilityId");
driver.findElementsByAccessibilityId("AccessibilityId");

Android:

如图所示:利用uiautomatorviewer工具查看,AccessibilityId指的是content-desc属性。

代码语言:javascript
复制
driver.findElementByAccessibilityId("等于");

IOS:

如图所示:利用Appium Inspector检查器,AccessibilityId指的是accessibility id或name或label属性。

代码语言:javascript
复制
driver.findElementByAccessibilityId("More Info");

6、AndroidUIAutomator

通过Android UIAutomator搜索查找元素。

这允许使用UIAutomator库使用递归元素搜索来找到Android应用程序中的元素。

代码语言:javascript
复制
driver.findElementByAndroidUIAutomator("AndroidUIAutomator");
driver.findElementsByAndroidUIAutomator("AndroidUIAutomator");

如图所示:利用uiautomatorviewer工具查看元素。

代码语言:javascript
复制
// 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工具查看元素。

代码语言:javascript
复制
// 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('^加.*')");

7、IosUIAutomation

通过IOS UIAutomation搜索查找元素。现在基本上很少使用。

这允许使用UIAutomation库使用递归元素搜索来找到IOS应用程序中的元素。在仍支持UIAutomation的IOS设备上支持此方法,即在XCUITEST之前的版本。

代码语言:javascript
复制
driver.findElementByIosUIAutomation("IosUIAutomation");
driver.findElementsByIosUIAutomation("IosUIAutomation");

如图所示:定位Action Sheets。

代码语言:javascript
复制
driver.findElementByIosUIAutomation(".tableViews()[0].cells().firstWithPredicate(\"name beginswith 'Action Sheets'\")");

8、IosClassChain

通过IOS类链查找元素。此方法仅适用于XCUITEST驱动程序。灵活性没有XPath和IosNsPredicate好。

该方法允许使用IOS类链查找元素。这些方法采用包含元素类型的类链格式的字符串。

代码语言:javascript
复制
driver.findElementByIosClassChain("IosClassChain");
driver.findElementsByIosClassChain("IosClassChain");

如图所示:利用Appium Inspector检查器查看元素。

代码语言:javascript
复制
driver.findElementByIosClassChain("XCUIElementTypeWindow/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]");

9、IosNsPredicate

通过IOS谓词查找元素。

此方法允许使用IOS谓词查找元素。这些方法采用谓词格式的字符串,包括元素类型和字段值。

代码语言:javascript
复制
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

9.1元素定位方式

元素的定位方式都是一个属性+运算符+值形式存在

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$'

9.2以一种属性定位元素

可以用元素的属性:type、value、name、label、enabled、visible进行定位。

例如:

type == XCUIElementTypeStaticText

label CONTAINS 'Alert'

label LIKE '*rt Views'

enabled == true

visible == true

9.3以两种或两种以上属性定位元素

就是以上单个属性定位用符号AND连接起来即可。

例如:

type == XCUIElementTypeStaticText AND label CONTAINS 'Alert'

type == XCUIElementTypeStaticText AND label CONTAINS 'Alert' AND enabled == true

9.4使用方法

代码语言:javascript
复制
// 等于
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必须是大写,匹配的字符需要用单引号。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Id
  • 2、Name
  • 3、ClassName
  • 4、XPath
  • 5、AccessibilityId
  • 6、AndroidUIAutomator
  • 7、IosUIAutomation
  • 8、IosClassChain
  • 9、IosNsPredicate
  • 9.1元素定位方式
  • 9.2以一种属性定位元素
  • 9.3以两种或两种以上属性定位元素
  • 9.4使用方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档