一. 测试工程
1. 测试需求:访问百度主页,搜索某个关键词,并验证搜索结果页面的标题。
2. 手工操作验证步骤:
1. 打开 Chrome 浏览器,输入百度的网址“www.baidu.com";
2. 在搜索输入框中输入关键词“VS Code”并按下回车键;
3. 验证搜索结果页面的标题是否是“VS Code_百度搜索”。
3. Java代码实现步骤:
1. 因为用到 Chrome 浏览器,所以需要先下载 Chrome Driver 并将其放到浏览器安装目录;
2. 建立一个空的 Maven 项目,然后再 POM 文件中加入 Selenium 的依赖,代码如下:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.1</version>
</dependency>
3. 接着写一个测试方法,代码如下所示:
@Test
public void contextLoads() throws InterruptedException {
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.navigate().to("https://www.baidu.com/");
WebElement search_input = driver.findElement(By.name("wd"));
search_input.sendKeys("VS Code");
search_input.submit();
Thread.sleep(5000);
System.out.println("Title is :" + driver.getTitle());
driver.quit();
}
运行测试类,看看会执行的操作
1. 这段代码会自动在你的电脑上打开 Chrome 浏览器;
2. 在 URL 栏自动输入 「https://www.baidu.com/」;
3. 百度主页打开后,在输入框自动输入 「VS Code」并执行搜索;
4. 返回搜索结果页面;
5. Chrome 浏览器自动退出。
二. Selenium 的实现原理
1. Selenium 1.0 的工作原理
Selenium 1.0,又称 Selenium RC,其中 RC 是 Remote Control 的缩写。Selenium RC 利用的原理是:JavaScript 代码可以很方便地获取页面上的任何元素并执行各种操作。
但是因为 「同源政策(Same-origin policy)」(只有来自相同域名、端口和协议的 JavaScript 代码才能被浏览器执行),所以要想在测试用例运行中的浏览器中,注入 JavaScript 代码从而实现自动化的 Web 操作,Selenium RC 就必须 「欺骗」被测站点,让它误以为被注入的代码是同源的。
通过引入 Selenium RC Server 实现,其中的 Http Proxy 模块就是来「欺骗」浏览器的。另一部分就是 Client Libraries。他们的具体关系如下图所示:

2. Selenium 2.0 的工作原理
Selenium 2.0,又称 Selenium WebDriver,其原理是:使用浏览器原生的 WebDriver 实现页面操作。实现方式完全不同于 Selenium 1.0。
Selenium WebDriver 是典型的 Server-Client 模式,Server 端就是 Remote Server。以下是 Selenium 2.0 工作原理:

1. 当使用 Selenium 2.0 启动浏览器时,后台会同时启动基于 WebDriver Wire 协议的 Web Service 作为 Selenium 的 Remote Server,并与浏览器绑定。之后,Remote Server 就开始监听 Client 端的操作请求;
2. 执行测试时,测试用例会作为 Client 端,将需要执行的页面操作请求以 Http Request 的方式发送给 Remote Server 。该 Http Request 的 body,是以 WebDriver Wire 协议规定的 JSON 格式来描述需要浏览器执行的具体操作;
3. Remote Server 接收到请求后,会对请求进行解析,并将解析结果发给 WebDriver,由WebDriver 实际执行浏览器的操作;
4. WebDriver 可以看做是直接操作浏览器的原生组件(Native Component),所以搭建测试环境时,通常都需要先下载浏览器对应的 WebDriver。