自动化测试(7) | Selenium Python 入门

Selenium入门

欢迎阅读Selenium入门讲义,本讲义将会重点介绍Selenium的入门知识以及Selenium的前置知识。

自动化测试的基础

在Selenium的课程以前,我们先回顾一下软件测试的基本原理,为我们进一步完成Selenium自动化测试做好准备。

软件测试的发展

  • 传统软件测试

G.J.Myers在其经典的著作《软件测试艺术》(The Art of Software Testing)一书中,给出了测试的定义:

“程序测试是为了发现错误而执行的过程。”

这个概念产生于30年前,对软件测试的认识还非常有局限性,当然也是因为受瀑布开发模型的影响,认为软件测试是编程之后的一个阶段。只有等待代码开发出来以后,通过执行程序,像用户那样操作软件去发现问题。

  • 敏捷软件测试

当前,软件测试贯穿到整个软件开发生命周期的全过程中,不再停留在编程之后的某个阶段,尤其是敏捷开发开始广泛的应用于互联网行业以后,敏捷测试就把软件测试解释为对软件产品质量的持续评估。在敏捷方法中,持续测试被提倡。当前的持续测试的实施,主要依托于持续集成。

持续集成和持续测试的产生和发展,对自动化测试产生了比较高的要求。此外随着大数据和机器学习的发展,对自动化测试的需求越来越迫切。

简单的描述一下持续集成,Continuous Integration,简称CI。是一种软件工程实践:项目需要经常性的集成,进行代码编译,版本构建,自动化的部署以及部署后的自动化测试。也是云开发测试模式的一种。

持续集成构成了持续交付的基础。

  • 自动化测试

自动化测试:以人为驱动的测试行为转化为机器执行的一种过程

  • 主要自动化测试类型
    • Web UI自动化测试
    • Web API自动化测试
    • App UI自动化测试
    • ……

软件测试的维度

  • 从软件测试的过程看:单元测试、集成测试、确认测试、系统测试、验收测试
  • 从软件测试的方法看:白盒测试、黑盒测试、灰盒测试
  • 从软件测试的测试点看:功能测试、性能测试、兼容性测试、安全测试、探索性测试、配置测试
  • 从软件测试的技术程度看:手工测试、自动化测试、测试开发

自动化测试的场景

自动化测试应用的场景:

  • 测试 UI 界面、测试接口调用
    • 冒烟测试(预测试、确认测试)
    • 回归测试
    • 验收测试

什么样的项目适合自动化测试

  1. 任务测试明确,不会频繁变动
  2. 每日构建后的测试验证
  3. 比较频繁的回归测试
  4. 软件系统界面稳定,变动少
  5. 需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务
  6. 软件维护周期长
  7. 项目进度压力不太大
  8. 被测软件系统开发比较规范,能够保证系统的可测试性
  9. 具备大量的自动化测试平台
  10. 测试人员具备较强的编程能力

自动化测试工具介绍

  • HP UFT (QTP)
  • Selenium
  • HP LoadRunner
  • Robot Framework
  • Watir (webapplication test in ruby)
  • SoapUI
  • Appium

Web测试技术

Selenium是一款出色的Web自动测试工具,那么在使用之前,Web测试的基本技术也是必须需要了解的。

相关测试技术

基础技术 高阶技术
Python/Java语言 Ajax
Html和CSS Html5+CSS3
JavaScript语言和框架(其中jQuery是基础框架) Bootstrap
JSON和XML AngularJS

相关测试工具

工具 描述 参考
Firebug(已停止) FireFox火狐浏览器所自带的一个前端插件 下载地址:http://getfirebug.com
PyChram JetBrains公司的Python开发工具 下载地址:https://www.jetbrains.com/pycharm/
IDEA JetBrains公司的Java开发工具 下载地址:https://www.jetbrains.com/idea/
开发者工具 Chrome浏览器的开发者工具 打开Chrome浏览器,按F12,打开开发者工具
SVN/Git 源代码管理工具 开源版的源代码管理工具

什么是Selenium

Selenium

Selenium is a suite oftools to automate web browsers across many platforms.

  • runs in many browsers and operatingsystems
  • can be controlled by manyprogramming languages and testing frameworks.

硒,/sə'liniəm/

Selenium是开源的自动化测试工具,它主要是用于Web 应用程序的自动化测试,不只局限于此,同时支持所有基于web 的管理任务自动化。

Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。

