webdriver 实用指南 java 版本
目录如下
启动浏览器
关闭浏览器
浏览器最大化
设置浏览器大小
访问链接
打印当前页面的 title 及 url
前进和后退
简单的对象定位
定位一组对象
层级定位
操作测试对象
send keys 模拟按键输入
处理 button group
处理 button dropdown
处理 navs
处理面包屑
处理对话框新式的模态窗口
获取测试对象的属性及内容
获取测试对象的 css 属性
获取测试对象的状态
处理表单元素
执行 js
处理 alert/confirm/prompt
wait
定位 frame 中的元素
action
上传文件
下载
超时设置
Remote Webdriver
cookie 与自动登陆
启动浏览器
场景
在使用 webdriver 进行测试时启动浏览器无疑是必须的前置工作。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class StartBrowser {
public static void main(String[] args) {
WebDriver dr = new ChromeDriver();
}
}
关闭浏览器
场景
在脚本运行完毕或者测试代码结束的时候关闭浏览器是非常自然的事情,就像在
吃完饭后就把餐桌收拾干净一样。
关闭浏览器有两种方式:
close 方法
quit 方法
close 方法关闭当前的浏览器窗口,quit 方法不仅关闭窗口,还会彻底的退出
webdriver,释放与 driver server 之间的连接。所以简单来说 quit 是更加彻底
的 close,quit 会更好的释放资源,适合强迫症和完美主义者。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class CloseBrowser {
public static void main(String[] args) {
WebDriver dr = new ChromeDriver();
System.out.println("browser will be closed");
dr.quit();
System.out.println("browser is closed");
}
}
浏览器最大化
场景
当我们在测试中使用一些基于图像和坐标的辅助测试工具时,我们就会需要使浏
览器在每次测试时保存最大化,以便在同一分辨率下进行图像比对和坐标点选。
举例来说,如果在 webdriver 测试中使用了 sikuli 来对 flash 插件进行操作的话,
把浏览器最大化无疑是一个比较简单的保证分辨率统一的解决方案。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Maximize {
public static void main(String[] args) throws InterruptedException {
WebDriver dr = new ChromeDriver();
Thread.sleep(2000);
System.out.println("maximize browser");
dr.manage().window().maximize();
Thread.sleep(2000);
System.out.println("browser will be close");
dr.quit();
}
}
设置浏览器大小
场景
设置浏览器窗口的大小有下面两个比较常见的用途:
在统一的浏览器大小下运行用例,可以比较容易的跟一些基于图像比对的
工具进行结合,提升测试的灵活性及普遍适用性。比如可以跟 sikuli 结合,
使用 sikuli 操作 flash;
在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察
或使用图像比对工具对被测页面的前端样式进行评测。比如可以将浏览器
设置成移动端大小(320x480),然后访问移动站点,对其样式进行评估;
代码
将浏览器调整成移动端大小,然后访问移动站点,对移动站点的样式进行评估。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class CloseBrowser {
public static void main(String[] args) {
WebDriver dr = new ChromeDriver();
System.out.println("browser will be closed");
dr.quit();
System.out.println("browser is closed");
}
}
讨论
webdriver 提供了很多调整浏览器窗口的接口,比如 move_to(移动窗口),
position(设置或获取浏览器的位置)。在一般情况下这些功能并不常用。
访问链接
情景
web UI 测试里最简单也是最基本的事情就是访问 1 个链接了。
webdriver 的 api 里有 2 种访问 url 的方式,分别是 get 和 navigate.to 方法。
一般情况下建议使用 get,因为其字母比较少,不太容易出错。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Get {
public static void main(String[] args) throws InterruptedException {
WebDriver dr = new ChromeDriver();
Thread.sleep(2000);
String url = "http://www.baidu.com";
System.out.printf("now accesss %s \n", url);
dr.get(url);
Thread.sleep(2000);
System.out.println("browser will be close");
dr.quit();
}
}
讨论
navigate 方法实际上会产生 1 个 Navigator 对象,其封装了与导航相关的一些
方法,比如前进后退等。
打印当前页面的 title 及 url
情景
测试中,访问 1 个页面然后判断其 title 是否符合预期是很常见的 1 个用例,所
谓用例不够,title 来凑就是这个道理。更具体一点,假设 1 个页面的 title 应该
是'hello world', 那么可以写这样的一个用例:访问该页面,获取该页面的 title,
判断获取的值是否等于'hello world'。
获取当前页面的 url 也是非常重要的一个操作。在某些情况下,你访问一个 url,
这时系统会自动对这个 url 进行跳转,这就是所谓的'重定向'。一般测试重定向
的方法是访问这个 url,然后等待页面重定向完毕之后,获取当前页面的 url,判
断该 url 是否符合预期。另外的一个常见的测试场景是提交了一个表单,如果表
单内容通过了验证,那么则会跳转到一个新页面,如果未通过验证,则会停留在
当前页面,此时获取当前页面的 url 则可以帮助我们判断表单提交的跳转是否符
合预期。更具体一点,假如你在测试一个登陆页面,输入正确的登陆信息后,会
跳转到系统首页。获取跳转后的 url 然后判断其是否与系统首页的 url 相符将是
一个很不错的用例。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class TitleAndUrl {
public static void main(String[] args) throws InterruptedException {
WebDriver dr = new ChromeDriver();
Thread.sleep(2000);
String url = "http://www.baidu.com";
System.out.printf("now accesss %s \n", url);
dr.get(url);
Thread.sleep(2000);
System.out.printf("title of current page is %s\n", dr.getTitle());
System.out.printf("url of current page is %s\n", dr.getCurrentUrl());
System.out.println("browser will be close");
dr.quit();
}
}
前进和后退
场景
说实话,这两个功能一般不太常用。所能想到的场景大概也就是在几个页面间来
回跳转,省去每次都 get url。
代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ForwardAndBack {
public static void main(String[] args) throws InterruptedException {
WebDriver dr = new ChromeDriver();
Thread.sleep(2000);
String firstUrl = "http://www.baidu.com";
System.out.printf("now accesss %s \n", firstUrl);
dr.get(firstUrl);
Thread.sleep(1000);
String secondUrl = "http://www.soso.com";
System.out.printf("now accesss %s \n", secondUrl);
dr.get(secondUrl);
Thread.sleep(1000);
System.out.printf("now back to %s \n", firstUrl);
dr.navigate().back();
Thread.sleep(1000);
System.out.printf("forward to %s \n", secondUrl);
dr.navigate().forward();
Thread.sleep(1000);
System.out.println("browser will be close");
dr.quit();
}
}
简单的对象定位
场景
测试对象的定位和操作是 webdriver 的核心内容,其中操作又是建立在定位的
基础之上,因此对象定位就越发显得重要了。
定位对象的目的一般有下面几种
操作对象