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)