Selenium经历了两个版本,Selenium1.0 和Selenium2.0,Selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。

Selenium是在2004年由一个叫Jason Huggins的聪明的年轻人开发的,当时身处ThoughtWorks的他,为了不想让自己的时间浪费在无聊的重复性工作中,所以开发一个JS的类库来驱动浏览器页面的行为;这个js类库就是selenium core,同时也是seleniumRC、Selenium IDE的核心组件。这就是Selenium1.0的产生史。

在2006年,在google的一位有胆识的年轻人Simon Stewart发起了一个叫WebDriver的项目;因为长期以来google一直是selenium的重度用户,但却总是被限制在有限的操控范围内,所以Simon希望能通过浏览器、操作系统的底层方法等一些手段来直接操作浏览器;这样就避免了在JavaScript的沙箱环境里存在的那些限制了,webdriver项目就此诞生!

在2008年,Selenium和webdriver结合了,从此永结良缘,福泽我们广大的测试工作者。这期间谁追的谁都不重要了,重要的是他们合并的原因正如webdriver的作者所说:

部分原因是 selenium 补充了 webdriver 的不足
部分原因是 webdriver 补充了 selenium 的不足
部分原因是它们合体后能给用户提供一个更好的自动化测试框架

所以管它呢,现在大家有一个比较好用的 selenium 就行了!

Selenium 1 和 WebDriver 合并成一款性能更佳的产品 Selenium 2(或 Selenium WebDriver),该款产品发行于 2011 年。Selenium 2 具有来自 WebDriver 的清晰面向对象 API,并能以最佳的方式与浏览器进行交互。Selenium 2 不使用 JavaScript 沙盒,它支持多种浏览器和多语言绑定。

介绍 Selenium

Selenium 是一组软件工具集,每一个都有不同的方法来支持测试自动化。大多数使用 Selenium 的QA工程师只关注一两个最能满足他们的项目需求的工具上。然而,学习所有的工具你将有更多选择来解决不同类型的测试自动化问题。这一整套工具具备丰富的测试功能,很好的契合了测试各种类型的网站应用的需要。这些操作非常灵活,有多种选择来定位 UI 元素,同时将预期的测试结果和实际的行为进行比较。Selenium 一个最关键的特性是支持在多浏览器平台上进行测试。

Selenium 项目简史

Selenium 诞生于 2004 年,当在 ThoughtWorks 工作的 Jason Huggins 在测试一个内部应用时。作为一个聪明的家伙,他意识到相对于每次改动都需要手工进行测试,他的时间应该用得更有价值。他开发了一个可以驱动页面进行交互的 Javascript 库,能让多浏览器自动返回测试结果。那个库最终变成了 Selenium 的核心,它是 Selenium RC(远程控制)和 Selenium IDE 所有功能的基础。Selenium RC 是开拓性的,因为没有其他产品能让你使用自己喜欢的语言来控制浏览器。

Selenium 是一个庞大的工具,所以它也有自己的缺点。由于它使用了基于 Javascript 的自动化引擎,而浏览器对 Javascript 又有很多安全限制,有些事情就难以实现。更糟糕的是,网站应用正变得越来越强大,它们使用了新浏览器提供的各种特性,都使得这些限制让人痛苦不堪。

在 2006 年,一名 Google 的工程师, Simon Stewart 开始基于这个项目进行开发,这个项目被命名为 WebDriver。此时,Google 早已是 Selenium 的重度用户,但是测试工程师们不得不绕过它的限制进行工具。Simon 需要一款能通过浏览器和操作系统的本地方法直接和浏览器进行通话的测试工具,来解决Javascript 环境沙箱的问题。WebDriver 项目的目标就是要解决 Selenium 的痛点。

跳到 2008 年。北京奥运会的召开显示了中国在全球的实力,大规模的次贷危机引发了“大萧条”以来美国最大的经济危机。但是当年最重要的故事是 Selenium 和WebDriver 的合并。Selenium 有着丰富的社区和商业支持,但 WebDriver 显然代表着未来的趋势。两者的合并为所有用户提供了一组通用功能,并且借鉴了一些测试自动化领域最闪光的思想。或许,关于两者合并的最好解释,是由 WebDriver 的开发者,在 2009 年 8 月 6 日发出的一封给社区的联合邮件中提到的:

