清单 5. 使用 DOM4J 解析 XML 脚本文件
Document document = null;
try {
System.out.println("测试用例 XML 文件位置 ::" + ucXMLFile);
document = new SAXReader().read(new File(ucXMLFile));
} catch (DocumentException e) {
e.printStackTrace();
}
Element suiteElm = document.getRootElement();
// settings element
Element settings = suiteElm.element("SETTINGS");
if (settings != null) {
browser = settings.attributeValue("browser");
seleniumServer = settings.attributeValue("seleniumServer");
seleniumPort = settings.attributeValue("seleniumPort");
application_url = settings.attributeValue("application_url");
}
2、读取 STEP 测试步骤信息
获取用例级别的延时设置,在每一个测试步骤执行之前,暂停 timeout 指定的秒数。通过指定延时,可以让程序执行的慢一些,符合用户真实操作,也方便演示。获取的测试步骤信息保存在列表实例 List<Element> stepNodes。
清单 6. 获取测试步骤信息
// TEST element
Element testElm = suiteElm.element("TEST");
System.out.println("测试用例名称为 ::" + testElm.attributeValue("name"));
if (testElm.attributeValue("timeout") != null) {
// 用例级别的 timeout 设置 , 覆盖了默认设置!
timeout = new Integer(testElm.attributeValue("timeout")).intValue();
System.out.println("延时设置,timeout=" + testElm.attributeValue("timeout")+"秒");
}
stepNodes = testElm.element("STEPS").elements();
}
3、创建 Selenium 实例,启动浏览器,大化浏览器窗口,打开要访问的网站
清单 7. 创建初始化 Selenium 实例
selenium = new DefaultSelenium(seleniumServer,
new Integer(seleniumPort).intValue(), browser, application_url);
System.out.println("正在启动 Selenium。。。");
selenium.start();
selenium.windowMaximize();
selenium.open(application_url);
4、迭代解析 STEP 元素执行各个测试步骤
创建一个迭代器实例 iterator,使用 while 循环,依次执行各个测试步骤。在执行的时候,打印详细的步骤信息,方便调试。根据 type 属性指定的步骤类型,分别调用不同的 Selenium 接口。作为演示,本文提供的代码例子,仅仅包括鼠标单击、输入框输入和截图功能。通过丰富处理 SETP 步骤元素的代码,可以支持更多的功能。
清单 8. 迭代依次解析测试步骤
Element elm = null;
// 循环解析测试步骤
Iterator<Element> iterator = null;
iterator = stepNodes.iterator();
while (iterator != null && iterator.hasNext()) {// while 循环开始
elm = iterator.next();
System.out.println("------------------------------>");
System.out.println("step index=" + elm.attributeValue("index"));
System.out.println("step name=" + elm.attributeValue("name"));
System.out.println("step type=" + elm.attributeValue("type"));
String type = elm.attributeValue("type");
if (type == null) {
SeleneseTestBase.fail("必须定义 type 属性,请检查 XML 测试用例。");
}
if (type.equals("Type.CLICK")) {
// 处理 Click 单击操作
pause(timeout*1000);
try {
String xpValue = elm.element("XPATH").getText();
selenium.click(xpValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()+ "
步骤执行失败,测试执行被中止 ,
测试元素为 :
" + elm.asXML());
}
} else if (type.equals("Type.INPUT")) {
// 处理 Input 在输入框执行输入操作
pause(timeout*1000);
try {
String inValue = elm.element("VALUE").getText();selenium.type(
elm.element("XPATH").getText(), inValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()
+ "
步骤执行失败,测试执行被中止 , 测试元素为 :
" + elm.asXML());
}
}
else if(type.equals("Type.CaptureScreenshot")){
pause(timeout*1000);
String fileName = elm.element("VALUE").getText();
captureScreenshot(fileName);
}
}// 循环解析测试步骤;while 循环结束
完整的框架项目代码请参考附件进行下载。对这个单元测试类的运行和前文描述的是一致的,不再赘述。当然,现在的框架支持的功能是非常简单的 (仅仅支持单击、表单输入和截图功能),框架开发人员可以添加更多的功能特性,然后可以把该自动化测试框架交付给业务测试人员,他们再不会为编写测试代码发愁了。
Selenium 框架的更多特性开发
通过上面的演示,我们了解了如何开发一套不需要掌握编码知识能编写自动化测试用例的测试框架。因为篇幅的原因,本框架支持的特性比较少,框架的功能非常简单,只支持鼠标单击操作、数据输入操作和截图功能,远远不能满足自动化测试的需求。本文的主要目的在于让读者理解这种自动化框架的理念。读者可以根据自己项目组的实际情况进行自定义开发更多的功能特性。
结束语
通过上面的介绍,我们了解到了如何向传统的功能测试用例里面添加额外的控件信息,从而形成能被自动化测试工具识别的自动化测试用例;以及如何使用 XLST 转换 XML 格式的测试用例文件成 HTML 格式,增加了用例的可读性;并通过详细的例子探讨了如何定制属于自己的基于 Selenium 二次开发的自动化测试框架。后再次总结一下该框架的让人心动之处,整理一下思路 , 规划属于您自己的自动化测试框架吧。
● 业务测试人员不需要编程知识,熟悉业务和浏览器,即可开发自动化测试脚本业务测试
● 人员不需要编程知识,熟悉业务和浏览器,即可开发自动化测试脚本
● 自动化测试用例和传统的功能测试用例看起来很像,阅读方便,利于评审
● 扩展性比较强大,可以开发出更多的功能特性。XML 测试用例脚本通用性强,可以适用不同的测试工具