Selenium自动测试与原理 笔记

来源:互联网 发布:java api文档 编辑:程序博客网 时间:2024/06/05 05:59


Selenium是ThoughtWork公司专门为 Web 应用而开发的自动化测试工具,现由OpenQA托管和维护。

Selenium 的核心,也称 browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。


二、Selenium 组成(分为四部分)

(1).Selenium IDE
Selenium IDE是在core的基础上的一种应用, Selenium IDE是基于FIREFOX浏览器的一个插件,提供GUI界面来运行Selenium测试。Selenium IDE提供脚本回放录制功能,可以将用户在浏览器中执行的操作记录下来,生成各种形式的脚本,可以将这些脚本保存供以后使用。
a).HTML: for Selenium Core mode
b).多种语言的基于rc 模式的test code, 相当于Jmeter的GUI模式和JMeter脚本的生成BadBoy
(2).Selenium Core
是selenium的核心部分,包含核心js以及处理用户指令的proxy server等,是使用HTML的方式来编写测试脚本。,即有assertion机制的test suite runner。它由一些纯JS代码组成,可以运行在windows/linux的不同browser上
需要在Server端安装selenium core jar
(3).Selenium Remote Control (Selenium RC)
采用java编写的代理服务器,测试脚本可以采用多种语言编写。提供一个Selenium Server可以启动,停止和控制任何浏览器,这个服务器使用AJAX直接和浏览器进行交互,可以使用HTTP GET/POST请求向Selenium Server发送命令。
(4).Selenium Core HTA
可以在IE最高安全等级(特权)下工作(仅IE,较少使用)


三、Selenium的运行模式

Selenium可以按两种模式来运行:
(1).TestRunner (selenium-core)
生成的测试脚本可以用Selenium Core手工执行
(2).Driven (selenium-rc)
放入Java,C#,Ruby的单元测试用例中自动运行


四、示例RC模式。实现启动server、测试

Selenium Server是用JAVA实现的,相应的库文件selenium-server.jar,可以通过命令行的方式启动server:
java -jar selenium-server.jar

也可以在测试的程序里启动server,这时候不需要selenium-server.jar, 只需要selenium-java-client-driver.jar,
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

try {
SeleniumServer seleniumProxy = new SeleniumServer(port);
seleniumProxy.start();
} catch (Exception e) {
e.printStackTrace();
}

Selenium selenium =
new DefaultSelenium("localhost", SeleniumServer.getDefaultPort(),
"*firefox", "http://localhost:8080/gt15/");

selenium.start();

selenium.type("widget", "pg98-01");       
selenium.click("submit");
selenium.waitForPageToLoad("10000");

selenium.stop();

String name = selenium.getText("//div[@class='item']//a[@title='" + filename + "']");
//先找属性class="item"的div,再在里面找属性title=变量filename的超级链接a标签,getText是读出<a>和</a>之间的内容
String href = selenium.getAttribute("//div[@id='prest_list']//a[@title='" + filename + "']/@href");
类似,只不过读的是href属性


五、Selenium RC工作原理

Selenium私房菜系列4 -- 深入了解Selenium RC工作原理

  前一篇已经比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢??

  一.Selenium RC的组成:

  关于这个问题,我拿了官网上的一幅图来说明这个问题。

Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)

  图片看不清楚?请点击这里查看原图(大图)。 

  Selenium RC主要由两部分组成:

  (1).Selenium Server:

Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)

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

  (2).Client Libraries:

  写测试案例时用来控制Selenium Server的库。

Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)

  二.Selenium RC与Testcase的关系

  先看下图:

Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)

  图片看不清楚?请点击这里查看原图(大图)。 

  (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 Server需要以这种代理服务器的形式存在呢?

其实,这和浏览器的“同源策略”(The Same Origin Policy)有关。

  一.什么是同源策略

  同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。

  为什么需要同源策略,这里举个例子:

  假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生,看下图:

Selenium私房菜系列7 -- 深入了解Selenium RC工作原理(2)

  图片看不清楚?请点击这里查看原图(大图)。 

  比如说,浏览器的两个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私房菜系列7 -- 深入了解Selenium RC工作原理(2)

  图片看不清楚?请点击这里查看原图(大图)。

  因为Selenium Core的JS脚本的“源”是localhost,所以浏览器会阻止Selenium Core的JS脚本在测试页面上执行,这就是为什么在本系列第一篇中说,如果只使用Selenium Core进行测试,需要把Selenium Core安装到远程服务器上。

   为了解决上面这个问题,Selenium RC中的Selenium Server就以代理服务器的形式出现了,下图说明它是如何借助代理的身份蒙骗浏览器的:>


一.什么是同源策略

    同源策略,它是由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来自同一个“源”----代理服务器!



参考:http://hi.baidu.com/develop_skill/item/aef8c32d75885b55c28d5948

http://www.cnblogs.com/hyddd/archive/2009/05/30/1492213.html


原创粉丝点击