1. 什么是 Selenium?
Selenium 是一套软件工具,是用于 Web UI 自动化测试的常用框架。具有以下特性:- 开源:可以根据需要来增加或者重构工具的某些功能。
- 跨平台: Linux、Windows、Mac。
- 支持多种编程语言。
- 核心功能就是可以在多个浏览器上进行自动化测试。
- 目前已经被 google、百度、腾讯等公司广泛使用。
2. Selenium 发展历程
Selenium 1.0
2004 年,ThoughtWorks 公司里一个叫做 Jason Huggins 为了减少手工测试的工作,自己写了一套 JavaScript 的库,这套库可以进行页面交互,并且可以重复的在不同浏览器上进行重复的测试操作。
这套库后来变为了 Selenium Core,为 Selenium Remote Control(RC)和 Selenium IDE 提供了坚实的核心基础能力。
Selenium 的作用是划时代的,因为他允许你使用多种语言来控制浏览器。
Selenium 1.0 组成
- Selenium IDE:Selenium IDE 是嵌入到 Firefox 浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
- Selenium Core:整个测试机制的核心部分,即有 assertion(断言)机制的 test suite runner。它由一些纯 js 代码组成,可以运行在 Windows/Linux 的不同 Browser 上。
- Selenium Remote Control(RC):Selenium 家族的核心部分。Selenium RC 支持多种不同语言编写的自动化测试脚本,通过 Selenium RC 的服务器作为代理服务器去访问应用,从而达到测试的目的。Selenium RC 分为 Client Libraries 和 Selenium Server。Client Libraries 库主要用于编写测试脚本,用来控制 Selenium Server 的库;Selenium Server 负责控制浏览器行为。
- Selenium -Grid:可以并行的在多个测试环境执行测试脚本,实现脚本的并发测试执行,以此缩短大量测试脚本集合的执行时间。
Selenium 1.0 工作流程
- 执行测试脚本(网站请求);
- 发给 RC(提前启动的一个 jar 包);
- RC 收到请求,启动浏览器;
- 浏览器启动后,自动访问设定好的网站,并发出请求(浏览器的代理服务器设定为了 RC 的 IP,所有的浏览器请求均通过 RC 的正向代理去请求);
- 将浏览器请求转发给 RC;
- RC 收到浏览器请求后,再转发给网站服务器,网站服务器把源码内容返回;
- RC 拿到源码后,偷偷把 Selenium Core 伪装成源码的一部分,加入到返回结果的网站中,这样就完成了 jJS 注入返回给浏览器。
所有的自动化操作,都是通过测试代码,调用注入的 JS 来实现了。
Selenium 2
慢慢地,浏览器对 JS 的安全限制也对 Selenium 的发展带来了困扰,并且Web 程序也越来越强大,特性也越来越多,都对 Selenium 的发展来说带来了不少困难。
2006 年,Google 的工程师 SimonStewart 发起了 WebDriver 的项目;因为长期以来 Google 一直是 Selenium 的重度用户,但却被限制在有限的操作范围内,且 WebDriver 项目的目标就是为了解决 Selenium 的痛处。
一直以来,Selenium RC 是在浏览器中运行 JavaScript 应用,使用浏览器内置的 JavaScript 翻译器来翻译和执行 Selenese 命令(Selenese 是 Selenium 命令集合)。
而 WebDriver 则是通过原生浏览器的支持,或者浏览器扩展,来直接控制浏览器。WebDriver 针对各个浏览器而开发,取代了嵌入到被测 Web 应用中的 JavaScript,与浏览器紧密集成,因此支持创建更高级的测试,避免了 JavaScript 安全模型(绕过 JS 环境的沙盒效应)导致的限制。
除了来自浏览器厂商的支持之外,WebDriver 还利用操作系统级的调用,模拟用户输入。
2008 年(北京奥运会年), Selenium 和 WebDriver 这两个项目进行了合并,Selenium 2.0 出现了,也就是大家常说的 WebDriver 。
Selenium 与 WebDriver 原是属于两个不同的项目,WebDriver 的创建者 Simon Stewart 早在 2009 年 8 月的一份邮件中解释了项目合并的原因:
- 部分原因是 WebDriver 解决了 Selenium 存在的缺点(例如能够绕过 JavaScript 沙箱,我们有出色的 API)。
- 部分原因是 Selenium 解决了 WebDriver 存在的问题(例如支持广泛的浏览器)。
- 部分原因是 Selenium 的主要贡献者和我都觉得合并项目是为用户提供最优秀框架的最佳途径。
需要强调的是,在Selenium 2.0 中主推的是 WebDriver,可以将其看作 Selenium RC 的替代品。因为 Selenium 为了保持向下的兼容性,所以在 Selenium 2.0 中并没有彻底地抛弃Selenium RC。
Selenium 2 具有来自 WebDriver 的清晰面向对象 API,并能以最佳的方式与浏览器进行交互。Selenium 2不使用 JavaScript 沙盒,它支持多种浏览器和多语言绑定。Selenium 2 支持以下浏览器:
- IE 6-11
- FireFox 大部分版本
- Chrome
- Safari
- Opera
- Android 系统上的自带浏览器
- IOS 系统上的自带浏览器
- HtmlUnit 的*面实现
借助 Selenium 2,我们可以使用 Java、C#、Ruby、和 Python 编写测试。Selenium2 还提供基于 HtmlUnit 的无外设驱动,是用于测试 Web 应用程序的 Java 框架。HtmlUnit 运行速度特别快,但它不是一个真正与真实浏览器相关联的驱动。
Selenium 3.0
2016 年 7 月,Selenium 3.0 悄悄发布第一个 beta 版。
更新内容
- 去掉了对 Selenium RC 的支持。
- 全面拥抱 Java 8。
- 支持 macOS(Sierra or later),支持官方的 Safari Driver。
- 通过 Microsoft 官方的 WebDriverServer 支持 Edge 浏览器(只支持 IE 9.0 版本以上)。
- 通过 Mozilla 官方的 GeckoDriver 来支持 Firefox(尽管 Firefox Driver 非常稳定高效,但因为最新版本的 Firefox 换引擎了,老的 Firefox Driver 应该是不支持新引擎的)。
重要意义
- WebDriver 协议现在已经成为业内公认的浏览器 UI 测试的标准实现。WebDriver 协议是 Google 对开源测试领域的重要贡献。
- 各种官方支持,意味着以后浏览器 UI 测试的速度和稳定性会有较大的提升。
- 浏览器 UI 自动化测试已经成为了行业标配。
- Selenium 专注 Web 测试。