Selenium介绍及原理解析

[url]http://hi.baidu.com/liyunluck/blog/item/bbb5ec61b6e6ee6a0d33faef.html[/url]

Selenium介绍及原理解析
2009-10-31 19:05
一、什么是Selenium?

Selenium是ThoughtWorks公司的一个强大的开源Web功能测试工具系列,采用Javascript来管理整个测试过程,包括读入测试套件、执行测试和记录测试结果。它采用Javascript单元测试工具JSUnit为核心,模拟真实用户操作,包括浏览页面、点击链接、输入文字、提交表单、触发鼠标事件等等,并且能够对页面结果进行种种验证。也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。(Selenium的核心是Javascript写的,他和浏览器进行通信,把测试用例的信息发送给浏览器执行,从而达到自动化测试的目的。)

Selenium系列主要包括4中产品,如下:

1. Selenium Core

Selenium Core是Selenium的核心,是有Javascript和Html文件组成的,它是Selenium IDE和Selenium RC的核心引擎。

2. Selenium IDE

Selenium IDE提供了一个浏览器的插件模式,在浏览器的该插件的模式下,可以录制和运行脚本。目前只支持Firefox一种浏览器插件。

3. Selenium Remote Control

Selenium RC支持用程序预研编写测试用例,比如Ruby、Java、C#等,这样做的好处是,可以Selenium和其他测试框架集成,比如.NET环境下,可以把Selenium和NUnit集成,用Selenium来编写测试用例,用NUnit来实现测试用例的自动化运行。

Selenium RC比其他包要大,主要包括以下几个部分:

A、Selenium Core

B、Selenium Server运行时;

C、Selenium提供的针对各种开发语言的类库。

Selenium Core和Selenium Server 运行时都是放在Selenium-server.jar中,Selenium RC提供的应用程序类库重要包括下面几种语言:

Java、Ruby、Php、Phthon、Perl、.NET。

4. Selenium Grid

Selenium Grid是Selenium的一个扩展,也是开源的,他把管理一小撮Selenium-RC的事情和为了运行一个测试而连接一个 SeleniumServer的事情分开了,实际上,Selenium Grid提供了一个hub,像个用于控制测试的远程控制器,但是是显示的将请求发送到一个或多个机器上的某个有效的Selenium-RC实例上。

注意:Grid只是提供了一个脚本运行的环境,至于脚本以什么样的方式去跑(并行的方式或者是多环境的方式),要看脚本本身和和脚本的Runner的配置决定的。

二、选择合适的Selenium 工具

既然Selenium工具有这么多,那么到底如何选择呢??


1. 需要远程安装

即是否需要在被测网站的服务器端安装,这里只有Selenium Core需要,因为出于浏览器的同源策略的原因(同源策略后面会讲到),这个也是Selenium Core的一个限制,如果你要测试www.google.com网站,那你还需要在google网站的服务器上安装一个Selenium Core;
而Selenium IDE和Selenium Core HTA不会同源策略所限制,因为他们对浏览器扩展了。
Selenium RC提供了一个代理服务器,保证了Selenium JS文件时来自同一个远程服务器的,从而符合同源策略。

2. 将测试结果写到磁盘

只有Selenium Core不能将任何测试结果写到磁盘上(因为它是用javascript写的,它不允许向磁盘写数据),其解决方案是当然你可以将测试结果发送到另外一台服务器保存。这也是Selenium Core的一大限制。

OK,现在我们来研究下到底该使用哪款工具开展测试!
1.Selenium IDE支持并且只支持Firefox浏览器,支持的浏览器太少,而依附于Firefox也不便于日后开展自动化测试,但是,它的录制快捷好用!并且有代码转换功能,可以把Selenium语言测试案例转为C#,Java等语言的测试案例,我建议使用Selenium IDE + FireBug进行测试案例的编写,然后转为其他语言的测试案例后,再调用Selenium RC运行测试案例。

2. Selenium Core,它的优点是编写测试案例简单,并且支持绝大多数的浏览器,但缺点也同样明显,Selenium Core需要远程安装,Selenese语言也限制了复杂案例的可能性,并且没有良好的外部扩展,这是些都会是致命的问题。因为一个款测试工具不可能 100%满足你测试需求的,当它不能满足你测试需求时候,它必须有一个扩展机制可以让你可以使用其他的方式满足你需求,否则这款测试软件即使功能强大,也请三思慎用,否则当投入大量资源后才发现某些问题不能解决,那时候已经晚了,这是我的切身体会。

3.Selenium RC是我推荐使用的工具,它支持很多浏览器,可以使用C#,Java等语言编写测试案例,易于维护,同时提供了很好的扩展性,所以后续的文档我会以Selenium RC作为默认的测试工具。

三、Selenium RC组成

下表一个简单的架构图:


Selenium RC由两部分组成:
(1)Selenium Server
Selenium Server主要控制浏览器行为,总的来说,Selenium Server由三部分组成:Launcher、Http Proxy、Selenium Core,其中Selenium Core是在Selenium Server启动浏览器时,嵌入到浏览器中的。Selenium Core是一堆Javascript函数集合,当Selenium RC通过网络与 Selenium Server通讯时(通过简单的Http Get或Post请求),Selenium Server解析客户端请求为Selenese Command,然后就会调用相应的JS函数来控制浏览器操作。

(2)Selenium Libraries
写测试案例时主要控制Selenium Server库,客户端提供了编程接口,允许你可以通过编程运行Selenium命令,Client Libraries为每一种编程语言提供了与Selenium RC 服务器通讯的编程接口。一个Selenium客户端类库实际上时提供一套函数集合,你可以通过运行你的测试程序来运行Selenium Command,类库中的每一个接口都是和Selenium Command一一对应的。
客户端类库通过发送一个Selenium Command与Selenium Server通讯,从而使被测应用程序执行相应的操作。客户端类库接收到Selenium Command命令返回的结果,并把结果返回给应用程序并赋值给相应的变量。
注:可以通过Selenium IDE生成Selenium-RC代码。


四、Selenium-RC架构

1. 什么是同源策略?
同源策略,它是由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不能执行,从而防止其他网页对本网页的非法篡改。
2. Selenium RC运行模式:
Selenium RC有两种运行模式,分别是Heightened Privileges Browsers和Proxy Injection。

A、Heightened Privileges Browsers(高特权模式)


这种工作模式与代理模式的工作流程是很相似的,唯一的不同时的是,在Heightened Privileges Browsers模式下,Browser对Web的请求没有经过Http Proxy,所以返回的Web页面就有可能和Selenium Core不同源了(一般的情况下,Open都应该只获取“源”下的某个子页面,用Open获取其他“源”的页面在测试中应该是极少数的,因为在这种情况 下,我们还应该再new一个新的ISelenium selenium进行处理,虽然用Open获取其他“源”的页面出现的机会极少,但如果真的需要这样的话,也只能启动 -proxyInjectionMode模式了,虽然这样的效率会低一些)。

B、Proxy Injection(代理模式)


(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需要以这种代理模式运行。

五、Selenium Server解析

1. 首先启动Selenium服务:(以交互模式启动Selenium服务)


先说一下Firefox启动问题,在本地目录 C:\Documents and Settings\Administrator\Application Data\Mozilla\Firefox中包含了Firefox浏览器的一些配置信息,profiles.ini文件内容如下图所示:


大家可以看到,现在我机器上一共配置了两个Profile,关闭所有Firefox浏览器,在命令行中输入firefox.exe –profilemanager,可以选择浏览器所使用的Profile,之后选择“打开”,浏览器就会以指定额度配置文件打开,同时还可以新建和删除 Profile文件。
而Selenium Server服务启动时,如果不指定-firefoxProfile参数,那么Selenium Server就会打开一个全新的Firefox浏览器(不包含任何扩展与附件组件),而指定此参数后,表面上我们看到Selenium Server会使用指定的配置文件打开浏览器,而实际上Selenium Server仍然会在目录C:\Documents and Settings\Administrator\Local Settings\Temp中生成一个新的配置文件,profile所在文件夹的名字是自动生成的,命名规则是” customProfileDir”+sessionId。


2. 我们在命令行中输入:
cmd=getNewBrowserSession&1=*firefox &2=http://www.google.com


1.Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&1=*firefox&2=http://www.google.com
我们所编写的测试案例,其实是通过发送Http请求实现对Selenium Server的控制,而测试案例所发送的请求就正是:---> Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession& amp;1=*iexplore&2=http://www.google.com。我们可以再打开一个firefox浏览器,在地址栏输入:http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession& amp;1=*iexplore&2=http://www.google.com,回车!看,Selenium Server又为此产生了一个Session了!呵呵:>
2. 这里,Selenium Server为上面的请求随机生成了一个Session ID:3ba90f6a4d1b4b8994b343cea0bac639,同时会在临时目录C:\Documents and Settings\Administrator\Local Settings\Temp 中产生新的配置文件夹customProfileDir3ba90f6a4d1b4b8994b343cea0bac639 。
3. 如果一切正常,Selenium Server最后会出现Get Result Ok的字样,并出现如下两个框框:

你可能感兴趣的:(测试技术)