006-Selenium简介

1.产生背景

      Selenium工具诞生的时间已经超过了10年,目前已经在软件开发公司中得到大规模的应用。2004年,在ThoughtWorks公司,一个名为Jason Huggins的测试同行为了减少手工测试的工作量,自己实现了一套基于JavaScript语言的代码库,使用这套库可以进行页面的交互操作,并且可以重复地在不同浏览器上进行各种测试操作。通过不断地改进和优化,这个代码库逐步发展成Selenium Core。Selenium Core为Selenium Remote Control(RC)和Selenium IDE提供了坚实的核心基础能力。

      当时的自动化测试工具比较稀少,现有的工具也不够灵活地支持各种复杂的测试操作,大部分测试人员只能使用手工的方式完成Web产品的测试工作。开发人员不断地开发代码,测试人员不断地发现bug,开发人员不断地修改bug,测试人员不断地回归测试来确认bug是否被修正,并且确认程序没有引入新的bug。这样的产品开发模式,导致测试人员必须经常性地手工回归测试系统的大部分功能,由此产生了大量的重复性手工操作。Jason Huggins想改变这样的现状,所以他开发了基于JavaScript语言的代码库,希望帮助测试人员从日常的重复性工作中解脱出来。经过不懈地努力,Selenium 1版本诞生了。

      Web自动化测试工具Selenium是划时代的,因为它允许测试工程师使用多种开发语言来控制不同类型的浏览器,从而实现不同的测试目标。Selenium是开源工具软件,用户无须付费就可以使用它,甚至可以根据自己的使用需求来进行深入的定制化,改写其原有的一些功能。基于以上说明的优点,越来越多的测试人员开始使用此工具来进行Web系统的自动化测试工作。在短短几年时间内,全世界范围内都出现了Selenium工具的忠实拥护者,目前中国的几大互联网公司均使用Selenium作为Web自动化测试实施的主要工具。

      但是随着互联网技术的不断发展及浏览器对于JavaScript语言的安全限制,Selenium的发展也遇到了瓶颈。由于其自身实现的机制,Selenium无法突破浏览器沙盒的限制,导致很多测试场景的测试需求难以被实现。

       2006年,Google的工程师Simon Stewart开启了一个叫作WebDriver的项目,此项目可以直接让测试工具调用浏览器和操作系统本身提供的内置方法,以此来绕过JavaScript环境的沙盒限制,WebDriver项目的目标就是为了解决Selenium的痛处。2008年,Selenium和WebDriver这两个项目进行了合并,Selenium 2出现了,也就是我们现在常常看到的Selenium WebDriver(简称WebDriver)。

      Selenium 2=Selenium 1 +WebDriver。

      Selenium的官网地址是www.seleniumhq.org,网站提供了Selenium WebDriver的安装文件和使用教程。Selenium 2是Selenium 1的升级版本,它本身向下兼容Selenium 1的所有功能,同时又提供了更多的新API来完成自动化测试的各种复杂需求。现阶段,Selenium 1已经退出了历史舞台,大部分Web自动化测试人员已经完全转向使用Selenium 2(WebDriver)来搭建自己的自动化测试框架。本课程将基于Selenium 2的WebDriver API进行讲解。

2.概述

      Selenium是用于Web应用程序的自动化测试工具。基于Selenium的测试用例会直接运行在浏览器中,就像真正的用户在操作一样。其支持的浏览器范围非常广泛,包括各个平台的主流浏览器。Selenium的主要功能包括:

      1)功能性测试:创建回归测试验证软件功能和用户需求。

      2)兼容性测试:测试应用程序在不同的操作系统和不同的浏览器中是否运行正常。

      值得注意的Selenium并不适用于进行网站后台性能方面的测试。但是结合其他第三方工具,Selenium可被用于对网站前端性能进行适当的评估

      Selenium源于ThoughtWorks公司,已经在全球范围内遍地开花。Selenium能在测试领域成为一棵常青树,与其开源性和开放性密不可分。

      WebDriver支持的浏览器版本:

  • Google Chrome
  • IE6、7、8、9、10、11
  • Mac操作系统的Safari默认版本均支持
  • Firefox的大部分版本
  • Opera
  • HtmlUnit
  • Android手机操作系统的默认浏览器
  • IOS手机操作系统的默认浏览器

3.版本

(1)Selenium Core

      是使用HTML的方式来编写测试脚本。

(2)Selenium IDE(集成开发环境)

     录制和回放脚本,可以模拟用户对页面的真实操作,区别于其他工具:是通过拦截http请求。

  • 一般只把录制脚本当作一个辅助功能,因为一个UI节点的细微变化,都可能导致自动化测试工具无法识别,当测试项目项目大时,定位、更新十分困难。
  • 其次,录制的脚本有时候人工难以理解。

(3)Selenium 1(Selenium RC)

     早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

(4)Selenium Grid

     实现在多台机器上、和异构环境中并行执行测试用例,也就是说在多个测试环境以并发的方式执行测试脚本,实现测试脚本的并发执行,缩短大量测试脚本的执行时间。

(5)Selenium2

      当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS WebDriver)

      WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如GeckoDriver初始化成功之后,默认会从http://localhost:7055开始,而ChromeDriver则大概是http://localhost:46350之类的。接下来,我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情。

      在我们new一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。

  • 主要新特性就是将WebDriver API集成进Selenium RC,从而解决Selenium 1所面临的一系列局限性问题。
  • Selenium 2不与任何的测试框架绑定,这样便于与其他测试工具进行集成,如JUnit或TestNG等。
  • WebDriver的实现和具体的浏览器相关,包括HtmlUnit Driver、Firefox Driver、Chrome Driver、Internet Explorer Driver等。
  • Selenium 2相较于Selenium 1还有一个重要变化,用户可以通过WebDriver来测试手机应用,无论在模拟器上还是真实设备上。

(6)Selenium3

  • 会移除原有的Selenium Core的实现部分,并且Selenium RC的API也将被去掉。

4.Selenium2的原理

      selenium1是thoughtworks公司的一个产品经理为了解决重复烦躁的验收工作,写的一个自动化测试工具,其是用JS注入的方式来模拟人工的操作,但是由于JS的同源策略,也就是JS只能在一个域中的页面进行通讯,如果跨域,则就不能访问了,所以导致了如果页面中有iframe时,就无法操作了。

      selenium2是selenium+webdriver的产物,webdriver是google的产品,google收购selenium1后,整合了其自己的webdriver,推出了selenium webdriver,也就是我们所说的selenium 2。selenium2很好地解决了这个JS注入的安全性问题,其实现原理就从根本上改变,selenium2在启动webdriver的过程中,会首先确认比较浏览器与driver是否匹配,如果匹配,就会启动浏览器,然后把浏览器绑定在某一个端口,且在浏览器中启动一整套web service,这套web service使用了selenium2自己定义的协议,这套协议在主流浏览器中是通用的,然后浏览器此时就作为了一个server,测试脚本就作为了一个client,client发送的任何一个selenium2的API都被转成了一个http request,当web service接收到这个request后,就会响应,这套协议就会告诉浏览器这时候需要干什么事。

posted @ 2015-04-27 11:14  RunningYY  阅读(488)  评论(0编辑  收藏  举报