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

1、经常使用元素定位方法

appium从selenium中继承了全部的元素定位方法, 而且增长了一些本身的元素定位方式,下方截图分别为selenium和MobileBy包源码:
可是从继承selenium中的定位方法中,通常只会用到id、class_name、xpath这三种方法,总结起来,appium中经常使用的定位方法通常有如下五种:
  1. 经过id定位:resource-id
  1. 经过class_name定位:class
  1. 经过accessibility_id定位:content-desc
  1. 经过android_uiautomator定位:SDK自带的java开发的uiautomator自动化框架
  1. 经过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()
相关文章
相关标签/搜索