http://hi.baidu.com/liyunluck/blog/item/bbb5ec61b6e6ee6a0d33faef.html
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的字样,并出现如下两个框框:
分享到:
相关推荐
Selenium 是一个强大的开源Web功能测试工具集合,由ThoughtWorks公司开发。它的核心基于JavaScript,通过JavaScript单元测试工具JSUnit,模拟真实的用户交互,如页面浏览、点击链接、填写表单、触发事件等,同时能对...
总的来说,Selenium WebDriver 的工作原理是通过标准化的协议和驱动程序,实现了测试代码对浏览器的直接控制,提供了丰富的功能和强大的兼容性,使得Web应用的自动化测试变得简单而高效。掌握这些原理,可以帮助我们...
其工作原理主要涉及自动化测试代码、浏览器驱动和浏览器这三个关键组件。我们可以将这个过程类比为出租车服务,其中工程师编写的自动化测试代码扮演乘客角色,浏览器驱动相当于出租车司机,而浏览器则类似于出租车。...
深入研究 Selenium 4.5.0 的源码,不仅有助于理解自动化测试的基本原理,还能帮助开发者更好地利用 Selenium 的功能,解决实际测试中的问题,甚至为框架贡献自己的代码。通过分析源码,我们可以学习到软件设计模式、...
【selenium-java-2.42.2-srcs.jar】包含了Selenium Java客户端库的源代码,这对于开发者来说非常有用,可以查看源码理解其工作原理,或者进行自定义扩展。 【jsoup-1.10.1.jar】是一个Java库,用于处理HTML文档,...
Selenium RC负责解析这些脚本,将其转化为浏览器可以理解的操作指令,从而实现了自动化测试的目的。 ##### 4.3 Selenium RC for Java (Junit)的使用 - **启动Selenium Server**:首先,需要启动Selenium Server,...
# 这里可以添加参数解析,如网址、截图类型等 url = request.form.get('url') # 使用Selenium截取全屏或部分截图 # ... return send_file('screenshot.png', as_attachment=True) if __name__ == '__main_...
通过实际操作,你可以深入了解Selenium的工作原理,提升你的编程技能,并为将来更复杂的爬虫项目打下坚实的基础。同时,参与社区的学习和交流,可以让你不断进步,解决遇到的问题,共同推动技术的发展。
**Selenium RC(Remote Control)** 是一个强大的自动化测试工具,尤其在Web应用程序的测试领域。...尽管现在有了更新的Selenium WebDriver,但了解和掌握Selenium RC的原理和用法对于测试工程师来说仍然很有价值。
`client-combined-3.5.0-nodeps-sources.zip`是源码文件的压缩包,如果你需要查看或调试Selenium的源代码,或者想要了解其内部工作原理,这个文件会非常有用。解压后,你可以通过IDE导入源码,进行学习或自定义扩展...
3. **client-combined-3.13.0-sources.jar**:这个文件包含了源代码,对开发者来说非常有用,因为它允许他们查看和理解Selenium内部的工作原理,便于学习和调试。 4. **LICENSE**:文件包含了Selenium的许可协议,...
11. **源码分析**: 标签中的"源码"可能意味着深入理解Selenium的工作原理,包括阅读其开源代码,了解如何与浏览器通信、如何解析DOM等。 12. **工具**: Selenium作为一个强大的工具,可以与其他工具(如Jenkins、...
淘宝商品爬虫与Selenium破解滑块验证是网络爬虫技术在电商领域的应用,涉及到的主要知识点包括Python编程、网络爬虫原理、Selenium库的使用以及动态验证码的破解策略。以下将详细介绍这些内容。 首先,Python编程是...
本文将深入探讨Selenium Java 3.12.0版本的关键特性、功能及其实现原理。 一、Selenium简介 Selenium的核心理念是提供一个平台和语言无关的API,使得测试工程师可以使用多种编程语言(如Java、Python、C#等)编写...
GeckoDriver作为中间件,负责解析Selenium的命令并将其转发给Firefox浏览器,同时将浏览器的响应回传给Selenium。 **版本信息**:在这个例子中,我们看到的是`geckodriver-v0.19.1-win64`,这意味着这是一个针对64...
下面我们将详细解释每一步的操作以及背后的原理。 #### Selenium的作用 Selenium是一个强大的自动化测试工具,它可以模拟用户与浏览器之间的交互。在爬虫领域,Selenium经常被用来加载那些需要JavaScript执行才能...
3. `libs`:这可能是一个包含其他依赖库的目录,Selenium WebDriver可能需要这些库来正确运行,比如HTTP客户端库、JSON解析库等。 4. `client-combined-3.8.0-sources.jar`:这个文件包含了Selenium WebDriver ...