 | 级别: 初级 Prakash Dewan, 系统软件工程师, IBM
2009 年 10 月 22 日 本文向您展示了如何使用 IBM Rational Functional Tester 来自动化 HTML 表格单元内嵌的对象,同时保持对特定的单元格的引用。这一方式可以帮助您实现对这些对象的自动化操作。
HTML表格结构和包含的对象
所谓的 HTML 表就是多个<TR>(表格行)标签的集合。每一个 <TR> 标签都包含了多种 <TD>(表格定义)标签,每一个标签都与一个单元相对应。所有这些 <TR> 和 <TD> 标签,放在一起可以放在 <TBODY>(表格主体)标签之下。图 1 显示了这种结构。
图 1. HTML 表格标签结构
HTML 是网络程序的有机组成部分,它们在结构上从简单到复杂,它们可以含有单元中的对象,例如文本区域、复选框、单选按钮、控制按钮、图形、选择列单等等,如图 2 所示。
图 2. HTML 表格单元内包含的对象
如果您检查图 2 所示的网页的源代码,您就会发现每一个对象都包含在开始符 <TD> 和结束符 </TD> 标签之内(换句话说,都包含在表格单元之内)。
识别含有的对象
默认条件下,IBM® Rational® Functional Tester Test Object Inspector 特性会识别表格单元内的文本区域,如图 3 所示。文本区域不会引用包含它的表格单元,并且会作为 HTML 表格的直接子代而显示。
图 3. 默认的父级层级结构
默认条件下,您不能看到 Html.TBODY ,Html.TR, 以及 Html.TD 类的对象,因为它们并不是 RFT 可映射的对象。您可以通过选择 Options 并清除对 Hide not mappable 的选择,以在对象层级结构中查看它们(见于图 4)。
图 4. 清除“Hide not mappable”选项的选择
在您清除选项的选择之后,Test Object Inspector 将会识别 HTML 表格内的文本区域为 TD 类对象的子代,而不是直接识别 HTML 表格(图 5)。
图 5. 包含的元素作为 TD 元素中的子代
在 Rational Functional Tester 中,操作与行和列(就是表格单元)相关的表格单元中的对象,并不如操作对象而不引用单元来的直接。
对引用表格单元对象的操作
对于 HTML 表格单元中的对象,您可以执行一些操作。在自动化期间,您可以时常找到机会自动化对对象的操作,这些对象包含在引用行和列的 HTML 表格单元中。
这样的操作如下所示:
- 设置文本区域的
Row 值为 3,Column 值为 4,或者 HTML 表格的单元(3,4)
- 从列表框中设置选项
Row 为 5,Column 为 2,或者单元(5,2)
- 点击指定表格单元内的单选按钮
- 在指定的表格单元内设置复选框的状态(例如,选中或者未选中)
- 在指定的表格单元内点击一个按钮或者图像
除了执行对象上的操作,您还可以应用相同的操作,以提取或者生成对象属性的输出。您也可以对对象状态和属性进行验证。
三步的操作
使用 Rational Functional Tester 自动对 HTML 表格单元内对象的操作,需要分三步:
- 基于行和列的标记,通过使用
find()方法,来找到并设置 HTML 表格单元的对象。
- 使用单元对象,找到需要执行操作的对象(例如,文本框,按钮等等)。
- 对对象执行需要的操作(例如,点击、选择、导出属性等等)。
以下内容向您展示了三步操作步骤。该例为表格单元内文本框设置了值。
第 1 步 找到一个 HTML 表格单元的对象
假设 tableObj 就是 TestObject 类的 HTML 表格对象,使用如列表 1 所示的代码。
列表 1. 找到一个 HTML 表格单元
TestObject cellObj = tableObj.find(atList(
atChild(".class" , "Html.TBODY"),
atChild(".class" , "Html.TR",".rowIndex", rowIndex),
atChild(".class" , "Html.TD",".cellIndex",colIndex)
), false)[0];
|
该代码集成使用了 find()方法,atList()方法,以及 atChild() 方法,来得到行和列指示指定的 HTML 表格单元的对象。第二个值为 false 的参数,指定了您所寻找的对象,并不是一个可映射的对象。
第 2 步 找到单元中的对象
为了得到表格单元内的对象(例如,文本框),使用如列表 2 所示的代码。
列表 2. 找到一个包含的对象
TestObject cellTxtObj = cellObj.find(atDescendant(".class","Html.INPUT.text"))[0]; |
如果在一个单元中有不止一个相同类型的对象(例如,在同一单元中有两个或者更多的文本框),那么就是用类指示符,来识别需要的对象。假设 objIndex 就是您所关注单元对象的类指示符,您可以通过使用列表 3 显示的方法来得到对象。
列表 3. 识别对象
TestObject cellTxtObj = cellObj.find(atDescendant(".class","Html.INPUT.text"))[objIndex]; |
第 3 步 执行对含有对象的操作
当第 2 步中的方法 find() 返回 TestObject 时,您就需要将其分配给与对象相关的类,这样您就可以执行需要的操作了。在列表 4 中,cellTxtObj 被归类为 TextGuiTestObject,以执行 setText() 方法。
列表 4. 向类添加对象
((TextGuiTestObject)cellTxtObj).setText(txtValue); |
找到与设置 HTML 对象的操作方法
您可以使用列表 5 所示的操作,以找到 HTML 表格单元内的所有 HTML 对象。在您找到对象之后,您就可以对它们执行所需的操作了。
列表 5. 方案代码
/* This method will return an object of the specified HTML class, wrapped inside
a table cell
* @return TestObject: Object of wrapped HTML element or null (if the object
is not found)
* @param tableObj: the concerned web table object
* @param rowIndex: the row index of the concerned cell (starting from 0)
* @param colIndex: the column index of the concerned cell (starting from 0)
* @param htmlClass: the HTML class of the object wrapped inside the cell
* @param classIndex: the HTML class of the object wrapped inside the cell
*/
public TestObject childObject(TestObject tableObj, int rowIndex, int colIndex,
String htmlClass, int classIndex)
{
TestObject cellObj = tableObj.find(atList(
atChild(".class" , "HTML.TBODY"),
atChild(".class" , "HTML.TR",".rowIndex", rowIndex),
atChild(".class" , "HTML.TD",".cellIndex",colIndex)
), false)[0];
TestObject []wrappedObj = cellObj.find(atChild(".class",htmlClass));
if(wrappedObj.length < classIndex + 1)
return null;
else
return wrappedObj[classIndex];
}
|
使用示例
接下来的例子(列表 6 到 8)假设 hTable 是定义 childObject() 方法的类的对象。
列表 6. 在单元(4,4)中选择一个复选框
TestObject cellCheckboxObj = hTable.childObject(tableObj,4,4,"Html.INPUT.checkbox",0);
((ToggleGUITestObject)cellCheckboxObj).setState(SELECTED);
|
列表 7. 在单元(5,6)中点击第二个按钮(例如 classIndex 1)
TestObject cellBtnObj = hTable.childObject(tableObj, 5, 6, "Html.INPUT.button", 1);
((GuiTestObject)cellBtnObj).click();
|
列表 8. 从单元(2,2)中的文本框导出属性组
TestObject cellBtnObj = hTable.childObject(tableObj, 5, 6, "Html.INPUT.button", 1);
((GuiTestObject)cellBtnObj).click();
|
处理样例文件
- 下载 developerWorks.zip 文件,它是一个 Rational Functional Tester 项目的范例(请查看 下载)。
- 导出压缩文件到 developerWorks 文件夹。
- 启动 Rational Functional Tester,选择 File > Connect to a Functional Test Project,浏览 developerWorks 文件夹,并点击 Finish。功能性测试项目就会在 Rational Functional Tester 中打开。
- 下载并导出 SampleHtmlTable.zip 文件,其中含有复杂 HTML 表格的范例 Web 网页,如图 2 所示。
- 在 Microsoft Internet Explorer® 中打开 dWSample.html 文件。
- 在 Rational Functional Tester 中,运行 dWExample.java。
从本文学到了什么
本文向您介绍了,使用 IBM Rational Functional Tester 自动化 HTML 表格单元中的对象的方法。这种方法包括对这些对象执行不同的操作,并导出您可以用于实施定义的验证点的对象。您可以使用这些技术,作为开发更复杂 HTML 表格方案的基础。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample Application | SampleHtmlTable.zip | 2 KB | HTTP |
|---|
| Sample Rational Functional Tester Project | developerWorks.zip | 5 KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Prakash Dewan 是位于印度 Pune 的 IBM 软件研究所的 IBM Cognos 工程团队的一名成员。除了使用 Rational Functional Tester 进行自动化测试之外,他还从事产品的各种特性和功能的验证和确认。Prakash 具有计算机应用软件的硕士学位,并在开发自动化框架方面有很深的技能。他在高级测试主题的培训方面也具有丰富的经验,并贡献了一些知识库的文章。 |
对本文的评价
|  |