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();//先定位一段文字再定位它的父親