RFT无法识别windows对话框的处理方法
2008-07-02 15:40
309 查看
一、概述
RFT中提供了find方法,这是一个很强大的工具,可以让我们在脱离测试对象的情况下运行测试脚本,这样我们的脚本就有了很好的健壮性和可移植性(在去年的自动化测试项目中,QTP就经常因为测试对象的属性问题导致脚本运行失败)。但是今天在利用测试对象检查器获取windows对话框属性时,碰到了一个很极端的问题,对象检查器竟然无法识别windows对话框。最后几经周折,终于解决了这个问题
二、问题
脚本的操作过程是这样的,首先点击界面中的导出按钮,这时系统会弹出一个是否保存的确认提示框,这时点击“是”,然后系统会在该对话框的基础上打开一个新的文件保存对话框。这时我发现用测试对象检查器根本无法获取到该对象的任何属性,用find方法查找时也找不到任何的对象。使用的属性是“.name”,属性值是"另存为"
三、分析
该问题的根本原因在于RFT的对象识别机制。通过查阅资料和api,我觉的RFT所能处理的对象关系可以分为两种,一种是父子关系的对象集合,另一种我们暂且叫做顶层——下层关系的对象集合。举个简单的例子,一个拥有“确定”“取消”两个按钮的确认提示框就是父子关系的对象,确认提示框是父对象,确定按钮和取消按钮就是这个按钮的子对象。父子类型的对象可以很容易的被对象检查器或find方法找到;顶层——下层关系的对象就象我们上面举的那个例子:在已经存在的windows对话框的基础上,又出现了一个对话框。两个对话框并非是父子关系,而是一种嵌套关系,并且很明显,其中有一个对话框是顶层窗口,也就是焦点的拥有者,在开发上也有叫做模态窗口的。顶层——下层对象不能被对象检查器所识别。当然,这些都是我目前对rft的理解,IBM的网站并没见过类似的解释。利用GuiTestObject我们可以很方便的处理父子关系的对象,但是对于顶层——下层关系的对象,GuiTestObject对象则无能为力(至少在我这里是这样)
四、解决
要解决该问题不妨换一个角度,RFT提供了访问window平台控件的接口,那就是IWindow。既然我们不能通过TestObject类获取保存对话框的属性,那么我们就把保存对话框当成是一个windows对象,用IWindow来识别。我们需要解决以下问题:
1、首先让脚本获取到文件保存对话框对象,该对象的类型是IWindow,对象获取可以使用getText返回的属性,文件保存对话框的getText会返回“另存为”。
2、调用IWindow的inputChars录入文件保存的目录。
3、让脚本获取到该保存对话框对象的子对象“保存”按钮,并执行点击操作
为了实现以上的功能,我们需要两个方法,分别是getTopWindow和getLevelWindow,在IBM网站上有篇相关的文章,链接请见第五节,这里直接贴出代码:
五、小结
当代码完成后,我发现这个问题其实并不复杂,所有的类和方法rft都已经提供了,只是由于以前我不熟悉IWindow的用法,所以走了不少的弯路,直到看到ibm网站上的一篇文章才豁然开朗。其实不仅仅是保存对话框,任何windows平台的控件,我们都可以用IWindow来实现查找和定位。
六、参考资料《扩展 Rational Functional Tester 的对象识别技术》http://www.ibm.com/developerworks/cn/rational/r-cn-extendsrftobj/index.html
RFT中提供了find方法,这是一个很强大的工具,可以让我们在脱离测试对象的情况下运行测试脚本,这样我们的脚本就有了很好的健壮性和可移植性(在去年的自动化测试项目中,QTP就经常因为测试对象的属性问题导致脚本运行失败)。但是今天在利用测试对象检查器获取windows对话框属性时,碰到了一个很极端的问题,对象检查器竟然无法识别windows对话框。最后几经周折,终于解决了这个问题
二、问题
脚本的操作过程是这样的,首先点击界面中的导出按钮,这时系统会弹出一个是否保存的确认提示框,这时点击“是”,然后系统会在该对话框的基础上打开一个新的文件保存对话框。这时我发现用测试对象检查器根本无法获取到该对象的任何属性,用find方法查找时也找不到任何的对象。使用的属性是“.name”,属性值是"另存为"
三、分析
该问题的根本原因在于RFT的对象识别机制。通过查阅资料和api,我觉的RFT所能处理的对象关系可以分为两种,一种是父子关系的对象集合,另一种我们暂且叫做顶层——下层关系的对象集合。举个简单的例子,一个拥有“确定”“取消”两个按钮的确认提示框就是父子关系的对象,确认提示框是父对象,确定按钮和取消按钮就是这个按钮的子对象。父子类型的对象可以很容易的被对象检查器或find方法找到;顶层——下层关系的对象就象我们上面举的那个例子:在已经存在的windows对话框的基础上,又出现了一个对话框。两个对话框并非是父子关系,而是一种嵌套关系,并且很明显,其中有一个对话框是顶层窗口,也就是焦点的拥有者,在开发上也有叫做模态窗口的。顶层——下层对象不能被对象检查器所识别。当然,这些都是我目前对rft的理解,IBM的网站并没见过类似的解释。利用GuiTestObject我们可以很方便的处理父子关系的对象,但是对于顶层——下层关系的对象,GuiTestObject对象则无能为力(至少在我这里是这样)
四、解决
要解决该问题不妨换一个角度,RFT提供了访问window平台控件的接口,那就是IWindow。既然我们不能通过TestObject类获取保存对话框的属性,那么我们就把保存对话框当成是一个windows对象,用IWindow来识别。我们需要解决以下问题:
1、首先让脚本获取到文件保存对话框对象,该对象的类型是IWindow,对象获取可以使用getText返回的属性,文件保存对话框的getText会返回“另存为”。
2、调用IWindow的inputChars录入文件保存的目录。
3、让脚本获取到该保存对话框对象的子对象“保存”按钮,并执行点击操作
为了实现以上的功能,我们需要两个方法,分别是getTopWindow和getLevelWindow,在IBM网站上有篇相关的文章,链接请见第五节,这里直接贴出代码:
/** * 返回window系统中顶层窗口的对象,例如getTopWindow("另存为")将返回一个windows另存为对话框,与getLevelWindow不同的是,Topwindow对象可以执行inputChars方法,而LevelWindow则不行. * @param objName windows窗体、对话框、元素的getText属性 * @return IWindow windows控件(对象),该对象是顶层窗口 */ public IWindow getTopWindow(String objName) { IWindow[] wins = RationalTestScript.getTopWindows(); int length = wins.length; for (int i = 0; i < length; i++) { if (wins[i].getText().matches(objName)) { return wins[i]; } } return null; }
/** * 对于某些二级弹出窗口,可用该方法进行识别和操作,该方法返回指定名称的对象,例如getWinObject("另存为","保存(&S)"),该方法回返回windows保存对话框中的"保存"按钮. * * @param topWinName * 顶层窗口对象的getText属性 * @param levelWinName * 顶层对象下子对象的getText属性 * @return IWindow对象,该对象可执行单击和双击的操作. */ public IWindow getLevelWindow(String topWinName, String levelWinName) { IWindow winobjects = null; IWindow[] wins = RationalTestScript.getTopWindows();// 返回windows对象数组 for (int i = 0; i < wins.length; i++) {// 在数组中查找所有符合topWinName属性的对象 if (wins[i].getText().equals(topWinName)) { winobjects = wins[i]; } } IWindow[] winobj = winobjects.getChildren(); for (int i = 0; i < winobj.length; i++) { if (winobj[i].getText().equals(levelWinName)) {// 在顶层对象中,查找符合levelName属性的对象 return winobj[i]; } } return null; }
最后实现文件保存框识别和文件保存的代码如下:
test.getLevelWindow("另存为", "文件名(&N):").click();//点击文件保存文本框,获取焦点. test.getTopWindow("另存为").inputChars("c://result.xls");//录入保存文件的对话框
五、小结
当代码完成后,我发现这个问题其实并不复杂,所有的类和方法rft都已经提供了,只是由于以前我不熟悉IWindow的用法,所以走了不少的弯路,直到看到ibm网站上的一篇文章才豁然开朗。其实不仅仅是保存对话框,任何windows平台的控件,我们都可以用IWindow来实现查找和定位。
六、参考资料《扩展 Rational Functional Tester 的对象识别技术》http://www.ibm.com/developerworks/cn/rational/r-cn-extendsrftobj/index.html
相关文章推荐
- RFT API初涉——之解决RFT无法识别windows对话框的问题
- [转载]XP向windows 7传输文件时系统提示“服务器存储空间不足,无法处理此命令”故障的解决方法
- ORA-12514 监听程序当前无法识别连接描述符中的服务处理方法
- HP刀箱无法识别刀片的处理方法
- 移动硬盘可以识别但无法读取的处理方法
- Windows 8无法识别杀毒软件的解决方法
- 【ORACLE】监听程序当前无法识别连接描述符中请求的服务-处理方法
- 2003_由于不可识别问题_windows无法显示windows防火墙设置解决方法
- 移动设备无法识别的USB设备处理方法
- Android手机无法识别SD卡的处理方法
- 在windows下,Android adb 找不到 Devices 的解决方法(eclipse无法识别手机)
- Windows 7安装软件时无法将注册值写入注册表的处理方法
- 无法识别的属性“decompressionEnabled”处理方法
- 项目中出现无法识别的属性“decompressionEnabled”处理方法
- Radeon x1300 x1550 在Windows 10上面无法识别的解决方法
- Windows 7安装软件时无法将注册值写入注册表的处理方法
- ds4700更换控制器导致磁盘无法识别-处理方法
- VMware无法识别USB设备的解决方法 以及 从虚拟机中断开USB设备,使其重新连接到windows主机上
- 关于adb无法识别android设备的处理方法
- Xp 连接 windows 2008 出错 的处理方法