APP自动化基础之元素定位
mobileby
在開(kāi)始講元素定位的方式時(shí),我們先來(lái)看下appium中元素定位的相關(guān)模塊:mobileby.py:
在這里可以看到,MobileBy這個(gè)類(lèi)繼承了selenium中的元素定位的類(lèi):By,然后根據(jù)手機(jī)特性又另外自己寫(xiě)了一堆元素定位的方式。所以理論上,對(duì)于android app的元素定位來(lái)說(shuō),既能使用selenium中的八大元素定位方式,也能使用android所特有的4個(gè)定位方式。
從appium inspector看元素定位方式
雖然理論上來(lái)說(shuō),app的定位方式看起來(lái)可選擇的更多了,但由于app的特性,web的很多定位方式在app中就不適用了。比如:link_text、partial_link_text、name、tagname、classname、css_selector都不再適用,因?yàn)檫@些都只適用于html中,而app是xml進(jìn)行元素標(biāo)識(shí)的,所以這些就用不了了。
接下來(lái)我們看下appium inspector的元素屬性區(qū)域所展示的這些屬性哪些可以被用來(lái)定位。
- id。id確實(shí)可以作為app中的一種定位方式,但并不同于web中當(dāng)前頁(yè)面元素的id是唯一的這個(gè)特性,在app中id其實(shí)是會(huì)變化的,同一個(gè)id值可能會(huì)找到多個(gè)元素。所以到了app這邊,通過(guò)id的定位方式就沒(méi)那么穩(wěn)定了;
- xpath。很高興又能看到xpath!但其實(shí)在appium中,官方是不建議用xpath進(jìn)行定位的,它是一種脆弱的定位方式,因?yàn)樗褂玫氖墙^對(duì)路徑:
但如果你寫(xiě)成相對(duì)路徑的話,也是可以用來(lái)定位的;
- elementId。或許看到有個(gè)id你又會(huì)高興了。這總該是唯一的了吧!很遺憾,它也是會(huì)變化的,所以也不適合用來(lái)定位:
- index。這是子標(biāo)簽的索引,用來(lái)標(biāo)識(shí)子標(biāo)簽是父標(biāo)簽下的第幾個(gè)標(biāo)簽。這個(gè)可以用來(lái)輔助定位,比如根據(jù)層級(jí)關(guān)系來(lái)找父級(jí)或子級(jí):
- text。文本內(nèi)容,這個(gè)也只能用來(lái)輔助定位
- class。注意這里的class并不是web中的classname,因?yàn)樵赼pp中是沒(méi)有css的(webapp除外)。這里的class其實(shí)相當(dāng)于web中的tagname,在app中標(biāo)簽名相同的太多了,所以也不適合用來(lái)定位
- package。當(dāng)前app中所有元素的package都是一樣的
- content-desc。這個(gè)屬性比較特別,性必須在輔助瀏覽工具(比如TalkBack)開(kāi)啟后才能使用,android系統(tǒng)會(huì)自動(dòng)使用人聲朗讀控件上android:contentDescription屬性說(shuō)指向的內(nèi)容。這樣用戶就可以知道這個(gè)控件是做什么用的。這個(gè)屬性主要是讓一些視力有障礙的用戶明白這個(gè)控件是干嘛用的。可能你會(huì)說(shuō),這肯定不會(huì)用來(lái)做元素定位,一來(lái)是它的用途比較特別,而來(lái)是很多元素它的content-desc就是空的。但其實(shí)content-desc就是app中一種常用的元素定位方式(后面會(huì)講到)
- 布爾值屬性。后面有一些只有true或false兩個(gè)值的屬性,它們也不太適合用來(lái)定位元素,因?yàn)楹懿环€(wěn)定:
- bounds。元素所在坐標(biāo)位置。雖然說(shuō)坐標(biāo)的值是唯一的,看起來(lái)很適合用來(lái)作為元素定位方式,但如果你想用這種方式來(lái)定位元素的話會(huì)相當(dāng)?shù)芈闊?#xff0c;需要調(diào)用TouchAction類(lèi)下的多個(gè)方法。所以這里不推薦用這種方式進(jìn)行定位
- resource-id。這是android為每個(gè)資源單獨(dú)分配的id,跟上面id的值是相等的。
app常見(jiàn)定位方式
如何選擇元素定位方式?
app元素定位實(shí)戰(zhàn)
id
上面說(shuō)過(guò),元素定位第一優(yōu)先選擇的是id,但前提是必須保證id的唯一性。
這里我們定位開(kāi)始按鈕:
通過(guò)search for element查看id的唯一性:
可以看到id是唯一的:
把id方式的元素定位寫(xiě)進(jìn)代碼中如下:
xpath
xpath在app中要寫(xiě)成相對(duì)路徑的方式。
這里我們?nèi)匀欢ㄎ坏氖情_(kāi)始按鈕,找到它的標(biāo)簽名為:androidx.drawerlayout.widget.DrawerLayout,然后看到它有一個(gè)resource-id,我們可以用這個(gè)作為輔助的定位方式,即找到一個(gè)元素標(biāo)簽,它具有resource-id的屬性://androidx.drawerlayout.widget.DrawerLayout[@resource-id=“cc.forestapp:id/drawer_layout”]
通過(guò)search for element校驗(yàn)元素表達(dá)式的正確性:
可找到一個(gè)元素:
寫(xiě)入代碼中如下:
content-desc
這個(gè)元素定位方式真的比較靠運(yùn)氣,因?yàn)楹芏嗲闆r下,元素的這個(gè)屬性都是空的,但如果某個(gè)元素的這個(gè)屬性不是空的,那也是個(gè)不錯(cuò)的定位方式。
這里我們假設(shè)開(kāi)始按鈕的content-desc的值就為開(kāi)始,那么怎么通過(guò)代碼編寫(xiě)呢?
這里介紹兩種方法:
uiautomator
這是除了id之外最為常用的定位方式了。如果通過(guò)id、content-desc都不好定位(如id不唯一或content-desc值為空),那不要用xpath,直接選用uiautomator,因?yàn)樗膱?zhí)行速度比xpath快。
直接定位
uiautomator定位方式需要單獨(dú)用字符串封裝一段java代碼。在java代碼中,我們先要new一個(gè)uiautomator對(duì)象,然后通過(guò)對(duì)象調(diào)用方法。
在uiautomator中,每一個(gè)屬性在java中都是一個(gè)方法,而方法的值就是屬性的值。比如說(shuō)這里resourceId,在java中就可以這么寫(xiě):resourceId(“cc.forestapp:id/button_text”)。所以這里開(kāi)始按鈕用uiautomator表達(dá)式就可以這樣寫(xiě):
‘new UiSelector().resourceId(“cc.forestapp:id/button_text”)’
代碼如下:
這里需要注意一點(diǎn):在java中,字符串必須要用雙引號(hào),不能用單引號(hào)。所以python中用字符串封裝java代碼時(shí)外面最好用單引號(hào),或者如果非要用雙引號(hào)的話,可以在java代碼中字符串部分的雙引號(hào)前面加上\進(jìn)行轉(zhuǎn)義,表示這就是純粹的單引號(hào),并不代表字符串,就像這樣:
selector = "new UiSelector().resourceId(\"cc.forestapp:id/button_text\")"父級(jí)找子級(jí)
uiautomator也可以像xpath一樣,根據(jù)父級(jí)元素找子級(jí)元素。
這里依然拿開(kāi)始按鈕做定位。可以看到開(kāi)始按鈕元素還有一個(gè)父級(jí)元素:
我們先定位到父級(jí)元素,比如說(shuō)通過(guò)class屬性和enabled屬性進(jìn)行定位:
className(“android.view.View”).enabled(true)
接著找它下面的子元素,這里我們可以通過(guò)resource-id屬性來(lái)定位:resourceId(“cc.forestapp:id/button_text”)
合起來(lái)就變成這樣:
new UiSelector().className(“android.view.View”).enabled(true).childSelector(new UiSelector().resourceId(“cc.forestapp:id/button_text”))
我們通過(guò)search for element來(lái)根據(jù)uiautomator方式查找元素,是可以找得到的:
寫(xiě)入代碼中如下:
元素等待
跟web一樣,元素的定位在很多情況下也需要等待。web自動(dòng)化測(cè)試中的三大等待依然使用與app自動(dòng)化測(cè)試,這里不再展開(kāi)贅述。
常用元素定位輔助工具
除了appium自帶的inspector之外,還有兩款不錯(cuò)的元素定位的輔助工具:
- android sdk自帶的uiautomator
- 網(wǎng)易出的weditor
好處:1.xpath使用的是相對(duì)定位
2.可方便查看package和activity
3.可顯示一個(gè)元素的坐標(biāo)
4.可自動(dòng)生成python的自動(dòng)化測(cè)試代碼
appium中無(wú)法啟動(dòng)uiautomator2
原因
uiautomator2可能和其他的第三方定位工具(如weditor)同時(shí)存在,導(dǎo)致產(chǎn)生兩個(gè)adb從而造成沖突
解決方法
- 關(guān)閉第三方定位工具,重啟appium server
- 還不行,則刪除真機(jī)或模擬器上的appium settings,再次啟動(dòng)appium server
- 還不行,則重啟模擬器或真機(jī),再次啟動(dòng)appium server
- 還不行,可停掉uiautomator2的服務(wù)
步驟:1.通過(guò)以下命令查找uiautomator服務(wù):
adb shell pm list package | grep uiautomator
也可以查看instrumentaion:
adb shell pm list instrumentaion
2.卸載uiautomator2服務(wù)
adb uninstall io.appium.uiautomator2.server
adb uninstall io.appium.uiautomator2.server.test
3.重啟appium server
總結(jié)
以上是生活随笔為你收集整理的APP自动化基础之元素定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工业网关,工业智能网关
- 下一篇: 程序文件夹下常见的.dll文件、lib文