Appium-元素定位(Java篇)
1.根據id來定位
安卓裡定位的Id一般為resource-id
如果id唯一,就能定位到。如果到位不到,可以使用appium-desktop檢查id是否唯一
driver.findElementById("com.sankuai.meituan:id/weather_stub").click();
2.根據name定位
安卓裡text屬性認為是name
由於findElementByName在appium版本1.5後就被廢除了,需要使用xpath來定位text屬性
3.根據content-desc來定位
安卓裡content-desc屬性認為是 AccessibilityId
driver.findElementByAccessibilityId("附近").click();
4.根據ClassName定位
安卓裡的class屬性認為是ClassName
driver.findElementsByClassName("android.widget.ImageButton")
需要注意這種定位方式適用性不強,因為class的種類太少了,一個頁面難免會有重複的,因此,要麼你還能點選頁面中的第一個這種classname,要麼還是需要查詢到該class的一個集合,然後通過下標去訪問。
driver.findElementsByClassName("android.widget.ImageButton").get(index).click();
5.根據AndroidUiAutomator定位元素
AndroidUIAutomator是一個強有力的元素定位方式,它是通過Android UIAutomator類庫去找元素
通過androidUIAutomator 又可以使用其中的 new UiSelector()…訪問控制元件,例如:
className( 即class屬性)
driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.ImageButton\")");
description(即content-desc屬性)
driver.findElementByAndroidUIAutomator("new UiSelector().description(\"美食\")")
resourceId(即resource-id屬性)
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.sankuai.meituan:id/category\")");
text(即text屬性)
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"登入\")");
如果同時需要新增兩個以上條件,可以這樣寫:
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"登入\").resourceId(\"com.sankuai.meituan:id/category\")");
6.根據xpath定位
注意:雖然說xpah定位是萬能的,幾乎沒有找不到的元素,但是建議能用以上的定位方式找到的控制元件,就儘量不用xpath,因為其查詢效率會比較慢。
當元素具有唯一性
6.1 使用XPath根據text內容進行定位*
由於findElementByName在appium版本1.5後就被廢除了,因此想通過text來定位元素需要使用:
driver.findElementByXPath("//*[@text='登入']").click(); //表示在當前可視的整個佈局檔案中搜索某個控制元件的text屬性的值為登入的控制元件
或者更嚴謹一點:
driver.findElementByXPath("//android.widget.Button[@text='登入']").click(); //與上一行程式碼相比,多了一層限定條件(也就是標籤名),查詢效率會高些吧~
或者你也可以只需模糊匹配即可:
driver.findElementByXPath("//android.widget.TextView[contains(@text,'登')]").click();
6.2 使用XPath根據resource-id定位
List<WebElement> elements = driver.findElementsByXPath("//android.widget.TextView[@resource-id='com.sankuai.meituan:id/poi_name']"); elements.get(1).click();//由於不是唯一的id,所以先將所有的id加到一個List中,這樣表示點選了第二家店鋪
當然,如果resource-id是唯一的,那也可以這樣寫:
driver.findElementByXPath("//android.widget.TextView[@resource-id='com.sankuai.meituan:id/poi_name']").click();
6.3 使用xpath的絕對定位和相對定位
如果以上的定位方式都無法定位就要考慮使用絕對定位或者相對定位了
絕對定位就是從文件的根目錄進行查詢定位
driver.findElementByXPath("//android.widget.FrameLayout/android.widget.ListView[1]/android.widget.LinearLayout[2]").click(); //需要注意這裡的xpath定位下標是從1開始的
相對定位就是先定位到一個比較容易定位到的元素,在相對於這個定位進行定位,
driver.findElementByXPath("//android.widget.TextView[@text='優惠團購']/parent::android.widget.LinearLayout").click();//先定位一段文字再定位它的父親