appium 控制項定位

來源:互聯網
上載者:User

標籤:

轉自:http://www.2cto.com/kf/201410/340345.html

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

1. findElementByName1.1 樣本

 

?
12 el = driver.findElementByName("Add note");assertThat(el.getText(),equalTo("Add note"));
1.2 如何獲得Name

 

安卓裝置沒有找到適合的方法,嘗試用Appium Inspector,但是使用了當前最新的“AppiumForWindows-1.2.3.1”沒有看到這個屬性,且Inspector在Windows下面非常的不穩定,很容易crash。真心期望Appium團隊儘快解決這個問題

iOS裝置倒可以用Appium Inspector獲得(以片來自網上)

1.3 建議

個人建議可以嘗試先用view顯示的文本作為name看是否能拿到該控制項,按照我個人的經驗一般都是會成功的,所以我很懷疑安卓上面控制項的name是否就等於text。如果確實還是不行的話就只好放棄用name了。或者等待Appium後來的穩定的inspector發布後看是否可以獲得控制項的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參數

 

UIAutomator擷取控制項的方式多種多樣,都是通過UiSelector對象來去尋找,比如使用view的text文本去當前視窗尋找控制項,這裡不做累述,往後會另起一篇文章來描述UIAUtomator擷取控制項的方式,到時直接套用進來就可以了。

3. findElementByClassName3.1 樣本

 

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

 

3.2 如何獲得控制項的ClassName

 

可以使用UIAutomatorViewer工具直接查看

3.3 建議

使用ClassName一般獲得的view都不止一個,所以應該需要遍曆一遍得到的views,然後縮寫搜尋條件來獲得目標控制項。樣本中因為只有一個textview控制項在視窗上面,所以不需要遍曆。

4. findElementById4.1 樣本

 

?
12 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. findElementByAccessibilityId5.1 樣本?
12 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”),所以最佳的辦法就是跟Team Dev溝通好每個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.findEelementByXPath10.1 樣本?
123 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的相應屬性的時候就調用該函數來慢慢尋找了^_^

appium 控制項定位

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.