菜鸟学自动化测试(七)----selenium RC 工作原理
2012-02-01 23:30 虫师 阅读(...) 评论(...) 编辑 收藏
关于selenium RC环境搭建(基于java语言),我在系统的学习selenium之前就已经做了,并在我的这个系列的文章中可以找到。那是照着一位前辈的视频操作完成的,我详细的记录的操作步骤。
在这里我们一起了解一下selenium RC的工作原理。
简介
那么之前学习的了selenium IDE与selenium命令,那么是不是我们用selenium IDE就可以完成我们的所有自动化测试工作了呢?No !Selenium IDE 没我们认为的那么强大,在实际的项目中会有各种复杂的操作,如条件判断、循环、读写文件、查询数据库和E—mail邮寄测试报告。这些都不是selenium IDE简单的录制就能完成的。
Selenium RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行。Selenium RC 能够充分利用编程语言来构建更复杂的自动化测试案例。
Selenium RC工作原理
那么Selenium RC组件是如何运转的,以及他们在测试案例运行过程中扮演什么角色。
说明客户端库文件将命令传递给server。接着server使用selenium-Core的javaScript命令传递给浏览器,浏览器会使用自带的javaScript翻译器来执行selenium命令。这意味着测试脚本中的selenese操作和验证将被执行。
* Selenium server
它负责启动和关闭浏览器,解释和运行从测试程序传来的selenese命令,就像HTTP代理一样,截取和验证浏览器与待测应用(AUT)之间的HTTP消息。
在测试程序打开浏览器时(使用客户端库文件的API函数),RC server绑定 selenium Core并自动将它嵌入到浏览器中。selenium Core是一个javaScript程序,实际上市一系列javaScript函数,它们使用浏览器内置的javaScript翻译器来翻译和执行selenese命令。
* 客户端文件
客户端库文件提供编程接口。允许你使用自己编写的程序来运行selenese命令,对于不同的语言都有对应的客户端库文件。类似于数据库方言包的概念,如果你想用java操作数据库,对于不同的数据库,需要导入不同的数据库驱动jar文件,mysql有mysql的方言包,DB有DB的方言包。
客户端库文件获取一条selenise命令,并将它传递给selenium Server ,以便执行一个指定操作或者基于待测应用(AUT)进行测试。客户端库文件收到命令的执行结果,在将其传给你的测试程序。程序接收到结果后,将它保存在变量中。接着报告成功还是失败,如果结果是意料之外的失败,还能有针对性地采取正确措施。
因此要创建测试程序,你只要使用客户端库文件的API来编写程序,程序会去运行一系列selenium命令,当然selenium IDE录制的内容生成selenese测试脚本,可以转换成不同测语言脚本。
Selenium RC 架构
下面我们来了解隐藏在selenium RC背后的技术实现。要了解selenium RC Server 工作的细节,需要我们理解下面几个概念。
1. 同源规则
Selenium面临的主要限制就是同源规则,市场上的每一款浏览器都应用了这一安全限制。其目的是确保一个站点的内容不会被另一个站点的脚本所访问。同源规则专注于确保浏览器加载的任何代码,都只能在同一站点内部进行操作。假如你在一个浏览器的一个选项卡内打开了一个网上银行的页面(www.yinhang.com)。又在另选项卡上不小心打开了一个挂马的页面(www.guama.com),那么挂马的页面是不能操作网上银行页面的内容,因为引入了同源规则。所以,他们不能相互作用。如果不引入同源规则,我们可以想象用户很生气,后果很严重。
要在这一规则下工作,selenium Core必须与待测系统在同一源中。在历史上,selenium Core被这一问题所限制,因为它是用javaScrpt实现的。但是selenium RC 没有被同源规则所限制,它使用selenium Server作为单利来回避这一问题,“哄骗”浏览器,让浏览器以为自己在server提供的单一站点上工作。
同源:相同的协议、端口、域名
感兴趣的同学google“同源规则”和“XSS(跨站点执行脚本)”相关技术
2. 代理注入
selenium 用来规避同源规则的第一种方法是代理注入,在代理注入模式下,selenium Server 像客户端配置的HTTP代理一样工作,它位于浏览器和待测系统之间。接着其伪造待测系统的URL(集成selenium Core 和一系列测试案例并加以传递,它们就像同源一样)
代理作为第三者,在双方间传递信息,它表现的像一个“web服务器”,想浏览器传递待测系统。作为代理selenium Server ,它拥有篡改待测系统真实URL的能力。
浏览器启动时,使用配置的profile,其中已经设置localhost:4444作为HTTP代理,这就是为什么任何来自浏览器的HTTP请求都会经过selenium Server,而且HTTP响应也来自selenium Server而非真实的服务器。
(1)客户驱动与selenium RC Server之间建立起一个链接。
(2)Selenium RC Server 启动浏览器,并在浏览器加载页面中注入了Selenium Core 的javaScript
(3)客户端驱动给Server传递一条Selenese命令
(4)客户端驱动个Server解释命令,并触发对应的javaScript在浏览器中执行。
(5)Selenium Core指示浏览器执行第一条指令,例如打开一个待测系统页面。
(6)浏览器接收到打开请求后,向Selenium RC Server(作为浏览器的HTTP代理),要求web站点内容。
(7)Selenium RC Server与web服务器通信,请求页面,并且一旦收到响应就将页面传递给浏览器,但它会篡改源,是页面看上去好像来自于与selenium Core同源的服务器。
(8)浏览器接收到web页面后,就在保留的框架\窗口中展示页面。
3. 提高浏览器权限
这一方式下的工作流与代理注入十分相似,区别在于浏览器以特殊模式-------“高特权模式”启动。它允许浏览器做一些通常不被允许的事情,如XSS。通过这个浏览器模式,Selenium Core 可以直接带卡待测系统,并读取和操作其中的内容,而不需要通过Selenium RC Server来传递整个待测系统。
(1)客户驱动与selenium RC Server之间建立起一个链接。
(2)Selenium RC Server启动浏览器,其实用的URL会在页面中加载 Selenium Core
(3)Selenium Core 从客户端启动得到第一条指令(通过Selenium RC Server)
(4)Selenium Core 执行第一条指令。
(5)浏览器接到打开请求,向web服务器请求页面,一旦浏览器接收到web页面后,就在保留的框架\窗口中展示页面。
===========================================================================
图不优雅,但也是自己花费一个多小时画的。
关于selenium RC 的工作原理。没有hyddd将的好,也没他理解的深入。但也算是自己小小的总结。
http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.html 欢迎参考hyddd的博客学习selenium