在用RFT录制的导出数据结构文档的操作时,RFT对象检查器无法识别windows“另存为”对话框,在网上几经搜寻,终于解决了这个问题。
问题描述:
在模型编辑窗口,任选一点右击,在弹出的右键菜单中选择【导出数据结构文档】,系统弹出“另存为”对话框。然而,对于“另存为”对话框进行的任何操作,比如,输入文件名称、点击【保存】,RFT都没有做任何的记录。也就是说测试对象检查器根本无法获取到该对象的任何属性,用find方法(动态识别对象的一种常用的方法)查找时也找不到任何的对象。使用的属性是“.name”,属性值是“另存为”。
解决方法:
RFT提供了访问windows平台控件的接口,那就是IWindow。既然我们不能通过TestObject类获取“另存为”对话框的属性,那么我们就把“另存为”对话框当成是一个windows对象,用IWindow来识别。步骤如下:
1、首先需要获取到“另存为”对话框对象,该对象的类型是IWindow,对象获取可以使用getText返回的属性,“另存为”对话框的getText会返回“另存为”。
2、调用IWindow的inputChars方法输入将要导出的文件的名称。
3、获取到“另存为”对话框对象的子对象“保存”按钮,并执行点击操作。
为了实现以上的功能,我们需要首先写两个方法,分别是public IWindow getWindow(String sCaption)和public IWindow getControl(IWindow iTopwin,String sCtrlText), 前者是用来查找windows窗口对象,后者是用来获得windows窗口对象上面的子对象,如文本框、按钮等。代码如下:
// 根据传入的windows对象属性,查找对应的windows对象并返回。
//如果找不到则返回null。
public IWindow getWindow(String sCaption){
IWindow[] wins=RationalTestScript.getTopWindows();
IWindow current=null;
int length=wins.length;
for (int i = 0; i < length; i++) {
current = wins[i];
if(current.getText().matches(sCaption)){
return current;
}
}
return null;
}
//根据传入的窗口对象和子对象属性 查找并返回子对象,如果查找不到,
//则返回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 void testMain(Object[] args) {
//上面所写的getControl()和getWindow()方法单独写在了Tools类中,
//所以在此需要先创建Tools的对象。
Tools tool = new Tools();
classDiagramEditPartClassDiagr().click(atPoint(326, 93));
classDiagramEditPartClassDiagr().click(RIGHT, atPoint(326, 93));
contextMenu().click(atPath("导出数据结构文档"));
//利用find()方法进行查找名称为“另存为”的windows窗口对象。
TestObject temp[]=find(atDescendant(".name","另存为"));
if(temp.length==0){
System.out.println("找不到.name是另存为的窗口对象");
}
//调用getWindow()方法,查找并返回名称为“另存为”的窗口对象。
IWindow topwindow = tool.getWindow("另存为");
//调用getControl()方法,查找并返回指定的窗口子对象。
IWindow file_name = tool.getControl(topwindow, "文件名");
if (file_name != null) {
// 点击文件保存文本框,将焦点定位于文件名输入框中。
file_name.click();
//输入要导出的文件的名称
topwindow.inputChars("导出数据结构文档测试");
}
//调用getControl()方法,查找并返回对象“查找”按钮。
IWindow button_save = tool.getControl(topwindow, "保存(");
if (button_save != null) {
//点击【保存】按钮
button_save.click();
//不定长等待,最长等待时间20秒,每秒钟尝试一次,
//如果找到ok()对象,则继续往下执行。
ok().waitForExistence(20, 1);
//保存成功
ok().click();
}
}
测试脚本编写完成后,运行,顺利通过。
小结:
通过解决这个问题经历,初步认识到RFT提供的API重要性,在RFT中,所有的类和方法都已经提供了,只是由于自己不熟悉RFT类库的使用方法(比如,IWindow的用法),所以碰到这种问题的时候,往往不知所措,走了不少的弯路,其实不仅仅是保存对话框,任何windows平台的控件,我们都可以用IWindow来实现查找和定位,以此为契机,以后对RFT的类库做进一步的研究和学习。
参考文章:<<RFT无法识别windows对话框的处理方法>> URL:http://www.51testing.com/?uid-31621-action-viewspace-itemid-86527