程序地带

APPIUM-Android自动化元素定位方式


一、常用元素定位方法
appium从selenium中继承了所有的元素定位方法, 并且增加了一些自己的元素定位方式,下方截图分别为selenium和MobileBy包源码:


但是从继承selenium中的定位方法中,一般只会用到id、class_name、xpath这三种方法,总结起来,appium中常用的定位方法一般有以下五种:
通过id定位:resource-id
通过class_name定位:class
通过accessibility_id定位:content-desc
通过android_uiautomator定位:SDK自带的java开发的uiautomator自动化框架
通过xpath定位
1.1 使用id定位
通过工具获取到按钮的resource-id,注意这里是使用resource-id,而不是id,
driver.find_element_by_id() 或者 MobileBy.ID
 

 
loc = (MobileBy.ID, "com.wm.dmall:id/tv_positive")
或driver.find_element_by_id("com.wm.dmall:id/tv_positive")
1.2 class_name定位
在上述截图中虽然含有class,但其实不建议使用class name定位,因为同一页面含有重复的class,但是可以通过下标指定哪一个class,如下代码:
driver.find_elements_by_class_name("android.widget.TextView")[1]
注:下标的方式虽然可以定位出元素,但是也有弊端,前端移动顺序后,UI代码也要随之改变。
 
1.3 通过text定位(已废弃)
appium1.5及之后的版本废弃了name属性(如name=百度一下),需要使用uiautomator的定位方式,使用text的内容,下面会详解uiautomator。
 
1.4 accessibility_id定位
在UI Automator Viewer界面上并没有找到这个字段,这个对应的字段是content-desc,
driver.find_element_by_accessibility_id() 或者 MobileBy.ACCESSIBILITY_ID,代码如下:
driver.find_element_by_accessibility_id("accessibility_id值")
或loc = (MobileBy.ACCESSIBILITY_ID, "accessibility_id值")


 


1.5 android_uiautomator定位
相当于使用 UiAutomator Api 去递归地搜索元素(Android 专属),可以说android uiautomator是终极定位方式,有的时候一些元素不能够很好的定位时,那么就需要采用android uiautomator去定位,他是一种非常强有力的定位方式,原理是通过android 自带的android uiautomator的类库去查找元素。appium对android 的uiautomator进行了封装,该方法的参数为UiSelector类定位元素的表达式:new UiSelector().属性("属性值"),实例化一个UiSelector对象,然后通过实例接口调用。
AndroidUIAutomator是一个强有力的元素定位方式,它是通过Android UIAutomator类库去找元素,可以选择resourceId、text、className、description作为传入的字符串。

1.5.1 android_uiautomator之text文本定位语法


  1.使用text文本定义
loc_text = "new UiSelector().text("登录/注册")"
driver.find_element_by_android_uiautomator(loc_text).click()
  2.uiautomator text模糊定位
文本比较长的时候,可以用textContains模糊匹配,通过text的部分信息就能够进行定位,我们直接看代码:
loc_text = "new UiSelector().textContains("登录/注册")"
driver.find_element_by_android_uiautomator(loc_text).click()
在上面的代码中我们只是将.text()的方法变成了.textContains(),在方法中传入模糊的数据就好。看到这里是否有人思考过一个问题,既然有类似的模糊寻找,那么有没有像正则表达式一样的查找呢?答案是肯定的,看我们下面的方法。
 
  3.textMatches 正则匹配查找
textMatches故名思义就是通过正则的来进行查找定位,也是通过text的属性来进行正则匹配,我们直接看代码:
loc_text = "new UiSelector().textMatches("^登录/.*")"
driver.find_element_by_android_uiautomator(loc_text).click()

 


  4.textStartsWith是以某个文本开头来匹配
new UiSelector().textStartsWith("以text文本开头")
loc_text = "new UiSelector().textStartsWith("登录")"
driver.find_element_by_android_uiautomator(loc_text).click()

 


1.5.2 android_uiautomator之resourceId定位

 



 


resourceId定位和appium封装好的id定位是一样的,只是这里将写法变成了uiautomator的写法而已。
  1.resourceId定位
oc_id = "new UiSelector().resourceId(" com.wm.dmall:id/net_image_view ")"
driver.find_element_by_android_uiautomator(loc_id).click()
通过上面的代码和之前的代码对比大家可能发现其实他们前面都是一样的,只是在定位的时候发生了一些变化,text变换成了resourceId即可,也就是页面对象属性的信息进行变更了,其他方法都是一样。
  2. resourceIDMatches 定位
通过id进行正则匹配定位
loc_id = "new UiSelector().resourceIdMatches(".+net_image_view ")"
driver.find_element_by_android_uiautomator(loc_id).click()
1.5.3 android_uiautomator之className定位
页面上的class属性一般不唯一,多半用在复数定位时候。比如通过class属性定位"同意"这个按钮下标就是1。
  1.className定位

# className复数定位
loc_class = "new UiSelector().className("android.widget.TextView")"
driver.find_elements_by_android_uiautomator(loc_class)[1].click()
  2.uiautomator classNameMatches定位
通过className正则匹配进行定位:
loc_class = "new UiSelector().classNameMatches (".*widget.TextView")"
driver.find_elements_by_android_uiautomator(loc_class)[1].click()
1.5.4 android_uiautomator之description定位

 
loc_id = "new UiSelector().
description("多点")"
driver.find_element_by_android_uiautomator(loc_id).click()
1.5.5 android_uiautomator之组合定位


 


  1.id与text属性组合
id_text = "resourceId("com.wm.dmall:id/funcTitle").text("待支付")"
driver.find_element_by_android_uiautomator(id_text).click()
  2.class与text属性组合
class_text = "className("android.widget.TextView").text("待支付")"
driver.find_element_by_android_uiautomator(class_text).click()
  3.父子关系定位


 


son = "resourceId("com.wm.dmall:id/container").childSelector(text("我的"))"
driver.find_element_by_android_uiautomator(son).click()
  4.兄弟定位fromParent
有时候父元素不好定位,但是跟他相邻的兄弟元素很好定位,这时候就可以通过兄弟元素,找到同一父级元素下的子元素。
brother = "resourceId("com.wm.dmall:id/nav_item_laber_tv").fromParent(text("我的"))"
driver.find_element_by_android_uiautomator(brother).click()

 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dy99/p/14287417.html

随机推荐

Spring统一(分页)返回结果(新)

背景在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数&...

不換 阅读(594)

第一章 道法,基础剑诀

紫云山。白雾缥缈,霞光交织。在一处开阔的庭院内,叶尘有些茫然的看向四周,短暂的迷茫之后,终于是弄清楚发生了什么事情。他穿越了,穿越...

飞卢小说 阅读(737)

包含min函数的栈 剑指offer python版

目录题目一、思路二、代码三、总结题目题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)&...

江南丶 阅读(348)

2021-01-25

notestswerefound解决:原有idea2017.2不支持junit5,安装2018.3后,问题解决,为什么使用低版本的idea,穷,...

m0_51280536 阅读(166)

常用注解

常用注解一:RequestParam作用:把请求中指定名称的参数给控制器中的形参赋值。属性:value:请求参数中的名称。required&#x...

言字旁 阅读(220)

JDK卸载-学习笔记

JDK:JavaDevelopmentKit开发工具包(含下面两个)JRE:JavaRuntimeEnvironment运行环境JVMÿ...

耶耶夜夜爷 阅读(579)