標籤:自動化 思考 工作 tom 變更 比較 屬性 png 使用
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(),在方法中傳入模糊的資料就好。看到這裡是否有人思考過一個問題,既然有類似的模糊尋找,那麼有沒有像Regex一樣的尋找呢?答案是肯定的,看我們下面的方法。
6.6.3 textMatches 正則匹配尋找
textMatches故名思義就是通過正則的來進行尋找定位,他也是通過text的屬性來進行正則匹配,我們直接看代碼:
ele = self.driver.find_element_by_android_uiautomator(‘new UiSelector().textMatches("^請輸入手.*")‘)ele.send_keys("123")
上面匹配的一些資訊可能一些剛做測試的小夥伴不是很瞭解,這個不要緊,下來可以搜尋一下Regex教程,稍微瞭解一下就可以。
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有很大的協助。
Appium python自動化測試系列之Android UIAutomator終極定位(七)