为什么这两个项目要合并?一部分是因为 WebDriver 弥补了 Selenium 的一些短处(例如提供了一组很棒的 API,绕开浏览器的限制),一部分是因为 Selenium 弥补了 WebDriver 的一些短处(例如对浏览器更广泛的支持),还有一部分是因为 Selenium 的主要贡献者和我都认为这样能为用户提供最优秀的框架。

Selenium 工具集

Selenium 由多个软件工具组成,每个具备特定的功能。

Selenium 2 (又叫 Selenium Webdriver)

Selenium 2 代表了这个项目未来的方向,也是最新被添加到 Selenium 工具集中的。这个全新的自动化工具提供了很多了不起的特性,包括更内聚和面向对象的 API,并且解决了旧版本限制。

正如简史中提到的,Selenium 和 WebDriver 的作者都赞同两者各具优势,而两者的合并使得这个自动化工具更加强健。

Selenium 2.0正是于此的产品。它支持WebDriver API及其底层技术,同时也在WebDriver API底下通过Selenium 1技术为移植测试代码提供极大的灵活性。此外,为了向后兼容,Selenium 2 仍然使用 Selenium 1 的 Selenium RC 接口。

Selenium 1 (又叫 Selenium RC 或 Remote Control)

正如你在简史中读到的,在很长一段时间内,Selenium RC 都是最主要的 Selenium 项目,直到 WebDriver 和 Selenium 合并而产生了最新且最强大的 Selenium 2.

