使用分层的 Selenium 框架进行复杂 Web 应用的自动测试

发表于:2014-08-07来源:IBM作者:王晨点击数: 标签:selenium
在复杂 Web 应用程序的自动测试中,会产生大量冗余的测试脚本,同时,由于测试场景复杂多变,测试用例的灵活管理与调用是不可回避的需求。在本文中,作者通过将开源 Web 自动测试

  Selenium 概述

  Selenium 是一种 Web 应用的自动测试工具,通过模拟用户对 Web 页面的各种操作,可以精确重现软件测试人员编写的 Test Cases 步骤。Selenium 包含三个工具:Selenium-IDE,Selenium-RC 以及 Selenium-Core。其中,Selenium-Core 是驱动 Selenium 工作的核心部分,作为一个用 JavaScript 编写的测试引擎,它可以操作 Web 页面上的各种元素,诸如:点击按钮、输入文本框,以及断言 Web 页面上存在某些文本与 Web 元素等。

  Selenium-IDE 是一个 Firefox 插件,能够录制回放用户在 Firefox 中的行为,并把所记录的 Selenese (Selenium Commands) 转化为 Java/C#/Python/Ruby 等语言,在 Selenium-RC 中修改复用。对于较为复杂的 Test Cases,Selenium-IDE 的功能有限,往往用它录制大致的步骤,再转化为测试人员熟悉的编程语言,在此基础上完善,形成更为强大且灵活的 Selenium-RC Test Cases。

  Selenium-RC(Selenium Remote Control)在 Web 浏览器与需要测试的 Web 应用间架设代理服务器(Selenium Server),使得 JavaScript 引擎与被测 Web 应用同源,绕开同源策略的限制(Same Origin Policy),进而取得对 Web 页面进行各种操作的权限。

  回页首

  开发环境配置

  以 Java 作为测试用语言为例,在 Eclipse 中新建一个 Java 项目 Test Search Engine,下载 Selenium-RC 软件包,把 selenium server/selenium java client driver 的 Jar 以及 JUnit 库加入到该项目的 Java Build Path。

  图 1. Build Path 配置

图 1. Build Path 配置

  启动 Selenium-Server,可以在命令行中使用 java -jar命令直接运行可执行 Jar 包(对于中文 Windows 操作系统且使用 IBM JDK,还需要加参数 -Dibm.stream.nio=true)。如果想在 Java 程序中启动 / 停止 Selenium-Server,首先,新建一个 RemoteControlConfiguration 对象 rcc,并指定远程控制参数(包括配置 Selenium Server 的监听端口,Firefox 浏览器的 Profile 等),然后新建一个 SeleniumServer 对象,把 rcc 传入 SeleniumServer 的构造函数(对于中文 Windows 操作系统且使用 IBM JDK,在 Eclipse 的 Run Configurations 的 VM arguments 中加入 -Dibm.stream.nio=true)。

  清单 1. 使用 Java 启动 / 停止 Selenium Server

  RemoteControlConfiguration rcc = new RemoteControlConfiguration();

  rcc.setPort(4444); // 指定 Selenium Server 开放端口

  SeleniumServer SELENIUM_SERVER;

  SELENIUM_SERVER = new SeleniumServer(rcc);

  SELENIUM_SERVER.start(); // 启动 server

  // 测试代码

  SELENIUM_SERVER.stop(); // 停止 server

  此外,Selenium Server 还可以通过 Ant 脚本来控制启动 / 停止,这提供了另一种灵活而强大的项目控制方式。

  清单 2. 使用 Ant 脚本启动 / 停止 Selenium Server

  在 Selenium-Server 启动后,建立一个 Selenium 类的实例 selenium,并通过这个实例与 Selenium-Server 进行交互,方法如下。

  清单 3. Selenium 实例的启动 / 停止

  Selenium selenium = new DefaultSelenium(java.lang.String serverHost,

  int serverPort,

  java.lang.String browserStartCommand,

  java.lang.String browserURL);

  selenium.start();

  // 经由 selenium 控制浏览器模拟各种用户操作

  selenium.stop();

  Selenium 实例包含丰富接口,可以对各种 Web 元素进行各种操作。例如,在谷歌页面中输入“developerWorks”,点击搜索按钮,在结果页面中验证是否包含“developerWorks 中国”字样等。

  清单 4. Selenium 测试的简单示例

  Selenium selenium = new DefaultSelenium("localhost", 4444, "*firefox",

  "http://www.google.cn");

  selenium.start(); // 启动浏览器

  selenium.open("/"); // 打开 www.google

  selenium.type("q", "developerworks"); // 输入文本框

  selenium.click("btnG");// 点击搜索按钮

  selenium.waitForPageToLoad("30000"); // 等待加载结果页面

  verifyTrue(selenium.isTextPresent("developerWorks 中国")); // 验证是否存在指定字符

  selenium.stop();// 关闭浏览器

  当 Selenim 遇到 TestNG

  用 Selenium 测试 Web 页面时,所重现的各种行为依赖于测试人员的输入参数,例如:选择下拉餐单的项目,在文本框中输入字符等。不同的测试用例对应不同的输入,若有方法能够简单有效的传入测试用参数,会大大提高测试用例的复用性和可维护性。当 Selenium 遇到 TestNG,这些就可以实现。TestNG 中的 NG,意为 Next Generation,事实上,该测试框架引入了不少新特性:灵活的测试配置,支持 JDK 5 注释,支持数据驱动的测试,强大的执行模型等。

原文转自:http://www.ibm.com/developerworks/cn/java/j-lo-selenium/index.html