selenium(一)--selenium 家族
2015-12-16 23:17:04
QTP mercury 是商业的,单词意思是水银,而selenium 是开源的,单词意思是硒,有些相对的意思。
1、selenium ide
selenium ide 是 firxfox 的一个插件,提供了录制和回放脚本的功能,并会把所记录的Selenese (Selenium Commands)转化为HTML/Java/C#/Python/Perl/Php/Ruby等语言脚本,但是 selenium 录制的脚本不是100%符合我们的需求的,还是以手写脚本为主。
2、selenium core
Core是selenium的一个核心的东西,ide 已经集成了它。selenium core 内部由一堆javascript函数构成,加载到浏览器后,通过调用这些函数来实现对浏览器的各种操作。
3、selenium RC(remote control)
Selenium RC 的组成部分为:
Selenium Server:Selenium Server又可分为3部分,launcher,http proxy,selenium core。
Launcher启动浏览器,Selenium Core在浏览器启动时嵌入到浏览器中,并且浏览器的代理被设置为Http Proxy,用以截取和验证浏览器和测试程序之间传递的HTTP信息。
Client libraries: 负责提供编程语言与Selenium Server 之间的接口。
selenium rc 支持多语言,如 Java、JavaScript 、Ruby 、Python、 PHP、Perl and C#,此外,它还基本支持所有的浏览器。
这里要提的一个概念是同源策略,即相同的协议、端口、域名,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。其目的是确保一个站点的内容不会被另一个站点的脚本所访问。同源规则专注于确保浏览器加载的任何代码,都只能在同一站点内部进行操作。假如你在一个浏览器的一个选项卡内打开了一个网上银行的页面(www.yinhang.com),又在另选项卡上不小心打开了一个挂马的页面(www.guama.com),那么挂马的页面是不能操作网上银行页面的内容,就是因为引入了同源规则。
因为Selenium Core的JS脚本的“源”是localhost,所以浏览器会阻止Selenium Core的JS脚本在测试页面(如百度页面)上执行,如果只使用Selenium Core进行测试,需要把Selenium Core安装到远程服务器上。比如说,你要在百度页面上进行测试,就需要把selenium core安装到百度服务器上。
而Selenium RC通过http代理的方式很好的解决了同源策略并欺骗了浏览器,它修改WebSite的源信息,让浏览器会认为WebSite和Selenium Core来自同一个“源”----代理服务器!
个人理解:不仅将JS命令从本机发出伪装成从代理服务器发出,也将百度服务器响应返回时传递给浏览器的JS命令伪装成是从代理服务器传递给浏览器的。
1. 测试用例通过Http请求建立与 selenium-RC server 的连接
2. Selenium RC Server 驱动一个浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy
3. 执行用例向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作并注入 JS 代码
(一直很奇怪3这条线怎么没经过HTTP proxy??
后来看到了另一种解释,认为比较符合该图:RC是一个http代理程序,用来注入到浏览器和被测web程序之间,这样浏览器所有的请求和接收的内容都会通过RC;RC会把浏览器的请求发送给真实的web程序,而在接收到web程序的响应内容时,并没有把内容原原本本的返回给浏览器客户端,而是把包含selenium-core的内容注入到响应内容中去,然后才发送响应内容给浏览器,这样就通过欺骗的方式让浏览器认为WebSite和Selenium Core是同源的。)
4.Selenium Core执行接受到的指令并操作
5. 当浏览器收到新的请求时,发送http请求
6. Selenium Server接收到浏览器发送的Http请求后,自己重组Http请求,获取对应的Web页面
7. Selenium Server中的Http Proxy把接受到的页面返回给浏览器。
但是,正所谓成也萧何败也萧何,由于selenium 是由javascript实现的,所以只要是支持javascript的浏览器都可以很好的支持它,正是由于它的这一特点,导致了它的缺点。现在,人们对于网络安全问题越来越重视,每一个浏览器对于执行javascript都有很严格的安全限制,以防止用户被恶意脚本攻击。这也导致了selenium在某些场景下的测试工作变得很困难,比如IE下面的upload操作就不允许执行往输入框中填写文件的路径。
4、selenium grid 1.0
当你考虑
1、让脚本在不同的系统和浏览器运行,也就是测试需要考虑各种浏览器兼容性时
2、缩短测试执行时间时
可以考虑使用Selenium Grid ,Grid 是一个可以方便的让你脚本运行在不同的平台以及不同的浏览器上的一个框架。
如上图,Selenium Grid 由一个Hub节点和若干个Node节点组成。 其中Hub节点主要用于管理各个Node节点的注册及其状态,并接收Selenium Scripts脚本,然后转发给各个Node节点去执行,所以Hub本身节点是不执行脚本的,Hub是做脚本分发(根据客户端发送的请求的不同,分发到指定的浏览器或操作系统)真正执行脚本都是放于Node节点上。既然Hub 会分发脚本,那么免去了一个一个Node机器上去拷贝你脚本的麻烦啦。
注意:Grid 只是提供运行脚本的环境,无法决定脚本以什么样的形式去跑(并行的方式,或者多环境的方式)。脚本以什么样的形式跑,由脚本本身和脚本的runner (一般用junit或者TestNG)的配置所决定。参见 http://www.51testing.com/html/42/111742-119973.html
5、Webdriver & selenium 2.0
WebDriver 是Selenium 1 的升级版本, 也可以理解为两个不同的产品,相比Selenium 1 来说可以更好地绕过JS的限制,API也更易于使用。
Webdriver项目是由Simon Stewart创建的,它是一个非常便捷的自动化测试工具。Webdriver对不同浏览器的处理方式和selenium有着明显的不同,selenium是不管什么浏览器都是javascript来处理,而webdriver是选择浏览器最容易接受的语言来处理。比如,在IE中,C++最合适,在firefox中,javascript最合适等等。通过灵活选择最合适的语言来处理多浏览器,我们可以很好的回避某些浏览器对javascript的安全限制。而且webdriver不仅仅具有这些能力,它还能够调用操作系统API,尤其是当用户需要模拟鼠标和键盘进行真是的页面操作的时候,这项能力的作用尤为明显。当然,WebDriver 并不能像 Selenium 1 支持那么多的语言、浏览器。因此,我们将两者的优点集合起来,这就是selenium 2.0,即selenium 1.0+webdriver。
6、selenium grid 2.0
grid 2.0 的发布还晚于Selenium 2.0,它同样是grid 1.0 的那种结构,还基本上支持Selenium 2.0的所有功能。