RFT 学习-TestObject

来源:互联网 发布:网络信息安全注意事项 编辑:程序博客网 时间:2024/05/29 15:25

http://www.52testing.com/showart.asp?id=48

RFT在进行对象识别时,每一个被测软件上的对象都可以映射为 RFT 上的一个 TestObject 对象,也就是说,假如RFT所识别的测试对象组成一棵树的话,那么TestObject便是这棵树的“根”,所有的被测对象都从这个根部汲取“营养”,即,所有的被测对象都默认继承自类TestObject,并拥有TestObject类中的所有非私有(非private)的方法。我们要基于RFT来开发测试脚本,这个类,我们不能不先熟悉一下。

类的声明——

public class TestObject extends java.lang.Object

TestObject做为一个“祖宗”级别的类,它所提供的方法很多,功能也很强大,本文就开发测试脚本中常用到的几个方法做一个介绍。

方法一 

public boolean exists()

被测对象调用该方法后,RFT自动在当前窗口中进行查找,如果找到匹配对象则返回true,否则返回false,如果找到多个匹配的候选值,同样返回true。该方法一旦执行,便在当前窗口进行匹配查找,即使找不到,也不会等待该对象的出现,也不会抛出任何异常信息。比如在启动LoushangStudio的时候,我们编写如下测试脚本。

         // 启动LoushangStudio

 startApp("start");

 //判断对象loushangLoushangPlatform()在当前窗口中是否存在。

 System.out.println(loushangLoushangPlatform().exists());

 //waitForExistence(100.0, 1.0),等待被测对象出现,最长等待时间100秒,每秒钟

          //尝试一次,如果找到 loushangLoushangPlatform() 对象,则继续往下执行。

loushangLoushangPlatform().waitForExistence(100.0, 1.0);

 //判断对象loushangLoushangPlatform()在当前窗口中是否存在。

System.out.println(loushangLoushangPlatform().exists());

执行完这段脚本后,我们会在控制台看到这样的信息——

说明:在第一次调用exists()方法时,LoushangStudio还没有起来,所以返回false,当第二次调用该方法的时候,由于前面已经调用了waitForExistence()方法,阻止当前脚本的继续执行,直到loushangLoushangPlatform对象出现,所以返回true。

方法二

public TestObject[] find(Subitem properties)

find方法可以实现在运行时,动态地在被测应用程序(application under test,AUT)中定位 TestObject通过使用它,您可以避免不得不记录动作以向对象地图(Object Map)中添加 TestObject 对象。

在RFT中,被映射的对象使用被存储的、静态的、识别属性和对象层次来验证回放过程中脚本是否使用了正确的控件。虽然使用被记录的对象进行对象识别速度很快,但是更新属性却是费时的,特别是当您需要将对象的属性权值,或者文本属性变更为正则表达式(regular expression,Regex)值时。find 方法向您提供一种能够排除大多数来自于对象地图的被记录控件的选项。

find 方法在 RFT 的当前版本(8.0)已经非常成熟,其性能几乎与使用映射对象的性能相同。该方法可以根据指定的查询条件,搜索所有匹配的对象,并将搜索到的结果放入TestObject[]数组中返回。其中查询条件的设置通常有以下三种格式:

1、 atChild 搜索 TestObject 所有直接的子对象。 

2、 atDescendant 寻找 TestObject 的所有子对象。 

3、 atList 让您指定一个 atChild、atDescendant,和 atProperty 对象的列表,这样可以进一步减小搜索范围,提高搜索效率和准确性。 

前面我们提到过:“每一个被测软件上的对象都可以映射为 RFT 上的一个 TestObject 对象。”,也就是说,TestObject是所有被测试对象的父类,所以我们可以用任何一个被测对象来调用 find方法。这依赖于所选择的对象,搜索只限于您所选择的对象下面层级的对象。比如,在LoushangStudio中,新建模型视图时(如图1所示),

图1-新建模型视图

需要输入文件名称(File name),然后点击【Finish】按钮,这两个动作虽然都可以通过录制脚本来实现,但是鉴于静态识别存在的固有的缺陷,此处我们使用find方法来动态查找,并执行相应的动作。首先,我们可以借助于RFT提供的对象查找器来获取各对象的识别属性。

图2-新建模型视图窗口对象识别属性

