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做爲傳入的字符串。

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。

  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.4 android_uiautomator之description定位

 
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()
相關文章
相關標籤/搜索