android uiautomator text定位
可能有人不知道為什么說android uiautomator是終極定位,而且android uiautomator和appium有什么關系呢?如果之前寫了一些腳本,發現有的時候一些元素不能夠很好的定位時,那么就需要采用android uiautomator去定位,他是一種非常強有力的定位方式,原理是通過android 自帶的android uiautomator的類庫去查找元素,都直接用官方公布出來的方法去找了還能找不到嗎?
首先看我們下面的圖片:
在上面的圖片中我們不采用appium封裝好的方法,直接使用android 的uiautomator去定位結果如下:
user = new Uiobject(new UiSelector().text("請輸入手機號")) user.setText("test")
這兩句話看不懂也沒關系,因為我們接下來講的是appium已經對他進行了封裝的方法,這里只是讓你看一下他原始方法是怎么做的。首先他會根據你的定位信息new一個對象出來,然后再在你new的對象之上進行相關操作。下面我們看一下在appium中的實現方法:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text("請輸入手機號")') ele.send_keys("123")
兩個代碼進行比較我們可以發現他們的相同之處只是最后的定位信息是一樣的,即:new UiSelector().text("請輸入手機號")
,這句話是什么意思呢?簡單的話就是根據一定條件來查找元素,我們這里的條件就是text屬性為“請輸入手機號”,再根據圖片去理解是不是很容易呢?
android uiautomator的元素定位其實和appium的定位一樣,或者說他比appium的定位方式更佳多以及更佳適用,並不是只有這一個,他也只是className、id等定位,而且還支持模糊匹配進行定位,這樣是不是感覺更高大上呢?下面我們簡單介紹一下這幾種定位方式。
6.6.2 uiautomator text模糊定位
模糊定位故名思義,通過text的部分信息就能夠進行定位,我們直接看代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("請輸入手")') ele.send_keys("123")
在上面的代碼中我們只是將.text()的方法變成了.textContains(),在方法中傳入模糊的數據就好。看到這里是否有人思考過一個問題,既然有類似的模糊尋找,那么有沒有像正則表達式一樣的查找呢?答案是肯定的,看我們下面的方法。
6.6.3 textMatches 正則匹配查找
textMatches故名思義就是通過正則的來進行查找定位,他也是通過text的屬性來進行正則匹配,我們直接看代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^請輸入手.*")') ele.send_keys("123")
上面匹配的一些信息可能一些剛做測試的小伙伴不是很了解,這個不要緊,下來可以搜索一下正則表達式教程,稍微了解一下就可以。
6.6.4 uiautomator resourceID定位
resourceId定位和appium封裝好的id定位是一樣的,只是這里將寫法變成了uiautomator的寫法而已,看下面代碼:
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("cn.com.open.mooc:id/et_phone_edit")') ele.send_keys('234')
通過上面的代碼和之前的代碼對比大家可能發現其實他們前面都是一樣的,只是在定位的時候發生了一些變化,text變換成了resourceID即可,也就是頁面對象屬性的信息進行變更了,其他方法都是一樣。下面其他方法我就不浪費篇幅,只給大家做一個簡單的案例展示。
6.6.5 resourceIDMatches 定位
通過id進行正則匹配定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+et_phone_edit")') ele.send_keys('234')
6.6.6 uiautomator className定位 通過調用android uiautomator使用className進行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")') ele.send_keys('234')
6.6.7 uiautomator classNameMatches定位
通過className正則匹配進行定位
ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")') ele.send_keys('234')
通過上面的學習我相信大家對uiautomator的定位有一定的了解了,但是我想告訴大家的是這個並不是所有的,還有很多很多的定位方式,這個需要大家在以后不斷的學習中去積累,我也不可能把所有的方法都告訴大家,這里只是給大家一個起頭,但是我希望大家在學習定位的時候不只是看appium的定位,畢竟他也是封裝的uiautomator的定位方式,所以在學習appium的同時把uiautomator去大概學習一下這個很有幫助,並且對以后的提升自己以及工作中重新封裝appium有很大的幫助。