前提:获取控件信息使用uiautomatorviewer,在sdk的目录下D:\Android\sdk\tools\uiautomatorviewer.bat。
几种定位方法:
(1). 通过控件id
//返回泛型list
driver.findElementsById("控件的id");
//返回单个控件对象
driver.findElementById("控件id");
(2). 通过控件的类
//例如获取界面的EditText控件
//返回list
driver.findElementsByClassName("android.widget.EditText");
//返回单个控件对象,多个返回第一个
driver.findElementByClassName("android.widget.EditText");
driver.findElement(By.name("android.widget.EditText"));
(3). 通过坐标
这个返回不了控件,一般用来做滑动,或者点击某个坐标。
//从宽度的3/4 向左滑动到1/4,, y轴是中间
public void swipeToLeft(int during) {
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);
}
(5). 通过Xpath
XPath是XML Path的简称(由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位xml或者html页面元素)
有兴趣的学一下: http://www.w3school.com.cn/xpath/
关于xpath这种定位方式,webdriver会将整个页面的所有控件进行扫描以定位我们所需要的控件,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做控件定位的话,将导致你的脚本执行速度降低,所以请慎用。
①. 绝对路径写法:
只有一种,使用右斜杠/
查找根元素的EditText: /android.widget.EditText
②. 相对路径
查找页面根控件://
查找页面上所有的EditText控件://android.widget.EditText
查找页面上第一个TextView控件://android.widget.TextView[1]
查找页面上id为login的控件://[@id=’login’]
查找页面上具有text属性为username的TextView控件://android.widget.TextView[@text=’username’]
查找页面上id为loginLayout的LinearLayout控件下的第一个TextView控件://android.widget.LinearLayout[@id=’loginLayout’]/TextView[1]
③. contains关键字
获取text里面包含保的TextView控件: driver.findElement(By.xpath(“//android.widget.TextView[contains(@text, ‘存’)]”));
④. start-with
获取text里面保开头的TextView控件: driver.findElement(By.xpath(“//android.widget.TextView[starts-with(@text, ‘保’)]));
⑤. text关键字
获取文本为保存的控件: driver.findElementByXPath(“.//*[@text=’保存’]”);
(5). 获取界面的XMl文件
driver.getPageSource();
其他常用方法:
1. 显示等待
AndroidDriverWait
2.隐式等待
driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS);
implicitlyWait() 不是休眠,是全局设置超时时间,在findelement或者findelements的时候,首先去找控件,如果没有找到,判断时间否超过implicitlyWait()设置了的时间,如果没有超过,则再次找这个元素,直到找到元素或者时间超过最大阀值。那我们就可以设定一个比较长的超时时间,但同时也不会让程序白白的等待。默认是250ms。
3. 线程超时
Thread.sleep()
断言:
assertTrue:判断是否为True。
assertFalse:判断是否为false。
assertSame:判断引用地址是否相同。
assertNotSame:判断引用地址是否不相同。
assertNull:判断是否为null。
assertNotNull:判断是否不为null。
assertEquals:判断是否相等,Object类型的对象需要实现haseCode及equals方法。
assertNotEquals:判断是否不相等。
assertEqualsNoOrder:判断忽略顺序是否相等。