图3-文件名输入域对象识别属性

图4-Finish按钮对象识别属性

获取到各对象的信息后,下面我们就可以利用这些属性信息动态的进行对象的识别了(说明:每一个测试对象都包含有若干个识别属性,在实际使用时,我们要学会取舍,在识别时,只使用该对象特有的属性,比如要查找“新建模型视图”窗口,我们在find方法中,只需提供“.captionText”属性值即可。)。

要想快速准确的查找到“文件名输入域”和“Finish按钮”,我们需要先找到其父对象,然后,再用父对象调用find方法进行查找。(说明:此处我们也可以不通过父对象,直接查找“文件名输入域”和“Finish按钮”,但是,这样的话,我们就不能保证结果的唯一性,也就是说,如果在其他窗口也存在这两个对象的话,我们就不好区分哪一个是我们需要的,所以,为了严谨起见,我们通过父对象查找子对象的方式来进行,在实际编写测试脚本时,可以根据具体情况分别对待。)

//获取顶层窗口对象

RootTestObject root = RootTestObject.getRootTestObject();

//通过顶层窗口对象调用find方法,查找“新建模型视图”窗口对象。

TestObject[] to=root.find(atDescendant(".captionText","新建模型视图"));

//通过“新建模型视图”窗口对象调用find方法,查找“文件名输入域”对象

TestObject[] textObject=to[0].find(atDescendant(".class","org.eclipse.swt.widgets.Text",".priorLabel","File name:"));

//根据找到的TestObject对象,创建一个新的TextScrollTestObject对象,然后调用

//TextScrollTestObject对象的setText方法,向输入域中添加信息。

new TextScrollTestObject(textObject[0]).setText("testObject");

//通过“新建模型视图”窗口对象调用find方法,查找“Finish按钮”对象 TestObject[] buttonObject=to[0].find(atDescendant("text","&Finish"));

//根据找到的TestObject对象,创建一个新的GuiTestObject对象,然后调用

// GuiTestObject对象的click方法,执行单击操作。

new GuiTestObject(buttonObject[0]).click();

在上面的例子中,我们使用了find方法最常用的一种使用方法,find(atDescendant()),有时在多属性下,为了减小搜索范围,提高搜索效率,我们还会用到find(atList())这种列表形式,比如:

TestObject[] buttonObject=root.find(atList(atDescendant("text","&Finish",".classIndex","0"), atProperty(".class""org.eclipse.swt.widgets.Button")));

总之,find的使用可以有效的增强测试脚本的健壮性和易维护性,其功能也是相当强大的,在实际使用中应该加以灵活的应用。

方法三

public TestObject[] getChildren()

该方法将以数组的形式返回被测对象的所有直接孩子对象,所过被测对象没有子对象,则返回的数组的长度为0.

比如,在测试LoushangStudio的导出数据结构文档时,由于RFT对象查找器不能识别“另存为”对话框,这时,我们需要手动编写测试代码来实现,便会用到该方法,如下:

// 根据传入的窗口对象和子对象属性 查找并返回子对象,如果查找不到,则返回null

public IWindow getControl(IWindow iTopwin, String sCtrlText) {

if (iTopwin == null) {

System.out.println("传入的父windows对象为空");

return null;

}

// getChildren()方法返回该对象的所有子对象的数组。

IWindow[] windows = iTopwin.getChildren();

IWindow current = null;

int length = windows.length;

//遍历孩子对象数组,注意查看是否与给定属性值匹配,如果匹配则返回该对象。

for (int i = 0; i < length; i++) {

current = windows[i];

if (current.getText().contains(sCtrlText)) {

return current;

}

}

return null;

}

方法四

public java.util.Hashtable getProperties()

该方法将返回一个封装有被测对象所有属性的容器Hashtable,在该容器中,所有属性以键值对的形式存放,“键”便是属性的名称,“值”便是属性的具体值。在实际编写测试脚本时,很多情况下,我们需要获取某一测试对象的属性,getProperties()可以很方便的帮我们实现,脚本如下——

//打印loushangLoushangPlatform()的所有属性信息

System.out.println( loushangLoushangPlatform().getProperties());

打印输出结果如下——

