Appium基於安卓的各種FindElement的控件定位方法實踐和建議


AppiumDriver的各種findElement方法的嘗試,嘗試的目標應用是SDK自帶的Notepad應用。

1. findElementByName

1.1 演示樣例

        el = driver.findElementByName("Add note");
        assertThat(el.getText(),equalTo("Add note"));
        

1.2 怎樣獲得Name

安卓設備沒有找到適合的方法,嘗試用Appium Inspector,可是使用了當前最新的“AppiumForWindows-1.2.3.1”沒有看到這個屬性,且Inspector在Windows以下非常的不穩定,非常easycrash。真心期望Appium團隊盡快解決問題

iOS設備倒能夠用Appium Inspector獲得(下面圖片來自網上)


1.3 建議

個人建議能夠嘗試先用view顯示的文本作為name看能否拿到該控件,依照我個人的經驗一般都是會成功的。所以我非常懷疑安卓上面控件的name是否就等於text

假設確實還是不行的話就僅僅好放棄用name了。

或者等待Appium后來的穩定的inspector公布后看能否夠獲得控件的name。

這種方法在Appium1.0之后事實上已經過時而要被findElementByAccessibilityId代替得了。不知道為什么還能調用,猜想是Appium團隊想保留一定的兼容性以平滑過度吧。請查看:https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md

2. findElementByAndroidUIAutomator

2.1 演示樣例

        el = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");
        assertThat(el.getText(),equalTo("Add note"));

2.2 怎樣獲得UIAutomator參數

UIAutomator獲取控件的方式多種多樣,都是通過UiSelector對象來去查找,比方使用view的text文本去當前窗體查找控件,這里不做累述,往后會另起一篇文章來描寫敘述UIAUtomator獲取控件的方式,到時直接套用進來就能夠了。

3. findElementByClassName

3.1 演示樣例

        el = driver.findElementByClassName("android.widget.TextView");
        assertThat(el.getText(),equalTo("Add note"));

3.2 怎樣獲得控件的ClassName

能夠使用UIAutomatorViewer工具直接查看

3.3 建議

使用ClassName一般獲得的view都不止一個,所以應該須要遍歷一遍得到的views,然后縮寫搜索條件來獲得目標控件。演示樣例中由於僅僅有一個textview控件在窗體上面,所以不須要遍歷。

4. findElementById

4.1 演示樣例

        el = driver.findElementById("android:id/title");
        assertThat(el.getText(),equalTo("Add note"));

4.2 怎樣獲得Resource Id

能夠通過UIAutomatorViewer獲得

4.3 建議

假設目標設備的API Level低於18則UIAutomatorViewer不能獲得相應的Resource ID,僅僅有等於大於18的時候才干使用。

5. findElementByAccessibilityId

5.1 演示樣例

    	el = driver.findElementByAccessibilityId("menu_add_note_description");
    	assertThat(el.getText(),equalTo("node"));

5.2 怎樣獲得AccessibilityId

能夠通過UIAutomatorViewer或者Appium Inspector獲得

5.3 凝視

Accessibility ID在Android上面就等同於contentDescription,這個屬性是方便一些生理功能有缺陷的人使用應用程序的。比方我們有一個ImageView里面放置一張顏色復雜的圖片。可能一些色弱色盲的人,分不清這張圖片中畫的是什么東西。假設用戶安裝了輔助瀏覽工具比方TalkBack,TalkBack就會大聲朗讀出用戶眼下正在瀏覽的內容。

TextView控件TalkBack能夠直接讀出里面的內容,可是ImageView TalkBack就僅僅能去讀contentDescription的值,告訴用戶這個圖片究竟是什么。

鑒於這是一個隱藏屬性,而Android上用於查找控件的各種屬性可能有所缺失或者有反復(比方id反復。比方一個list以下的全部項可能都是叫做“id/text1”),所以最佳的辦法就是跟開發團隊溝通好每一個view都賦予一個唯一的contentDescription。

6. findElementByCssSelector

TBD, 這種方法應該是針對WebView容器以下的控件定位的,由於如今針對的是Native App臨時還沒實用到,所以先標記下,今后須要的時候加上去。

7. findElementByLinkText

TBD, 這種方法應該是針對WebView容器以下的控件定位的,由於如今這非常對的是Native App臨時還沒實用到。所以先標記下,今后須要的時候加上去。

8. findElementByPartialLinkText

TBD, 這種方法應該是針對WebView容器以下的控件定位的,由於如今這非常對的是Native App臨時還沒實用到。所以先標記下,今后須要的時候加上去。

9.findElementByTagName

這種方法Appium1.0以后已經過時並被以上的findElementByClassName代替了,請查看 https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md

10.findEelementByXPath

10.1 演示樣例

        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升級到如今的Appium1.x后,注意class name和xpath策略的變化:你如今須要使用FQCN來描寫敘述你的控件。也就是說原來的:

findElementByXpath(""//TextView[contains(@text,'Add note')]"")

須要改成

findElementByXpath("//android.widget.TextView[contains(@text,'Add note')]")

具體變動請查看Appium0.18.x遷移到Appium1.x須知事項

10.3參考

據說不是非常穩定: 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函數,能夠把當前頁面的元素以XML的方式打印出來。建議大家在找不到view的對應屬性的時候就調用該函數來慢慢查找了^_^


 

作者

自主博客

微信

CSDN

天地會珠海分舵

http://techgogogo.com


服務號:TechGoGoGo

掃描碼:

http://blog.csdn.net/zhubaitian





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM