Appium元素定位方式之android_uiautomator定位
1. 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作为传入的字符串。
![](https://img2020.cnblogs.com/blog/2139929/202101/2139929-20210116221616699-2032521743.png)
1.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.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.3 android_uiautomator之className定位
页面上的class属性一般不唯一,多半用在复数定位时候。比如通过class属性定位'同意'这个按钮下标就是1。
![](https://img2020.cnblogs.com/blog/2139929/202101/2139929-20210116222104147-960204468.png)
1) className定位
# className复数定位
loc_class = 'new UiSelector().className("android.widget.TextView")'
driver.find_elements_by_android_uiautomator(loc_class)[1].click()
20 uiautomator classNameMatches定位
通过className正则匹配进行定位:
loc_class = 'new UiSelector().classNameMatches (".*widget.TextView")'
driver.find_elements_by_android_uiautomator(loc_class)[1].click()
1.4 android_uiautomator之description定位
![](https://img2020.cnblogs.com/blog/2139929/202101/2139929-20210116222205134-1725388831.png)
loc_id = 'new UiSelector().
description("多点")'
driver.find_element_by_android_uiautomator(loc_id).click()
1.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()
每天进步一小步 日积月累跨大步