Selenium名字由来
关于Selenium的命名比较有意思,当时QTP mercury是主流的商业自化工具,是化学元素汞mercury(俗称水银),而Selenium是开源自动化工具,是化学元素硒Selenium,硒可以对抗汞。
Selenium 1.X
用简单的公式:
Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC
Selenium 1.X 包括Selenium IDE、Selenium Grid、Selenium RC三部分
Selenium IDE
Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
Selenium Grid
用于实现分布式测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。
Selenium RC
Selenium 的核心部分,可以实现利用Selenium的代理服务器来实现访问浏览器实现自动化测试。
Selenium RC分为:Client和Server。
Client实现自动化脚本,Selenium Server负责控制浏览器行为。
Selenium Server分为3部分。有Launcher启动浏览器,将Core嵌入到浏览器,并把浏览器代理设置为Selenium Server的Http Proxy。
使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。
Selenium 2.X
因为Selenium和Webdriver的合并,所以,Selenium 2.0由此诞生。
简单用公式表示为:
Selenium 2.X = Selenium 1.X + WebDriver
Selenium 2.X又名 WebDriver,它的主要新功能是集成了 Selenium 1.X 以及 WebDriver。也就是说 Selenium 2.X 是 Selenium1.X 和 WebDriver 两个项目的合并,即 Selenium 2.X 兼容 Selenium1.X,它既支持 Selenium API 也支持 WebDriver API。
当Selenium2.X 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。
WebDriver与之前Selenium的JS注入实现不同,直接利用了浏览器本机支持来操作浏览器。所以对于不同平台,不同的浏览器,必须依赖一个特定的浏览器的本机组件来实现把WebDriver API的调用转化为浏览器的本地调用。
在我们新建一个WebDriver的过程中,Selenium首先会确认浏览器的本机组件是否存在可用而且版本是否匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。
WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如FirefoxDriver初始化成功之后,默认会从http://localhost:7055开始,而ChromeDriver则大概是http://localhost:46350之类的。接下来,我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做社么事情。
Selenium 3.X
Selenium 3.0做了一些更新:
1、简单用公式表示为:
Selenium 3.0 = Selenium 2.0 + Selenium RC(Remote Control)
2、Selenium3.0只支持Java8版本以上。
3、Selenium3.0中的Firefox浏览器驱动独立了,以前装完selenium2就可以驱动Firefox浏览器了,现在和Chrome一样,必须下载和设置浏览器驱动。
4、只支持IE 9.0版本以上。