Selenium是throughtworks公司开发的一套强大的开源web应用自动化测试的工具集。Selenium本身为web应用程序测试提供使用的测试函数,这些函数能使测试工作简单高效,并且能够定位UI元素、对比期望测试结果与实际执行结果。它包括4种类型
Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制和回放功能。IDE录制的脚本可以转化为多种语言,有助于快速开发脚本。
Selenium core是selenium的核心内容,是IDE和RC的引擎。IDE是作为firefox插件为用户提供一个简单应用的开发和运行个人测试用例的集成环境,具有录制和回放脚本的功能,这样可以通过IDE的使用模拟用户操作。RC允许测试人员通过程序语言(为高级语言PHP、Python、Ruby、HTML提供API)来测试用例,把自动化脚本集成到高级语言的项目环境中运行。其字面意思就是远程控制,即通过脚本操作浏览器。
Jason Huggins和他的团队开发了一个基于浏览器并且使用JavaScript编程语言的测试工具,并于2004年基于apache2.0开源协议对外发布,并命名为selenium core(实际上就是一系列JavaScript函数,它们使用浏览器内置的JavaScript翻译器来翻译和执行)。
Selenium core 由于不能绕过浏览器的同源规则,因此,core与测试脚本和待测试产品需要部署再同一台服务器上完成自动化测试工作。这与实际工作需求相矛盾,为此,Jason团队又研发了通过HTTP代理 ,让selenium获取所有的HTTP请求,这样不仅可以绕过同源规则,让测试产品、core和测试脚本分布再不同的机器上,而且使得测试脚本只需关心标准的HTTP请求发送到指定的URL上即可,而selenium本身不需要关心这些HTTP请求是由什么程序语言编写的。正是这些原因,selenium RC(selenium remote control)诞生了。
Selenium-RC(常被成为selenium 1.0)可以充分利用编程语言来构建更复杂的自动化测试场景。而不仅仅是简单的浏览器操作和线性执行。它可以支持条件判断、循环、报告测试结果、重复执行失败案例和测试失败时捕捉屏幕快照。这些任务不被selenium本身直接支持,但通过编程语言和特定语言的selenium-RC客户端库文件都可以实现。
Selenium-RC组件包括:
Selenium server,负责启动和关闭浏览器,解释和运行从测试程序传过来的selenese命令(selenese是selenium命令的集合),就像HTTP代理一样,截获和验证浏览器与待测应用之间的HTTP消息
客户端文件提供编程语言和server之间的接口,它对于每一种支持的语言都有对应客户端库文件。
Server从测试程序中接收selenium命令集合,翻译它们,向测试程序反馈运行这些测试案例的结果。测试程序打开浏览器的时候(调用客户端库文件API函数),server绑定selenium core (一个JavaScript程序,实际上是一系列函数)并自动将它嵌入到浏览器中,它们使用浏览器内置的JavaScript翻译器来翻译和执行selenium命令(这意味着测试脚本中的selenium操作和验证将被执行)。Server获取selenium命令是通过HTTP GET或POST方法请求得到,这也意味着可以使用任何支持HTTP请求的编程语言来自动化基于浏览器的测试案例。
客户端库文件提供编程接口,允许使用自己编写的程序来运行selenium命令。对于任何一种接口而言,都有对应的函数支持每一条selenium命令。客户端库文件获取一条selenium命令,并将它传递给server,以便执行一个指定操作或基于待测应用进行测试,客户端库文件收到命令的执行结果,再将其传给你的测试程序。程序收到结果后,将其保存到变量中,接着报告是否失败。
总之,必须使用客户端库文件的API来编写程序,程序会去运行一系列selenium命令。其典型使用方式如下:
• 测试人员基于客户端驱动所提供的API来编写测试用例脚本
• 测试程序打开浏览器,此时sever绑定core并自动将它潜入到浏览器中,
• 客户端驱动持续执行测试用例脚本并发送特定的命令到server
• Server解释这些命令,并触发core执行对应的JavaScript代码来完成相应操作
• 浏览器上所有的请求和响应都通过RC的HTTP代理与实际的web应用服务器进行交互,并且RC一旦收到响应就将响应传递给浏览器,但它会篡改源,使得页面上看上去好像来自与于selenium core同源的服务器
• 浏览我去接收到web页面后,便在框架或窗口中展示页面
Selenium RC采用了基于字典方式的API,核心selenium core基本是JavaScript应用,主要运行在浏览器的安全沙箱中。
由于selenium RC需要selenium server才能运行测试用例(由JavaScript来驱动浏览器运行测试用例),且只能支持web应用的测试。一款更强大的测试工具呼之欲出,即selenium2.0(webdriver),它不需要server就可以运行测试用例,既可以测试传统web应用,也可以测试ios和android的app应用。
2011年7月发布的selenium2.0 ,又名selenium webdriver则是原生就绑定到浏览器并绕开了浏览器的安全模型(取代了嵌入到被测web应用中的JavaScript,与浏览器紧密集成,因此支持创建更高级的测试,避免了JavaScript安全模型导致的限制),利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),但其代价就是框架本身的开发需要依据每个浏览器的不同单独开发。
Thebiggest change in Selenium recently has been the inclusion of the WebDriverAPI. Driving a browser natively as a user would either locally or ona remote machine using the Selenium Server it marks a leap forward in terms ofbrowser automation.
SeleniumWebDriver fits in the same role as RC did, and has incorporated the original1.x bindings. It refers to both the language bindings and the implementationsof the individual browser controlling code. This is commonly referred to asjust "WebDriver" or sometimes as Selenium 2.
Selenium 1.0 + WebDriver = Selenium 2.0
WebDriveris designed in a simpler and more concise programming interface along withaddressing some limitations in the Selenium-RC API.
WebDriveris a compact Object Oriented API when compared to Selenium1.0.It drives thebrowser much more effectively and overcomes the limitations of Selenium 1.xwhich affected our functional test coverage, like the file upload or download,pop-ups and dialogs barrier
为什么webdriver和Selenium会合并?Webdriver的创建者Simon Stewart说部分原因时webdriver可以弥补selenium的缺点,而selenium也可以弥补webdriver的缺点。
Webdriver不依赖于集成在浏览器中的JavaScript core。它的目标是提供API,以便:
• 为web &app 测试建立一个精心设计的标准编程接口
• 增进不同浏览器之间的兼容性
• 提供其他功能解决selenium1.0不能很好支持的测试问题