最近网上学习了Selenium1和selenium2,本身作一些总结,方便之后查阅。javascript
部份内容引用:html
http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.htmljava
http://www.jianshu.com/p/4f0930c0b6a8web
Selenium RC与Testcase的关系浏览器
(1).测试案例(Testcase)经过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server创建链接。安全
为何要经过发送Http请求控制Selenium Server而不采用其余方式呢?从上文能够看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它能够架设在其余机器上!因此测试案例经过发送HTTP请求去控制Selenium Server是很正常的。服务器
(2).Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。架构
(3).测试案例经过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,而后经过Http Proxy发送JS命令通知Selenium Core执行操做浏览器的动做。框架
(4).Selenium Core接收到指令后,执行操做。分布式
(5).浏览器收到新的页面请求信息(由于在(4)中,Selenium Core的操做可能引起新的页面请求),因而发送Http请求,请求新的Web页面。
因为Selenium Server在启动浏览器时作了手脚,因此Selenium Server会接收到全部由它启动的浏览器发送的请求。
(6).Selenium Server接收到浏览器的发送的Http请求后,本身重组Http请求,获取对应的Web页面。
(7).Selenium Server的Http Proxy把接收的Web页面返回给浏览器。
Selenium RC的组成:
Selenium RC主要由两部分组成:
(1).Selenium Server:
Selenium Server负责控制浏览器行为,总的来讲,Selenium Server主要包括3个部分:Launcher,Http Proxy,Selenium Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是经过这些JS函数,咱们才能够实现用程序对浏览器进行操做。
(2).Client Libraries:
写测试案例时用来控制Selenium Server的库。
Selenium Server为何以代理服务器的形式存在
Selenium Core是一堆JS函数的集合,它是咱们操做浏览器的基础。当存在同源策略时,便出现一些问题,看下图:
由于Selenium Core的JS脚本的“源”是localhost,因此浏览器会阻止Selenium Core的JS脚本在测试页面上执行,这就是为何在本系列第一篇中说,若是只使用Selenium Core进行测试,须要把Selenium Core安装到远程服务器上。
为了解决上面这个问题,Selenium RC中的Selenium Server就以代理服务器的形式出现了,下图说明它是如何借助代理的身份蒙骗浏览器的:>
Selenium Server以代理的形式存在,经过修改WebSite的源信息,从而达到欺骗浏览器的目的,就这样,Selenium RC就轻松绕过了同源策略。在上图中,浏览器会认为WebSite和Selenium Core来自同一个“源”----代理服务器!
什么是同源策略
同源策略,它是由Netscape提出的一个著名的安全策略,如今全部的可支持javascript的浏览器都会使用这个策略。
为何须要同源策略,这里举个例子:假设如今没有同源策略,会发生什么事情呢?你们知道,JavaScript能够作不少东西,好比:读取/修改网页中某个值。恩,你如今打开了浏览器,在一 个tab窗口中打开了银行网站,在另一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站而且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会很是严重!而同源策略就为了防止这种事情发生, 看下图:
好比说,浏览器的两个tab页中分别打开了http://www.baidu.com/index.html和http://www.google.com/index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和www.baidu.com同源的脚本才能被执行,所谓同源,就是指域名、协议、端口相同。因此,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能执行,从而防止其余网页对本网页的非法篡改。
selenium 1.0和selenium 2.0区别
下面用见到的一幅图来讲明Selenium 1.0:
selenium 1.0包括:selenium IDE、selenium Grid、selenium RC三部分。
selenium IDE:firefox的一个插件,能够录制和回放脚本。
selenium Grid:用于实现分布式测试。利用Grid,能够很方便地同时在多台机器上和异构环境中并行运行多个测试事例。
selenium RC:selenium 的核心部分,能够实现利用selenium的代理服务器来实现访问浏览器实现自动化测试。
其中:selenium RC分为:Client和Selenium Server。
client实现自动化脚本,Selenium Server负责控制浏览器行为。
Selenium Server分为3部分。
Launcher:启动浏览器
Http Proxy:selenium Server的Http代理
Core:嵌入到浏览器的js代码。
由Launcher启动浏览器,将core嵌入到浏览器,并把浏览器代理设置为selenium Server的Http Proxy。
Selenium 1.0使用的是Javascript注入技术与浏览器打交道,须要SeleniumRC启动一个Server,将操做Web元素的API调用转化为一段段 Javascript,在Selenium内核启动浏览器以后注入这段Javascript。开发过Web应用的人都知道,Javascript能够获取 并调用页面的任何元素,自如的进行操做。由此才实现了Selenium的目的:自动化Web操做。这种Javascript注入技术的缺点是速度不理想, 并且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。
Selenium 2.0 则是把selenium 1.0中selenium RC替换为了WebDriver
selenium RC 在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript 翻译器来翻译和执行selenese命令(selenese 是selenium命令集合)。
WebDriver利用浏览器原生的API,封装成一套更加面向对象的SeleniumWebDriverAPI,直接操做浏览器页面里的元素,甚 至操做浏览器自己(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。因为使用的是浏览器原生的API,速度大大提升,并且调用的稳定性交给了浏 览器厂商自己,显然是更加科学。然而带来的一些反作用就是,不一样的浏览器厂商,对Web元素的操做和呈现多少会有一些差别,这就直接致使了 SeleniumWebDriver要分浏览器厂商不一样,而提供不一样的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有 专门的ChromeDriver等等。
Selenium Webdriver
webdriver自动化俗称Selenium 2.0测试Web应用程序工具。 webdriver使用不一样的底层框架,Selenium 遥控器使用JavaScript的Selenium 核嵌入式已经在有必定的局限性的浏览器中。 webdriver直接交互而不与Selenium 远程控制,依赖于服务器上的任何中介的浏览器。它是用在如下方面:
在Selenium开发者社区努力下,不断提升Selenium webdriver与Selenium的整合。
体系结构
webdriver最好用一个简单的架构图,说明,以下图所示。
Selenium RC |
Selenium WebDriver |
Selenium RC的结构复杂,由于服务器须要启动在开始试运行前。 |
webdriver架构比Selenium RC简单,由于它控制着从操做系统层面的浏览器。 |
Selenium服务器充当浏览器和Selenese的命令之间的中间人 |
webdriver直接相互做用,以在浏览器和使用浏览器的引擎进行控制。 |
Selenium RC的脚本执行速度较慢,由于它使用了Javascript来与RC互动 |
webdriver的速度更快,由于它直接交互使用的浏览器。 |
Selenium RC不能支持无头,由于它须要一个真正的浏览器一块儿工做。 |
webdriver能够支持无头执行 |
它是一个简单的API |
复杂,API相比,RC有点大 |
减面向对象的API |
纯粹的面向对象的API |
不能测试移动应用程序 |
可测试iPhone/Android应用程序 |