appium 控件定位
轉(zhuǎn)自:http://www.2cto.com/kf/201410/340345.html
AppiumDriver的各種findElement方法的嘗試,嘗試的目標(biāo)應(yīng)用是SDK自帶的Notepad應(yīng)用。
1. findElementByName
1.1 示例
?
?| 1 2 | el = driver.findElementByName("Add note"); assertThat(el.getText(),equalTo("Add note")); |
1.2 如何獲得Name
?
安卓設(shè)備沒(méi)有找到適合的方法,嘗試用Appium Inspector,但是使用了當(dāng)前最新的“AppiumForWindows-1.2.3.1”沒(méi)有看到這個(gè)屬性,且Inspector在Windows下面非常的不穩(wěn)定,很容易crash。真心期望Appium團(tuán)隊(duì)盡快解決這個(gè)問(wèn)題
iOS設(shè)備倒可以用Appium Inspector獲得(以下圖片來(lái)自網(wǎng)上)
1.3 建議
個(gè)人建議可以嘗試先用view顯示的文本作為name看是否能拿到該控件,按照我個(gè)人的經(jīng)驗(yàn)一般都是會(huì)成功的,所以我很懷疑安卓上面控件的name是否就等于text。如果確實(shí)還是不行的話就只好放棄用name了。或者等待Appium后來(lái)的穩(wěn)定的inspector發(fā)布后看是否可以獲得控件的name。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eK49re9t6jU2kFwcGl1bTEuMNauuvPG5Mq10tG+rbn9yrG2+NKqsbtmaW5kRWxlbWVudEJ5QWNjZXNzaWJpbGl0eUlkyKG0+rXDwcujrLK71qq1wM6qyrLDtLu5xNy199PDo6yyws/rysdBcHBpdW3NxbbTz+uxo8H00ru2qLXEvObI3dDU0tTGvbusuf22yLDJoaPH67Lpv7Sjumh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvbWlncmF0aW5nLXRvLTEtMC5tZDwvcD4KPGgxPjIuIGZpbmRFbGVtZW50QnlBbmRyb2lkVUlBdXRvbWF0b3I8L2gxPgo8aDI+Mi4xIMq+wP08L2gyPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;"> el = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")"); assertThat(el.getText(),equalTo("Add note"));
?
2.2 如何獲得UIAutomator參數(shù)
?
UIAutomator獲取控件的方式多種多樣,都是通過(guò)UiSelector對(duì)象來(lái)去查找,比如使用view的text文本去當(dāng)前窗口查找控件,這里不做累述,往后會(huì)另起一篇文章來(lái)描述UIAUtomator獲取控件的方式,到時(shí)直接套用進(jìn)來(lái)就可以了。
3. findElementByClassName
3.1 示例
?
?| 1 2 | el = driver.findElementByClassName("android.widget.TextView"); assertThat(el.getText(),equalTo("Add note")); |
?
3.2 如何獲得控件的ClassName
?
可以使用UIAutomatorViewer工具直接查看
3.3 建議
使用ClassName一般獲得的view都不止一個(gè),所以應(yīng)該需要遍歷一遍得到的views,然后縮寫(xiě)搜索條件來(lái)獲得目標(biāo)控件。示例中因?yàn)橹挥幸粋€(gè)textview控件在窗口上面,所以不需要遍歷。
4. findElementById
4.1 示例
?
?| 1 2 | el = driver.findElementById("android:id/title"); assertThat(el.getText(),equalTo("Add note")); |
?
?
4.2 如何獲得Resource Id
?
可以通過(guò)UIAutomatorViewer獲得
?
4.3 建議
如果目標(biāo)設(shè)備的API Level低于18則UIAutomatorViewer不能獲得對(duì)應(yīng)的Resource ID,只有等于大于18的時(shí)候才能使用。
?
5. findElementByAccessibilityId
5.1 示例
?| 1 2 | el = driver.findElementByAccessibilityId("menu_add_note_description"); assertThat(el.getText(),equalTo("node")); |
5.2 如何獲得AccessibilityId
可以通過(guò)UIAutomatorViewer或者Appium Inspector獲得
5.3 注釋
Accessibility ID在Android上面就等同于contentDescription,這個(gè)屬性是方便一些生理功能有缺陷的人使用應(yīng)用程序的。比如我們有一個(gè)ImageView里面放置一張顏色復(fù)雜的圖片,可能一些色弱色盲的人,分不清這張圖片中畫(huà)的是什么東西。如果用戶安裝了輔助瀏覽工具比如TalkBack,TalkBack就會(huì)大聲朗讀出用戶目前正在瀏覽的內(nèi)容。TextView控件TalkBack可以直接讀出里面的內(nèi)容,但是ImageView TalkBack就只能去讀contentDescription的值,告訴用戶這個(gè)圖片到底是什么。
鑒于這是一個(gè)隱藏屬性,而Android上用于查找控件的各種屬性可能有所缺失或者有重復(fù)(比如id重復(fù),比如一個(gè)list下面的所有項(xiàng)可能都是叫做“id/text1”),所以最佳的辦法就是跟開(kāi)發(fā)團(tuán)隊(duì)溝通好每個(gè)view都賦予一個(gè)唯一的contentDescription。
6. findElementByCssSelector
TBD, 這個(gè)方法應(yīng)該是針對(duì)WebView容器下面的控件定位的,因?yàn)楝F(xiàn)在針對(duì)的是Native App暫時(shí)還沒(méi)有用到,所以先標(biāo)記下,今后需要的時(shí)候加上去。
7. findElementByLinkText
TBD, 這個(gè)方法應(yīng)該是針對(duì)WebView容器下面的控件定位的,因?yàn)楝F(xiàn)在這很對(duì)的是Native App暫時(shí)還沒(méi)有用到,所以先標(biāo)記下,今后需要的時(shí)候加上去。
8. findElementByPartialLinkText
TBD, 這個(gè)方法應(yīng)該是針對(duì)WebView容器下面的控件定位的,因?yàn)楝F(xiàn)在這很對(duì)的是Native App暫時(shí)還沒(méi)有用到,所以先標(biāo)記下,今后需要的時(shí)候加上去。
9.findElementByTagName
這個(gè)方法Appium1.0以后已經(jīng)過(guò)時(shí)并被以上的findElementByClassName取代了,請(qǐng)查看https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md
10.findEelementByXPath
10.1 示例
?| 1 2 3 | el = driver.findElementByXPath("//android.widget.TextView[contains(@text,'Add note')]"); //el = driver.findElement(By.xpath("//android.widget.TextView")); assertThat(el.getText(),equalTo("Add note")); |
10.2 XPath格式變化
從老版本的Appium0.18.x升級(jí)到現(xiàn)在的Appium1.x后,注意class name和xpath策略的變化:你現(xiàn)在需要使用FQCN來(lái)描述你的控件。也就是說(shuō)原來(lái)的:
findElementByXpath(""//TextView[contains(@text,'Add note')]"")
需要改成
findElementByXpath("//android.widget.TextView[contains(@text,'Add note')]")
詳細(xì)變動(dòng)請(qǐng)查看《Appium0.18.x遷移到Appium1.x須知事項(xiàng)》
10.3參考
據(jù)說(shuō)不是很穩(wěn)定:https://github.com/appium/appium/issues/3371 bootstraponline commented on 13 Aug
sometimes uiautomator fails to create the dump.xml. A client side retry may help. I don't think there's much we can do about the problem until Google fixes uiautomator.
11. 終極方法:AppiumDriver getPageSource
最后介紹AppiumDriver的getPageSource函數(shù),可以把當(dāng)前頁(yè)面的元素以XML的方式打印出來(lái),建議大家在找不到view的相應(yīng)屬性的時(shí)候就調(diào)用該函數(shù)來(lái)慢慢查找了^_^
轉(zhuǎn)載于:https://www.cnblogs.com/melody-emma/p/4682189.html
總結(jié)
以上是生活随笔為你收集整理的appium 控件定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《闺怨词三首》第十二句是什么
- 下一篇: phpstrom+xdebug调试PHP