Selenium

Web automated test tool set, include IDE, Grid, RC, WebDriver.

learn url: http://www.webdriver.org/article-4-1.html    http://www.seleniumhq.org/ 

Selenium 1 - Selenium Remote Control 

组成:

selenium server :Launcher-启动和杀死浏览器进程,Http Proxy,Selenium Core(一组使用浏览器内置JavaScript解释器解释和执行脚本命令的JavaScript函数)

client Libraries:提供编程支持(不同的脚本语言java, javascript, rubby...);接收脚本命令,并传递给server;接收脚本命令结果,并传回client端(测试脚本)

原理:

  • 测试案例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接。
  • 为什么要通过发送Http请求控制Selenium Server而不采用其他方式呢?从上文可以看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它可以架设在其他机器上!所以测试案例通过发送HTTP请求去控制Selenium Server是很正常的。
  • Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。
  • 测试案例通过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作。
  • Selenium Core接收到指令后,执行操作。
  • 浏览器收到新的页面请求信息(因为在(4)中,Selenium Core的操作可能引发新的页面请求),于是发送Http请求,请求新的Web页面。
  • 由于Selenium Server在启动浏览器时做了手脚,所以Selenium Server会接收到所有由它启动的浏览器发送的请求。
  • Selenium Server接收到浏览器的发送的Http请求后,自己重组Http请求,获取对应的Web页面。
  • Selenium Server的Http Proxy把接收的Web页面返回给浏览器。

使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

Selenium 2 - Selenium WebDriver

组成:

remote server:可以是任意浏览器。我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出响应

client:测试脚本

原理:

  • 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server。
  • 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。
  • Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。

利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(包括了AndroidDriver和iOS WebDriver)

总之:

测试代码(client端):测试代码发送请求给浏览器的驱动,也就是chrome webdriver > 乘客

浏览器驱动(webdriver):解析这些自动化测试代码,然后发送给浏览器。(浏览器驱动中包含了一个HTTP Server,用来接收这些http请求)> 出租车司机

浏览器(server端):执行浏览器驱动发来的指令,最终完成我们想要的操作 > 出租车

乘客告诉出租车司机要去哪里,出租车司机操控出租车,出租车开始工作

WebDriver两种驱动浏览器的方式:

如果之前熟悉Selenium RC,理解了Selenium RC是如何工作的,那么,当第一次接触Selenium WebDriver的时候,看到WebDriver居然可以不需要指定远端服务器的IP地址和端口号的,一定会惊讶的。

事实上,WebDriver有两种方式“驱动”浏览器的方式。
1. Selenium Server:和Selenium RC一样的,通过指定远端服务器IP地址和端口号,由这个远端服务器来驱动浏览器
2. 直接调用:无须指定任何服务器IP地址和端口号。直接使用本地的浏览器(只要安装相应的浏览器,如IE、Firefox、Chrome)

那如何决定使用哪一种方式呢?很简单的,如果你只需要在本机运行自动化的case,就没必要使用Selenium Server。

在如下的情况下,你可能需要使用Selenium Server:
1. 本地没有你想要运行的浏览器,如代码是在Linux平台运行的,而你希望测试的浏览器是Windows平台的IE
2. 使用Selenium Grid来部署多个浏览器,并发的运行case,降低case运行时间。

两者之间客户端代码在调用上的区别(以Java为例)

不使用Selenium Server:

WebDriver driver = new FirefoxDriver();

使用Selenium Server:

DesiredCapabilities capabilities = new DesiredCapabilities("firefox", "", Platform.ANY);
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub/"), capabilities);

显然哈,如果使用Selenium Server的话,是需要在远程启动Selenium Server的。

Selenium IDE

an integrated development environment for Selenium scripts. It is implemented as a Firefox extension, and allows you to record, edit, and debug tests.

 Selenium-grid

分布式测试执行:在不同的机器上运行驱动不同的浏览器同时运行多个测试。

hub->nodes(机器):一个grid有一个hub和若干个nodes,所有的nodes都已经在hub注册。hub负责接收测试信息,包括测试平台,然后选择适合的node(windows还是mac,有没有case需要的浏览器)。选择node之后,测试命令被发送到hub,进而分配给相应的node,node开始执行case

selenium-grid 已经集成到selenium server了, 所以只需要下载selenium-sever jar文件

启动hub:java -jar selenium-server-standalone-2.44.0.jar -role hub -port 4441 (默认端口好是4444,如果被使用,就可以另外指定,或者先把使用端口4444的进程关掉)

启动node:java -jar selenium-server-standalone-2.44.0.jar -role node -hub http://localhost:4444/grid/register (url中是一个localhost代表这个node和hub在同一台机器上,如果不同,使用机器的ip带起localhost)

原文地址:https://www.cnblogs.com/lj8023wh/p/6674755.html