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 配置
启动 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
<!-- START SERVER-->
<property name="ARGS" value="-Dibm.stream.nio=true -log selenium.log -browserSideLog" />
<target name="start-server">
<echo message="Starting server..." />
<java jar="${lib}/selenium-server.jar" fork="true" spawn="true">
<arg line="-timeout 30" />
<arg line="${ARGS}" />
</java>
<echo message="Server is started." />
</target>
<!-- STOP SERVER-->
<target name="stop-server">
<!-- selenium server url-->
<get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/
driver/?cmd=shutDownSeleniumServer" dest="result.txt" ignoreerrors="true" />
<echo taskname="selenium-shutdown" message="Errors during shutdown are expected" />
</target>
在 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 注释,支持数据驱动的测试,强大的执行模型等。
继续上文谷歌搜索的场景,通过实例来了解 TestNG 的用法与功能。
清单 5. TestNG 应用示例
@Parameters( { "url", "query-string", "btn-id", "txt-id", "verify-String" })
@Test
public void testGoogle(String url, String queryString, String btnID,
String txtID, String verifyString) {
selenium = new DefaultSelenium("localhost", 4444, "*firefox", url);
selenium.start();
selenium.open("/");
selenium.type(txtID, queryString);
selenium.click(btnID);
selenium.waitForPageToLoad("30000");
verifyTrue(selenium.isTextPresent(verifyString));
selenium.stop();
}
上面的代码清单中,注释 Parameters 指定的参数在 TestNG 测试框架的配置文件 testng.xml 里有具体定义,如下所示:
清单 6. testng.xml 示例
<parameter name="url" value="http://www.google.cn"></parameter>
<parameter name="query-string" value="developerworks"></parameter>
<parameter name="btn-id" value="//input[@name='btnG']"></parameter>
<parameter name="txt-id" value="//input[@name='q']"></parameter>
<parameter name="verify-String" value="developerWorks 中国"></parameter>
不难想到,只要修改 testng.xml 中的参数值,就能由输入参数驱动不同的测试用例。然而,仅仅在 testng.xml 中指定参数有很大的局限性,显然过多的参数会难以维护,无法井井有条地组织分属不同 Test Cases 的输入。在下文中,我们来解决这个问题。
基于 Selenium 的分层测试框架
作者在工作中,测试基于 OSGi 平台的多个插件。每个插件实现特有的功能,有多条测试路径需要覆盖,同时,各个插件之间又有共通之处,可以抽取某些部分进行复用。对此,我们假设这样的场景:分别在谷歌、百度和必应中搜索各种关键字,并在返回的结果页面中验证是否存在目标字符串。每个搜索引擎都可以视为一个待测的组件,分别为它们撰写 Test Cases,并组织成一个 Test Suite,用于执行测试。事实上,3 个搜索引擎的测试由于同质性,还能够合并为一种测试,用不同的输入参数来指定所要测试的那个搜索引擎。这里视为三个组件,只是为了说明如何在 Selenium+TestNG 环境中组织多个测试模块。
自上而下地考虑,上段描述的测试场景能够进行分解。Test Suite 包含三类 Test Cases(谷歌、百度与必应),每类 Test Cases 的一个 Test Case 由若干可复用的 Test Tasks 组成,通过传入不同的参数,Test Task 完成同质的不同行为。在 Test Task 之下,定义相关文件,包含待测试的 Web 页面元素的定位信息。因此,分层 Selenium 框架有三个层次:
appObjects —— Web 页面元素定位信息,如按钮与文本框等;
tasks ——测试步骤中可复用的行为;
test cases ——由 tasks 组成的测试用例。
Web 元素 locators 定义与收集
Selenium 根据 XPath 来定位 Web 元素,XPath 的相关知识不属于本文的内容。前面例子中,在 TestNG 的配置文件 testng.xml 里定义文本框与按钮的 locators,对于复杂的测试场景而言,这不是好的实践。因此,我们在 appObjects 层建立文件,将 Web 页面元素 locators 归入,便于维护使用。Selenium-IDE 的 Find 功能适于完成这一步骤。文件 googlePages.properties 的内容如下:
清单 7. locators 文件示例
#define the keys and corresponding XPaht locators of google page.
googleSearchTxtField=//input[@name='q']
googleSearchBtn=//input[@name='btnG']
这时,在 testng.xml 中,删去 locators 相关的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 备用。在所附的源码中可以看到 .properties 文件的解析器 PropUtils 的简单实现。
测试任务分解与实现
为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所示,不难发现,由参数决定行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。
清单 8. Test Task 代码示例
public void openSite() {
selenium.open("/");
}
public void typeSearchTxtField(HashMap<String, Object> paraMap) {
utils.waitForElement((String) elemMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 30);
selenium.type((String) paraMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD),
(String) elemMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD));
}
public void clickSearchBtn() {
utils.waitForElement((String)
elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN), 30);
selenium.click((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN));
}
public void verifyResult(HashMap<String, Object> paraMap){
stc.verifyTrue(selenium.isTextPresent((String)
paraMap.get(TestGoogleConstants.VERIFY_STRING)));
}
clickSearchBtn 方法无需参数输入,因为其任务只是点击搜索按钮,在 test cases 需要时调用即可。这里只是以一个简单的例子说明如何分解任务,对于实际的 test case,这个过程会复杂许多,但其后的复用与灵活调用完全值得这些工作的付出。
Test Cases 实现与 Test Tasks 调用
Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。
清单 9. Test Case 代码示例
@Parameters( { "google_se_para_1" })
@Test
public void testGoogle_1(String paraFile) {
paraMap = (HashMap<String, Object>) XMLParser.getInstance()
.parserXml(paraFile);
tgTasks.openSite();
tgTasks.typeSearchTxtField(paraMap);
tgTasks.clickSearchBtn();
tgTasks.verifyResult(paraMap);
}
Test Cases 在分层 Selenium 测试框架下,就是按照要求调用已有的 Test Tasks。值得注意的是,在上面两个代码列表里的 paraMap 参数。这个哈希表由我们实现的解析器解析参数定义文件而得到。TestNG 的 Parameters 参数机制,使得 Test Cases 能够灵活地指定参数文件,从而驱动不同的 Test Cases。
清单 10. 参数定义文件示例
<?xml version="1.0" encoding="UTF-8"?>
<fvt_element>
<!-- Search String-->
<arg id="googleSearchTxtField">
<value>developerworks</value>
</arg>
<arg id="verify-String">
<value>developerWorks 中国 </value>
</arg>
</fvt_element>
建立输入参数解析器(parser)及参数文件
Test Cases 与 Test Tasks 的顺畅工作,需要输入参数文件及对应的参数解析器的配合。我们以上面代码清单的例子说明参数文件的格式。<fvt_element> 标签在最外层,其内的子元素为具体的参数值,如 <arg> 标签表示一个页面元素与其对应的输入。<arg> 元素的 id 属性与清单 6 中的 . properties 文件定义的 locators 对应,而其子元素 <value> 则表示该 locator 的输入值。解析器的具体实现可以参见所附的示例源代码。
导出可执行 Jar 包以部署到各类测试服务器
为了能够把 Selenium 测试脚本导出成一个可执行 Jar 包,我们可以把 testng.xml 中定义的相关内容,在 Java 代码中实现,如下所示。
清单 11. testng.xml 的 Java 表示
//suite tag
XmlSuite suite = new XmlSuite();
//set suite name
suite.setName("Test Search Engine");
//set parameter tag
HashMap para = new HashMap();
para.put("google_se_para_1", "/src/resources/google_se_para_1.xml");
suite.setParameters(para);
//test tag
XmlTest testGoogle = new XmlTest(suite);
testGoogle.setName("LDAP configuration template");
List<XmlClass> classes = new ArrayList<XmlClass>();
classes.add(new XmlClass(TestGoogleTestCase.class));
testGoogle.setXmlClasses(classes);
这份代码列表的功能与前文的 testng.xml 完全相同,把这些代码添加到新定义的类 SearchEngineSuite 的 main 函数中,在这个类的方法中启动并关闭 Selenium 服务器,并把相关文件打成一个可执行 Jar,就可以通过命令行的 java – jar 命令,执行 Selenium 测试。当然,因为具有通用性,也可以部署到各类测试服务器,执行测试。
这里推荐使用 Eclipse 的插件 Fat Jar 导出 runnalbe Jar。首先,填入输出 Jar 的命名,并把 SearchEngineSuite 设置为 Main-Class。然后,勾选”merge individual-sections of all MANIFEST.MF files”,后一项视需求勾选。
图 2. Fat Jar 导出步骤 1
进入下一步,选择要导出的文件,包含源代码以及用到的 Jar 文件,点击完成即可。
图 3. Fat Jar 导出步骤 2
导出后的 runnable Jar,使用命令 java – jar TestSearchEngine_fat.jar 运行即可。
结束语
通读本文不难发现,Selenium 提供了一种 Web 测试的新方法,在分层框架的支持下,其功能更为强大,运用灵活,有很强的复用性。通过指定不同的参数文件,本文的例子可以对 Google 进行不同关键字的测试验证,同样的方法可以应用于百度与必应。并通过 testng.xml 或者其 Java 代码形式整合为一个 Test Suite 运行。在所附源代码中可以看到详细的实现。在作者的实际工作中,复杂的测试需求也能应付自如。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bopzhou/archive/2011/01/19/6153109.aspx
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 配置
启动 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
<!-- START SERVER-->
<property name="ARGS" value="-Dibm.stream.nio=true -log selenium.log -browserSideLog" />
<target name="start-server">
<echo message="Starting server..." />
<java jar="${lib}/selenium-server.jar" fork="true" spawn="true">
<arg line="-timeout 30" />
<arg line="${ARGS}" />
</java>
<echo message="Server is started." />
</target>
<!-- STOP SERVER-->
<target name="stop-server">
<!-- selenium server url-->
<get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/
driver/?cmd=shutDownSeleniumServer" dest="result.txt" ignoreerrors="true" />
<echo taskname="selenium-shutdown" message="Errors during shutdown are expected" />
</target>
在 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 注释,支持数据驱动的测试,强大的执行模型等。
继续上文谷歌搜索的场景,通过实例来了解 TestNG 的用法与功能。
清单 5. TestNG 应用示例
@Parameters( { "url", "query-string", "btn-id", "txt-id", "verify-String" })
@Test
public void testGoogle(String url, String queryString, String btnID,
String txtID, String verifyString) {
selenium = new DefaultSelenium("localhost", 4444, "*firefox", url);
selenium.start();
selenium.open("/");
selenium.type(txtID, queryString);
selenium.click(btnID);
selenium.waitForPageToLoad("30000");
verifyTrue(selenium.isTextPresent(verifyString));
selenium.stop();
}
上面的代码清单中,注释 Parameters 指定的参数在 TestNG 测试框架的配置文件 testng.xml 里有具体定义,如下所示:
清单 6. testng.xml 示例
<parameter name="url" value="http://www.google.cn"></parameter>
<parameter name="query-string" value="developerworks"></parameter>
<parameter name="btn-id" value="//input[@name='btnG']"></parameter>
<parameter name="txt-id" value="//input[@name='q']"></parameter>
<parameter name="verify-String" value="developerWorks 中国"></parameter>
不难想到,只要修改 testng.xml 中的参数值,就能由输入参数驱动不同的测试用例。然而,仅仅在 testng.xml 中指定参数有很大的局限性,显然过多的参数会难以维护,无法井井有条地组织分属不同 Test Cases 的输入。在下文中,我们来解决这个问题。
基于 Selenium 的分层测试框架
作者在工作中,测试基于 OSGi 平台的多个插件。每个插件实现特有的功能,有多条测试路径需要覆盖,同时,各个插件之间又有共通之处,可以抽取某些部分进行复用。对此,我们假设这样的场景:分别在谷歌、百度和必应中搜索各种关键字,并在返回的结果页面中验证是否存在目标字符串。每个搜索引擎都可以视为一个待测的组件,分别为它们撰写 Test Cases,并组织成一个 Test Suite,用于执行测试。事实上,3 个搜索引擎的测试由于同质性,还能够合并为一种测试,用不同的输入参数来指定所要测试的那个搜索引擎。这里视为三个组件,只是为了说明如何在 Selenium+TestNG 环境中组织多个测试模块。
自上而下地考虑,上段描述的测试场景能够进行分解。Test Suite 包含三类 Test Cases(谷歌、百度与必应),每类 Test Cases 的一个 Test Case 由若干可复用的 Test Tasks 组成,通过传入不同的参数,Test Task 完成同质的不同行为。在 Test Task 之下,定义相关文件,包含待测试的 Web 页面元素的定位信息。因此,分层 Selenium 框架有三个层次:
appObjects —— Web 页面元素定位信息,如按钮与文本框等;
tasks ——测试步骤中可复用的行为;
test cases ——由 tasks 组成的测试用例。
Web 元素 locators 定义与收集
Selenium 根据 XPath 来定位 Web 元素,XPath 的相关知识不属于本文的内容。前面例子中,在 TestNG 的配置文件 testng.xml 里定义文本框与按钮的 locators,对于复杂的测试场景而言,这不是好的实践。因此,我们在 appObjects 层建立文件,将 Web 页面元素 locators 归入,便于维护使用。Selenium-IDE 的 Find 功能适于完成这一步骤。文件 googlePages.properties 的内容如下:
清单 7. locators 文件示例
#define the keys and corresponding XPaht locators of google page.
googleSearchTxtField=//input[@name='q']
googleSearchBtn=//input[@name='btnG']
这时,在 testng.xml 中,删去 locators 相关的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 备用。在所附的源码中可以看到 .properties 文件的解析器 PropUtils 的简单实现。
测试任务分解与实现
为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所示,不难发现,由参数决定行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。
清单 8. Test Task 代码示例
public void openSite() {
selenium.open("/");
}
public void typeSearchTxtField(HashMap<String, Object> paraMap) {
utils.waitForElement((String) elemMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 30);
selenium.type((String) paraMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD),
(String) elemMap
.get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD));
}
public void clickSearchBtn() {
utils.waitForElement((String)
elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN), 30);
selenium.click((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN));
}
public void verifyResult(HashMap<String, Object> paraMap){
stc.verifyTrue(selenium.isTextPresent((String)
paraMap.get(TestGoogleConstants.VERIFY_STRING)));
}
clickSearchBtn 方法无需参数输入,因为其任务只是点击搜索按钮,在 test cases 需要时调用即可。这里只是以一个简单的例子说明如何分解任务,对于实际的 test case,这个过程会复杂许多,但其后的复用与灵活调用完全值得这些工作的付出。
Test Cases 实现与 Test Tasks 调用
Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。
清单 9. Test Case 代码示例
@Parameters( { "google_se_para_1" })
@Test
public void testGoogle_1(String paraFile) {
paraMap = (HashMap<String, Object>) XMLParser.getInstance()
.parserXml(paraFile);
tgTasks.openSite();
tgTasks.typeSearchTxtField(paraMap);
tgTasks.clickSearchBtn();
tgTasks.verifyResult(paraMap);
}
Test Cases 在分层 Selenium 测试框架下,就是按照要求调用已有的 Test Tasks。值得注意的是,在上面两个代码列表里的 paraMap 参数。这个哈希表由我们实现的解析器解析参数定义文件而得到。TestNG 的 Parameters 参数机制,使得 Test Cases 能够灵活地指定参数文件,从而驱动不同的 Test Cases。
清单 10. 参数定义文件示例
<?xml version="1.0" encoding="UTF-8"?>
<fvt_element>
<!-- Search String-->
<arg id="googleSearchTxtField">
<value>developerworks</value>
</arg>
<arg id="verify-String">
<value>developerWorks 中国 </value>
</arg>
</fvt_element>
建立输入参数解析器(parser)及参数文件
Test Cases 与 Test Tasks 的顺畅工作,需要输入参数文件及对应的参数解析器的配合。我们以上面代码清单的例子说明参数文件的格式。<fvt_element> 标签在最外层,其内的子元素为具体的参数值,如 <arg> 标签表示一个页面元素与其对应的输入。<arg> 元素的 id 属性与清单 6 中的 . properties 文件定义的 locators 对应,而其子元素 <value> 则表示该 locator 的输入值。解析器的具体实现可以参见所附的示例源代码。
导出可执行 Jar 包以部署到各类测试服务器
为了能够把 Selenium 测试脚本导出成一个可执行 Jar 包,我们可以把 testng.xml 中定义的相关内容,在 Java 代码中实现,如下所示。
清单 11. testng.xml 的 Java 表示
//suite tag
XmlSuite suite = new XmlSuite();
//set suite name
suite.setName("Test Search Engine");
//set parameter tag
HashMap para = new HashMap();
para.put("google_se_para_1", "/src/resources/google_se_para_1.xml");
suite.setParameters(para);
//test tag
XmlTest testGoogle = new XmlTest(suite);
testGoogle.setName("LDAP configuration template");
List<XmlClass> classes = new ArrayList<XmlClass>();
classes.add(new XmlClass(TestGoogleTestCase.class));
testGoogle.setXmlClasses(classes);
这份代码列表的功能与前文的 testng.xml 完全相同,把这些代码添加到新定义的类 SearchEngineSuite 的 main 函数中,在这个类的方法中启动并关闭 Selenium 服务器,并把相关文件打成一个可执行 Jar,就可以通过命令行的 java – jar 命令,执行 Selenium 测试。当然,因为具有通用性,也可以部署到各类测试服务器,执行测试。
这里推荐使用 Eclipse 的插件 Fat Jar 导出 runnalbe Jar。首先,填入输出 Jar 的命名,并把 SearchEngineSuite 设置为 Main-Class。然后,勾选”merge individual-sections of all MANIFEST.MF files”,后一项视需求勾选。
图 2. Fat Jar 导出步骤 1
进入下一步,选择要导出的文件,包含源代码以及用到的 Jar 文件,点击完成即可。
图 3. Fat Jar 导出步骤 2
导出后的 runnable Jar,使用命令 java – jar TestSearchEngine_fat.jar 运行即可。
结束语
通读本文不难发现,Selenium 提供了一种 Web 测试的新方法,在分层框架的支持下,其功能更为强大,运用灵活,有很强的复用性。通过指定不同的参数文件,本文的例子可以对 Google 进行不同关键字的测试验证,同样的方法可以应用于百度与必应。并通过 testng.xml 或者其 Java 代码形式整合为一个 Test Suite 运行。在所附源代码中可以看到详细的实现。在作者的实际工作中,复杂的测试需求也能应付自如。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bopzhou/archive/2011/01/19/6153109.aspx
相关推荐
总的来说,Selenium是一个强大且灵活的Web自动化测试工具,它提供了丰富的API和多种语言支持,能够满足复杂Web应用的测试需求。通过合理的设计和分层,以及与其他工具的集成,可以构建出高效、可靠的自动化测试解决...
Web自动化测试框架搭建是现代软件开发过程中的重要环节,它能显著提高测试效率,减少人工错误,确保产品质量。本文将详细介绍自动化测试理念以及如何构建一个分层的自动化测试框架,并结合持续集成(CI)进行管理。 ...
首先,Selenium是一个强大的Web应用程序自动化测试工具,它允许开发者通过编写编程语言(如Java、Python、C#等)来控制浏览器,模拟用户行为,进行功能验证。Selenium支持多种浏览器,包括Chrome、Firefox、IE等,...
本书通过丰富的实例,不仅传达了一种编程思维模式,还帮助读者构建起了web自动化测试的能力。对于初学者来说,建议通篇阅读以全面了解所需的技能;而对于有一定经验的开发者,则可以根据目录挑选所需内容进行深入...
综上所述,Selenium分层框架通过清晰的分层结构和强大的TestNG支持,实现了高效的Web自动化测试。它不仅简化了测试代码的编写,还方便了测试用例的管理和维护,是现代软件测试中的重要工具。通过深入理解和实践这个...
Web 自动化测试主要针对 Web 应用程序进行,包括但不限于用户界面(UI)测试、功能测试、性能测试等。与传统的桌面应用相比,Web 应用具有跨平台性、动态更新等特点,因此其测试也面临着更多挑战。 #### 三、多层次跨...
Selenium2Library是Robot Framework中非常重要的一个库,主要用于Web自动化测试,支持通过不同的定位方法来找到Web页面的元素,并进行操作。例如,通过id、name、xpath、css选择器等方法定位Web元素,并执行诸如输入...
初级自动化测试主要负责使用工具来进行测试,中级自动化测试主要负责编写代码来进行测试,高级自动化测试主要负责设计和实现自动化测试框架。 六、自动化测试平台和框架 自动化测试平台是一个 web 系统,开发测试...
【UI自动化测试方案设计】是IT行业内针对提升测试效率和质量的一种重要手段,尤其在Web应用的测试领域中,自动化测试扮演着不可或缺的角色。本培训PPT主要涵盖了以下几个核心知识点: 1. **自动化测试概念与分层**...
- **Selenium**:支持多种编程语言,适用于 Web 应用程序的自动化测试。Selenium WebDriver 提供了强大的 API 接口,能够模拟用户的实际操作。 - **Appium**:专门针对移动应用的自动化测试工具,支持 iOS 和 ...
医药管理Web自动化测试代码1.项目结构:Python3+selenium3.0+unittest+HTMLTestRunner框架进行UI自动化测试,这里采用的分层思想、结合数据驱动,使用ddt模块实现,同时数据是放在Excel表格中,使用库openpyxl从中...
自动化测试是现代软件开发过程中不可或缺的一个环节,尤其在大型和复杂的应用程序中,自动化测试能够显著提高测试效率,降低错误率,并确保软件的质量。这堂自动化测试培训课程由刘万红主讲,旨在帮助学员深入理解...
【基于Web自动化测试培训材料】主要讲解了如何使用Robot Framework + Selenium(RFS)进行Web自动化测试,并结合分层理论和项目实战进行了深入探讨。以下是详细的解析: **自动化测试发展阶段** 1. **无框架阶段...
- **Selenium**:这是一个强大的工具包,主要用于 Web 应用程序的自动化测试。 - **webdriver-manager**:用于管理 WebDriver 驱动,确保它们与所使用的浏览器版本兼容。 - **python-dotenv**:用于加载环境变量...
医药管理Web自动化测试代码1.项目结构:Python3+selenium3.0+unittest+HTMLTestRunner框架进行UI自动化测试,这里采用的分层思想、结合数据驱动,使用ddt模块实现,同时数据是放在Excel表格中,使用库openpyxl从中...