以下是通过Java1.8,appium1.72,安卓5.0.2及安卓7.0
findElementById
driver.findElementById("android:id/title");
//注:就是UIAutomatorViewer里面的resource-id
findElementByClassName
driver.findElementByClassName("android.widget.TextView");
//注:classname重复的可能性比较大,所以我用得很少
findElementByAndroidUIAutomator
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"text\")");
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"text\").enable(true)");
//注:这个是根据元素的属性定位的,可以多个属性,但我试了resource-id提示不可用
findElementByAccessibilityId
driver.findElementByAccessibilityId("text");
//注:据说这个替代了以前的byname,下面是官方hub上的解释:
该字符串相当于利用原生的可访问性(Accessibility)选项,使用 Id/Name 去递归地搜索元素。
findEelementByXPath
driver.findElementByXPath("//className[contains(@text,'text')]");
//在路径className查找text包含text的元素
driver.findElementByXPath("//className[@text='text']");
//在路径className查找text等于text的元素
driver.findElementByXPath("//*[@text='text']");
//这个是模糊查找,就是查找所有属性text='text'的元素
driver.findElement(By.xpath("//className[index]/className[index]"));
//这个方法获取元素时index是指当前父类下同名元素的序列,例如:
上图中android.widget.RelativeLayout下面有两个android.widget.TextView,一个叫“验证码”一个叫“获取短信验证码”;
获取元素“验证码”是:
//android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.TextView[1]
“获取短信验证码”是:
//android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.TextView[2]
获取“微博”是:
//android.widget.RelativeLayout[1]/android.widget.RelativeLayout[2]/android.widget.TextView[3]
绝对地址(前面一根/)从哪里开始计算我也搞不懂,每次用相对地址(前面两根/),从要查找的元素开始往前推2-3级开始写地址。
如果有多个相同属性的元素你没做区分,appium默认选择找到的第一个来使用。
注:据说xpath定位较慢,我在5.0.2上感觉慢(有时候还是比较快,不知道是不是根路径和元素多少有关),在7.0上感觉还是挺快的。
getPageSource
获取页面源码,返回xml文件,里面包含所有元素(据说是这样,但实际不是这样);
我的5.0.2获取到的源码部分元素没有,没有的元素也无法定位,但是在UIAutomatorViewer中能正常找到;
7.0中获取到源码比5.0.2中获取到的更少,但是在7.0中都能定位,在UIAutomatorViewer中也能正常找到;
还不知道原因。
查找toast提示:
不过好像只是通过xpath查找是否有包含该文字的元素,如果其他元素也含有要查找的文字应该也会被找到
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[contains(@text,'"+ toast + "')]")))
//其中toast表示toast提示的文字,表示查找是否包含设置的toast文字
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@text=\"+ toast + \")]")))
//这样应该表示内容文本必须相等。