Seleinum 1 仍然被活跃的支持着(更多是维护),并且提供一些 Selenium 2 短时间内可能不会支持的特性,包括对多种语言的支持(Java, Javascript, Ruby, PHP, Python, Perl and C#) 和对大多数浏览器的支持。

Selenium IDE

Selenium IDE (集成开发环境) 是一个创建测试脚本的原型工具。它是一个 Firefox 插件,提供创建自动化测试的建议接口。Selenium IDE 有一个记录功能,能记录用户的操作,并且能选择多种语言把它们导出到一个可重用的脚本中用于后续执行。

注意

虽然 Selenium IDE 有保存功能,能让用户以表格的形式保存测试,以供后续的导入和执行,但它不是用于执行你的测试是否通过,也不能创建所有你需要的自动化测试。需要注意的是,Selenium IDE 不能生成含有迭代和条件语句的测试脚本。在本文档编写时也没有要实现该功能的计划。这部分是因为技术原因,部分是因为 Selenium 的开发者所推荐的自动化测试的最佳实践常常是需要编写一些代码的。Selenium IDE 只是被设计为一个快速的原型工具。Selenium 的开发者推荐选用支持的最好的语言来创建严谨、健壮的测试,不管是使用 Selenium 1 还是 Selenium 2.

Selenium-Grid

Selenium-Grid 使得 Selenium RC 解决方案能提升针对大型的测试套件或者哪些需要运行在多环境的测试套件的处理能力。Selenium Grid 能让你并行的运行你的测试,也就是说,不同的测试可以同时跑在不同的远程机器上。这样做有两个有事,首先,如果你有一个大型的测试套件,或者一个跑的很慢的测试套件,你可以使用 Selenium Grid 将你的测试套件划分成几份同时在几个不同的机器上运行,这样能显著的提升它的性能。同时,如果你必须在多环境中运行你的测试套件,你可以获得多个远程机器的支持,它们将同时运行你的测试套件。在每种情况下,Selenium Grid 都能通过并行处理显著地缩短你的测试套件的处理时间。

为什么选择 Selenium

Selenium特点:

  • 开源,免费
  • 多浏览器支持:Firefox、Chrome、IE、Opera、Safari
  • 多平台支持:Linux 、windows、Mac
  • 多语言支持:Java、Python、ruby、PHP、C#、JavaScript
  • 对web 页面有良好的支持
  • 简单(API 简单)、灵活(用开发语言驱动)
  • 支持分布式测试用例执行

Selenium的家谱

Selenium到目前为止已经经历了两个版本:Selenium 1.0Selenium2.0.

Selenium官方网站:http://docs.seleniumhq.orgSelenium github:https://github.com/SeleniumHQ/selenium

Selenium1.0:包括 Selenium IDE,Selenium Grid和Selenium RC(Selenium Remote Control)

Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
那么什么情况下用到它呢?
快速的创建bug 重现脚本,在测试人员的测试过程中,发现了bug 之后可以通过IDE 将重现的步骤录制下来,以帮助开发人员更容易的重现bug。
IDE 录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本。

Selenium IDE 下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

Selenium Grid 是一种自动化的测试辅助工具,Grid 通过利用现有的计算机基础设施,能加快WebApp的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。其特点为:

  • 并行执行

  • 通过一个主机统一控制用例在不同环境、不同浏览器下运行。

  • 灵活添加变动测试机

Selenium RC 是selenium 家族的核心工具,Selenium RC 支持多种不同的语言编写自动化测试脚本,通过selenium RC 的服务器作为代理服务器去访问应用从而达到测试的目的。
selenium RC 使用分Client Libraries 和Selenium Server。

  • Client Libraries 库主要主要用于编写测试脚本,用来控制selenium Server 的库。

  • Selenium Server 负责控制浏览器行为,总的来说,Selenium Server 主要包括3 个部分:Launcher、Http Proxy、Core。

    Selenium Core 是被Selenium Server 嵌入到浏览器页面中的。Selenium Core就是一堆JavaScript函数的集合,就是通过这些JavaScript函数,我们才可以实现用程序对浏览器进行操作。

    Launcher 用于启动浏览器,把Selenium Core 加载到浏览器页面当中,并把浏览器的代理设置为Selenium Server 的Http Proxy。

Selenium2.0:包括了WebDriver。其实在Selenium2.0中主推的就是WebDriver这个模块。事实上WebDriver是Selenium RC的替代品,因为Selenium需要保留向下兼容性的原因,Selenium RC才没有被彻底的抛弃,如果使用Selenium开发一个新的自动化测试项目,那么我们强烈推荐使用Selenium2.0的WebDriver进行编码。

Selenium2.0 = Selenium1.0 + WebDriver

Selenium RC的实质是在浏览器中运行一个JavaScript应用程序,使用每个浏览器内置的JavaScript解释器来解释和执行Selenium的命令集合。

Selenium WebDriver与上述的Selenium RC是不同的。WebDriver针对不同的浏览器进行开发,取代了RC那样嵌入到被测试的WebApp程序中的JavaScript,使用了与浏览器更加集成的方式进行测试,避免了RC使用JavaScript而可能遇到的安全模型限制导致的问题等。

在此我们也更加推荐读者使用Selenium2.0的WebDriver开始学习。

编程语言的选择

Selenium1.0代表的是经典,Selenium2.0代表的是未来。

我们在此重点关注Selenium2.0的WebDriver。而WebDriver面临的第一个选择就是编程语言。WebDriver支持众多的编程语言,例如,C#、Ruby、Python、 Java、Javacript、Objective-C、PHP。我们在使用之前必须要确定一种。

编程语言的选择,我们选了Java 和Python。主要出于以下几个原因。

Python 语言特性:便捷

  • 测试人员的编程能力普遍不是很强,而Python作为一种脚本语言,不仅功能强大,而且语法优美,支持多种自动化测试工具,而且学习上手比较容易。
  • Python的社区发展比较好,有着非常多的文档和支持库,另外Python也可以在Web开发、数据处理、科学计算等纵多领域有着非常好的应用前景。
  • 对于有一定编程基础的人员,使用Python作为自动化测试的语言可以非常顺畅的转换,几乎没有学习成本。同时Python是标准的面向对象的编程语言,对于C#、Java等面向对象的语言有着非常好的示例作用,通过Python的示例可以非常轻松的触类旁通,使用其他语言进行Selenium2.0的WebDriver的使用。

Python

/'paɪθən/

Python的创始人为Guido Van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。

Python 语言除了在自动化测试领域有出色的表现外,在系统编程,网络编程,web 开发,GUI开发,科学计算,游戏开发等多个领域应用非常广泛,而且具有非常良好的社区支持。也就是说学习和掌握python 编程,其实是为你打开了一道更广阔的大门。

Java 语言特性:健壮

  • 面向对象
    • Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
  • 平台无关
    • Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
    • 支持Mac,Windows,Linux,UNIX
  • 多线程
    • 在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
  • 安全性
    • Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。

接下来的示例我们将全部使用Java + Python进行讲解。同时也建议在学习的过程中对于Python的相关语法进一步的学习。

推荐阅读更多精彩内容