{location=java.awt.Point[x=-4,y=-4], font=com.rational.test.ft.value.FontInfo[name=宋体,style=0,size=9], enabled=true, layoutDeferred=false, text=Loushang - Loushang Platform, toolTipText=null Object, visible=true, class=org.eclipse.swt.widgets.Shell, borderWidth=1, disposed=false, bounds=java.awt.Rectangle[x=-4,y=-4,width=1032,height=746], style=33555696, backgroundMode=0, background=java.awt.Color[r=236,g=233,b=216], imeInputMode=0, maximized=true, size=java.awt.Point[x=1032,y=746], reparentable=false, dragDetect=true, minimumSize=java.awt.Point[x=123,y=34], clientArea=java.awt.Rectangle[x=0,y=0,width=1024,height=692], minimized=false, foreground=java.awt.Color[r=0,g=0,b=0], focusControl=false}

当使用find方法基于动态对象识别技术编写测试代码时,我们就可以参照上面的对象的属性信息设置对象识别属性。比如对于被测对象loushangLoushangPlatform而言,我们使用其class和text两个属性就可以唯一的识别该对象。

方法五

public java.lang.Object getProperty(java.lang.String

 propertyName)

该方法返回被测对象的指定的的属性值。

该方法使用很简单,给它一个指定的属性,它便把对应的值给你返回,简单使用如下——

// 根据指定的属性,返回对应的值。

String LoushangLoushangPlatform_text = (String) loushangLoushangPlatform().getProperty("text");

System.out.println(LoushangLoushangPlatform_text);

脚本执行完,结果如下——

Loushang - Loushang Platform

该方法除了可以手工编写外,为了更方便您的使用,RFT还提供了图形化的生成方式。

在录制脚本时,点击正在记录窗口的“插入验证点或操作命令”按钮(如图5),

图5-正在记录窗口 

在弹出的“验证点和操作向导”窗口中,点击小手状的对象查找器按钮,并将其拖放到我们将要插入操作的被测对象上,系统弹出“选择操作”对话框(如图6),

图6-选择操作对话框

在选择操作对话框中,选择“获取特定的属性值”,然后点击【下一步】,系统弹出“为变量指定属性值”对话框(图7)。

图7-为变量指定属性值对话框

在该窗口中,列出了我们所选对象的所有属性,在这儿,我们可以根据实际需要选择我们要获取的属性值(比如class),然后下一步,进入指定变量名窗口(图8),

图8-指定变量名对话框

在该窗口中可以为将要获取的属性值指定一个变量名称,默认值是:对象_属性 组合而成,点击【完成】,获取特定属性值结束。

现在打开我们的测试脚本,可以看到生成了如下代码——

String Tree_class = (String)tree().getProperty("class");

这样通过操作向导就完成了一个获取特定属性值的简单操作。

方法六

public void waitForExistence

(double maximum_find_object_time,double find_object_wait_between_retry)

参数说明:

maximum_find_object_time—查找被测对象的最长等待时间,单位秒。

find_object_wait_between_retry —在最长等待时间内,每次尝试查找对象的时间间隔,单位秒。

该方法被调用时,将阻塞当前测试脚本的继续执行,在最大等待时间内,不断的尝试查找被测对象,找到则继续往下执行,如果在最大等待时间内找不到指定的测试对象,则抛出超时异常。该方法常用于等待某一个对象的出现,比如网页是否下载完全,某个窗口是否打开等,在实际测试中,使用比较频繁。

简单使用如下——

//每秒钟尝试查找一次loushangLoushangPlatform() 对象,找到则继续往下执行。

loushangLoushangPlatform().waitForExistence(100.0, 1.0);

同样,为了方便您的使用,RFT对于该方法也提供了图形化的操作向导。在图六-选择操作对话框中,我们选择等待选中的测试对象,然后下一步,在弹出的“插入waitForExistence命令”窗口(如图9)中,我们可以根据实际需要设置最长等待时间和检查时间间隔,设置完成后,点击【完成】。

9-插入waitForExistence命令对话框

打开我们的测试脚本,可以看到如下代码——

viewForm().waitForExistence(120.0, 2.0);

小结

到此,TestObject类的基本使用总算介绍完了,前面已经说过,上面介绍的6个方法是实际测试中常用到的,除此之外,TestObject类还有很多其他的方法,在此不做介绍了,如果在实际测试中用到的话,可以再参考RFT帮助文档进行学习和研究。

0 0