简介: Selenium 是一个用于自动化>了解 Selenium RC
Selenium RC 是来自 Selenium 项目的一个工具套件的一部分。它允许您运行您创建的自动化测试。Selenium RC 支持许多不同的操作系统,能够启动不同浏览器的实例,比如 Windows® Internet Explorer®、Mozilla Firefox 和 Opera。
使用 Selenium RC,您可以随意多次自动运行测试。这个工具还支持您创建比单独使用 Selenium IDE 创建的测试更复杂的测试。您可以添加条件语句和迭代以进行测试,如果您想使用一个数据集运行测试,这个功能就会有所帮助。您还可以使用 JUnit 这样的单元测试框架中可用的构件来处理预期的异常。
下载和安装 Selenium RC
要开始使用 Selenium RC,首先必须下载并安装它。Selenium 服务器只是一个 JAR 文件,可以使用 Java™Runtime Environment (JRE) 运行。您可以从 SeleniumHQ 站点(参见参考资料 中的链接)下载这个 JAR 文件和其他支持文件。
下载完成后,解压缩包含 Selenium RC 的存档文件,将其保存到一个位置,您需要记住这个位置,以便稍后使用。可以通过运行以下命令来执行 Selenium 服务器:
java -jar selenium-server.jar
回页首
要测试的样例应用程序
本文使用一个简单的动态 web 应用程序,借助一些 JSP 页面来展示 Selenium RC 如何工作,以及如何用于自动化测试。这个简单的 web 应用程序拥有两个页面:一个登录页面和一个输入页面;后者用于输入您的姓名和生日等信息,应用程序从该页面计算您的年龄并说 “Hello”。
这个样例应用程序提供了一个机会来展示如何执行一些测试来处理不同的情况。第一个页面如清单 1 所示。这是一个简单的登录页面,允许您登录到这个 web 应用程序。为了简化这个示例,登录信息将与一些硬编码的字符串进行比较。
清单 1. index.jsp 页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if ("process".equals(request.getParameter("action")))
{
if ("user".equals(request.getParameter("username")) &&
"secret".equals(request.getParameter("password")))
{
response.sendRedirect("enterInfo.jsp");
return;
}
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Login Page</title>
</head>
<body>
<form action="<%= request.getRequestURI() %>" method="POST">
<input type="hidden" value="process" name="action" />
<label for="username">Username:<br />
<input type="text" id="username" name="username" />
</label>
<br />
<label for="password">Password:<br />
<input type="password" id="password" name="password" />
</label>
<br />
<input type="submit" value="Login" />
</form>
</body>
</html>
第二个页面如清单 2 所示。当您输入您的名和生日时,该页面将说 “Hello” 并告知您今天您的年龄。这个示例有一点勉强,因为在大多数>
清单 2. enterInfo.jsp 页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.text.ParseException"%>
<%!
private Date parseDate(String dateValue)
{
Date returnDate = null;
try
{
// this is not the most efficient of methods, and try...catch
// statements ideally should not be used as business exception
// processing...
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
returnDate = dateFormat.parse(dateValue);
} catch (ParseException pe)
{
// do nothing...
}
return returnDate;
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%= request.getRequestURI() %>" method="POST">
<input type="hidden" value="process" name="action" />
<label for="name">Your name:<br />
<input type="text" id="name" name="name" />
</label>
<br />
<label for="birthdate">Your birth date (in MM/DD/YYYY format):<br />
<input type="text" id="birthdate" name="birthdate" />
</label>
<br />
<%
if ("process".equals(request.getParameter("action")))
{
// verify the date
Date birthDate = parseDate(request.getParameter("birthdate"));
if (birthDate == null)
{
// display the error messages...
out.write("<p class=\"error\">Please enter a valid date.</p>");
} else {
// display the nice messages...
}
}
%>
<input type="submit" value="Submit" />
</form>
</body>
</html>
编写第一个测试
要快速编写一些测试以用作您的自动化测试的基础,可以从 Selenium IDE 入手。Selenium IDE 是一个允许录制测试的 Firefox 插件。然后,您可以导出这些已录制的测试,以便给它们添加一些 “装饰” — 条件、迭代等。
要开始使用 Selenium IDE,首先需要从 参考资料 中的链接下载它。通过单击该链接将其安装为一个 Firefox 插件。Firefox 将提示您安装这个插件,然后重新启动浏览器,以便更改生效。
安装这个插件后,启动您的服务器,以便开始使用您的>图 1. 单击 Run All
要查看 Selenium IDE 是否真的在测试您的应用程序,转到您的 IDE 并更改有效的用户名的值。重新部署您的应用程序,然后再次单击 Run All。这次,您的测试将失败,因为>将您的测试导出到 JUnit
现在您已经录制了您的第一个测试,现在可以导出它以便在 JUnit 中使用。在 Selenium IDE 中突出显示您的测试,单击 File > Export Test Case As > Java (JUnit) - Selenium RC。键入您的测试的名称(例如,IndexTests.java),将它保存到一个位置,记住该位置,以便稍后将其导入 Eclipse。
执行以下步骤:
- 创建一个新的 Java 项目,该项目包含一些使用 JUnit 构建的 Java 单元测试。
- 下载 Selenium RC 二进制文件(参见 参考资料 中的链接)。保存这个存档文件,以便稍后将其中的文件在 Eclipse 中导入您的新 Java 项目。
- 在您的 Java 项目中创建一个名为 lib 的新文件夹。
- 单击 File > Import,然后单击列表中的 File System。 单击 Next。
- 浏览到您刚才解压 Selenium RC 文件的位置,选择>在 Eclipse 中解决错误
要解决包错误,单击该错误,然后按下 Ctrl-1 打开提示。选择 Move MyTest.java>添加 JUnit 测试
现在我们来添加 Selenium 和 JUnit 测试,在 Package Explorer 单击 Java 项目,然后在 Libraries 选项卡上单击Build Path > Configure Build Path,单击Add JARs,选择>清单 3. 基于从 Selenium IDE 导出的代码的 JUnit 测试
package com.example.mywebapp.tests; import com.thoughtworks.selenium.*; import java.util.regex.Pattern; import org.junit.BeforeClass; import org.junit.Test; public class MyTest extends SeleneseTestCase { @BeforeClass public void setUp() throws Exception { setUp("http://localhost:8080/tested-webapp/index.jsp", "*chrome"); } @Test public void testMy() throws Exception { selenium.open("/tested-webapp/index.jsp"); selenium.type("username", "user"); selenium.type("password", "secret"); selenium.click("//input[@value='Login']"); selenium.waitForPageToLoad("30000"); verifyTrue(selenium.isTextPresent("Your name:")); verifyTrue(selenium.isTextPresent("Your birth date (in MM/DD/YYYY format):")); } }
-
如果有一些限制阻止您使用 Firefox,无法下载和安装 Selenium IDE,您仍然可以编写使用 Selenium RC 运行的测试。尽管使用这里展示的示例作为一个开端并使用参考资料 中提供的 Selenium 文档。
回页首
查看测试结果
您已经编写了第一个示例测试,现在可以通过启动 Selenium 服务器并将该测试作为一个标准 JUnit 单元测试运行,查看测试的实际运行情况。通过运行以下命令启动 Selenium 服务器:
java -jar selenium-server.jar
从 IDE 运行服务器
要获取一个完全集成的体验,您可以在 Eclipse 中设置一个外部工具配置并从 Eclipse 直接启动 Selenium 服务器。单击 Run > External Tools > External Tool Configurations 设置这个配置。只需在一个新工具配置中输入启动服务器的命令。
Selenium 服务器启动后,右键单击 IndexTest.java 文件,然后单击 Run As > JUnit Test,运行这个单元测试。Selenium 服务器启动您的浏览器的一个实例并运行这个测试可能需要一些时间。测试完成后,Eclipse 中显示的输出应与常规单元测试相同。
回页首
深入挖掘
您已经使用 Selenium IDE 创建了一个简单测试并将其导出为一个 Java 文件,现在我们创建一个更复杂的测试来验证>清单 4. 测试 enterInfo.jsp 的 JUniti 测试
package com.example.mywebapp.tests; import org.junit.BeforeClass; import org.junit.Test; import com.thoughtworks.selenium.SeleneseTestCase; public class EnterInfoTests extends SeleneseTestCase { @BeforeClass public void setUp() throws Exception { setUp("http://localhost:8080/tested-webapp/index.jsp", "*firefox"); } @Test public void testBadDate() { doLogin(); selenium.type("name", "User"); selenium.type("birthdate", "@#$#@"); selenium.click("//input[@value='Submit']"); selenium.waitForPageToLoad("30000"); verifyTrue(selenium.isTextPresent("Please enter a valid date")); } @Test public void testValidDate() { doLogin(); selenium.type("name", "User"); selenium.type("birthdate", "12/2/1999"); selenium.click("//input[@value='Submit']"); selenium.waitForPageToLoad("30000"); verifyFalse(selenium.isTextPresent("Please enter a valid date")); } private void doLogin() { selenium.open("/tested-webapp/index.jsp"); selenium.type("username", "user"); selenium.type("password", "secret"); selenium.click("//input[@value='Login']"); selenium.waitForPageToLoad("30000"); } }
-
这个示例测试使用 清单 3 中显示的
LoginTest
类作为一个出发点。doLogin()
函数拥有使您登录到一个应用程序的代码,这个应用程序用于在测试开始时将您带到适当的点。testBadDate()
方法的作用是在表单上的 birthdate 域中输入错误的值,然后提交该值。测试证明,如果日期不正确,将显示适当的错误消息。testValidDate()
方法测试表单上的有效日期,确保提供用户年龄的消息是正确的。使用 JUnit 中可用的 Java 技术的威力,您可以循环一些示例,向您的测试添加一些条件,并预见异常。参见 参考资料 中的链接了解关于 JUnit 和单元测试的更多信息。
回页首
自动化测试
借助一个 Apache Ant 脚本和几个目标的帮助,您已经在 Eclipse IDE 中运行了一些测试,您还可以完全自动化这些测试。拥有这个 Ant 脚本后,您可以使用 Hudson 或 CruiseControl(参见参考资料)等工具来持续运行这些测试。
要自动化测试,可以使用一个采用 JUnit 目标的 Ant 脚本来执行一些 Selenium RC 测试。这个脚本如清单 5 所示。
清单 5. 运行 Selenium 测试的 Ant 脚本<project name="tested-webapp-tests" default="run-tests" basedir="."> <property name="selenium.server.jar" value="path/to/selenium-server.jar" /> <property name="src" value="${basedir}/src" /> <property name="build" value="${basedir}/bin" /> <property name="lib" value="${basedir}/lib" /> <path id="classpath"> <fileset dir="${lib}" includes="**/*.jar" /> </path> <target name="start-selenium-server"> <java jar="${selenium.server.jar}" fork="true" spawn="true"> <arg line="-timeout 30" /> </java> </target> <target name="compile-tests"> <javac srcdir="${src}" destdir="${build}" fork="true" /> </target> <target name="run-tests" depends="compile-tests"> <junit printsummary="yes"> <classpath> <path refid="classpath" /> </classpath> <batchtest fork="yes"> <fileset dir="${src}"> <include name="**/*Tests.java" /> </fileset> </batchtest> </junit> <echo message="Finished running tests." /> </target> <target name="stop-selenium-server"> <get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/driver/?cmd=shutDown" dest="result.txt" ignoreerrors="true" /> </target> <target name="run-all"> <parallel> <antcall target="start-selenium-server"> </antcall> <sequential> <echo taskname="waitfor" message="Wait for proxy server launch" /> <waitfor maxwait="1" maxwaitunit="minute" checkevery="100"> <http url="http://localhost:4444/selenium-server/ driver/?cmd=testComplete" /> </waitfor> <antcall target="run-tests"> </antcall> <antcall target="stop-selenium-server"> </antcall> </sequential> </parallel> </target> </project>
这个 Ant 脚本有 3 个目标。第一个目标
start-selenium-server
以分叉(forked)和派生(spawned)模式运行 Selenium 服务器,以便它在后台运行。run-tests
目标实际执行 JUnit 测试,stop-selenium-server
目标通过调用一个向服务器发送一条 shutdown 命令的 URL 来停止服务器。使用这样一个 Ant 脚本,可以以一种自动化方式运行一些 Selenium 测试,方法是计划这些测试,或者在一个持续集成工具中使用这个 Ant 脚本。参见 参考资料 中的链接了解关于持续集成构建的更多信息。
回页首
在其他浏览器中运行测试
目前为止,这些测试被编写为在 Firefox 中运行。但是,有时候需要在其他浏览器中测试这个 web 应用程序,以确保它能跨浏览器正常工作。
您可能已经注意到,当 Selenium 测试在 JUnit 测试的
setUp()
方法中得到设置时,*chrome
作为父节点的setUp()
方法的第二个参数传递。这个参数启动一个 Firefox 浏览器实例。要运行针对一个不同浏览器的测试,只需将浏览器的名称作为第二个参数提供。例如,
*iexplore
使用 Internet Explorer 代替 Firefox。对 Opera 浏览器使用*opera
,或对 Apple Safari 使用*safari
。注意,这些浏览器必须受到运行测试的操作系统的支持。因此,如果您企图对您的操作系统上不存在的浏览器(比如运行 Linux® 的系统上的
*safari
或*iexplore
)执行测试,您将得到一些异常,测试也会失败。回页首
结束语
本文介绍了 Selenium 及其两个组件:Selenium IDE 和 Selenium RC。Selenium IDE 是开始为您的>参考资料
学习
- SeleniumHQ:访问 SeleniumHQ 站点。
- Selenium 文档:参阅更多 Selenium RC 和 Selenium IDE 文档,找到您的问题的答案。
- JUnit:进一步了解 JUnit 和单元测试。
- “让开发自动化:持续集成反模式”(developerWorks,2007 年 12 月):进一步了解持续集成的反模式。
- developerWorks Web development 专区:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。
- developerWorks Ajax 资源中心:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
- developerWorks Web 2.0 资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过Web 2.0 新手入门 栏目,迅速了解 Web 2.0 的相关概念。
- developerWorks 演示中心:观看演示,从为初学者准备的产品安装,到为经验丰富的开发人员准备的高级功能。
获得产品和技术
- Hudson:下载并安装 Hudson 持续集成服务器。
- CruiseControl:下载 CruiseControl 持续集成服务器。
- 下载 Selenium:下载 Selenium RC 和 Selenium IDE。
- 下载 IBM 产品评估版 或 在线试用 IBM SOA Sandbox,并开始使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
- 现在就创建您的 developerWorks 中文社区概要信息 并设置一个关于测试的 关注清单。连接到 developerWorks 中文社区并保持连接。
- 找到 对 web 开发感兴趣的其他 developerWorks 成员。
- Web 开发人员,请在 web 开发群组中分享您的经验和知识。
- 分享您的知识:加入一个关注 web 主题的 developerWorks 群组。
- Roland Barcia 撰写的关于 Web 2.0 和中间件 的博客。
- 关注>关于 web 主题的共享书签。
- 快速找到答案:访问 Web 2.0 Apps 论坛。
- SeleniumHQ:访问 SeleniumHQ 站点。