Selenium1工做原理

内容主要转自:Selenium工做原理 http://blog.csdn.net/five3/article/details/6790925javascript

 

简介:html

  Selenium 1.0中可使用多种语言编程,固然前提是支持http库。在运行selenium1.0程序以前需先启动selenium server端(selenium remote control),简称RC。RC主要包括三个部分:launcher,http proxy,selenium core。其中selenium core是被selenium server嵌入到浏览器页面中的,selenium core内部是一堆javascript函数构成,经过调用这些函数来实现对浏览器的各类操做。而selenium 2.0(selenium1 + webdriver)最显著的特色就是不用再启动server端了。java

  Selenium 1.0是第一个基于浏览器的开源自动化测试工具,由javascript实现的,因此只要是支持javascript的浏览器均可以很好的支持它。但缺点是,每个浏览器对于执行 javascript都有很严格的安全限制(不可跨域),以防止用户被恶意脚本攻击。这也致使了selenium在某些场景下的测试工做变得很困难,好比IE下面的 upload操做就不容许执行往输入框中填写文件的路径。python

  主要有如下几点问题亟待解决: 1.没有原生的鼠标和键盘事件 2.XSS/HTTP同源数据问题 3.popup dialog问题  web

  Webdriver对不一样浏览器的处理方式和selenium有着明显的不一样,selenium是无论什么浏览器都是javascript来处理,而webdriver是选择浏览器最容易接受的语言来处理。好比,在IE 中,C++最合适,在firefox中,javascript最合适等等。经过灵活选择最合适的语言来处理多浏览器,咱们能够很好的回避某些浏览器对 javascript的安全限制。并且webdriver不只仅具备这些能力,它还可以调用操做系统API,尤为是当用户须要模拟鼠标和键盘进行真是的页面操做的时候,这项能力的做用尤其明显。  把上面两款工具放到一块儿比较,优缺点就比较明显了。Selenium要求真实的浏览器环境,而webdriver能够直接操做HTML unit驱动,你们都知道selenium启动firefox很是慢,而webdriver能够经过HTML unit在系统内存中迅速的执行,可是这二者都不方便调试。chrome

  Webdriver不支持并行测试,而selenium GRID支持。Webdriver要求针对浏览器选择最合适的语言来编写脚本,而Selenium能够把多种语言解析成javascript来操控植入浏览器的Selenium Core来完成操做,所以把二者的优势集合起来,即selenium 1.0+webdriver=selenium 2编程

 

如何启动Selenium1的测试脚本?跨域

1. Selenium IDE能够导出多种语言的Selenium脚本,也可本身编写测试脚本(python):浏览器

1 from selenium import selenium 2 
3 sel = selenium("localhost", 4444, "*firefox", "https://www.baidu.com/") 4 sel.start() 5 # 百度搜索关键字selenium grid
6 sel.open("/") 7 sel.click("id=kw") 8 sel.type("id=kw", "selenium grid") 9 sel.click("id=su")
View Code

2. 启动server,在server包的目录下的cmd输入:java -jar selenium-server-standalone-3.0.1.jar安全

3. 执行测试脚本

 

 

 一.Selenium RC的组成

Selenium 1.0家谱

 


Selenium RC主要由两部分组成:
(1)Selenium Server: (Remote Server)

  Selenium Server负责控制浏览器行为,总的来讲,Selenium Server主要包括3个部分:Launcher,Http Proxy,Selenium Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是经过这些JS函数,咱们才能够实现用程序对浏览器进行操做。

(2)Client Libraries:
所编写的测试用例(Testcase),用来控制Selenium Server的库。简单来讲,就是咱们写的测试脚本。

 

二.Selenium RC与Testcase的关系

 

如图:红色步骤1~8等于如下文字(1) (2) (3) (4) ,绿色则与如下步骤相符

(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对请求进行解析成JS,而后经过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 Server须要以这种代理服务器的形式存在?其实,这和浏览器的“同源策略”(The Same Origin Policy)有关。
一.什么是同源策略
同源策略,它是由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 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来自同一个“源”----代理服务器!

 

 

三. Remote的理解

Remote能够启动server = selenium grid。除了能够更方便的进行跨平台、浏览器的测试外,最重要的一点是排除咱们本地环境的污染,由于咱们工做用的PC其实咱们安装了不少的软件,那么在coding的时候这些软件对环境的污染就不免不对咱们的代码产生影响,最后就很容易形成代码在我这运行良好,可是到了别人那就跑不起来了或者结果有差别,这时咱们就须要一个干净的PC环境做为一个验证机,在本身的PC上编写完代码后在验证机上进行Remote执行验证。固然把代码拷贝过去执行也是能够。

 

我的理解,remote是早期selenium1便存在,后来webdriver是继承了它也重写了它。因此早期remote是经过RC执行脚本,不须要驱动,但如今到selenium3,只存在webdriver协议那样的工做方式。因此涉及曾在selenium1合并过来的grid --》 server--》chromedriver驱动 --》chrome浏览器,也是用webdriver工做方式在跑。

相关文章
相关标签/搜索