如果想避免录制动作以向对象地图(Object Map)中添加 TestObject 对象,我们可以采用 TestObject.find 方法 TestObject.find 方法是一个 Java™方法, RFT 使用它在运行时动态地在被测应用程序(Application Under Test)中定位 TestObject,其根据对象的属性在运行时进行识别,可由脚本编写人员在运行时动态调整对象识别属性,因此其带来了极大的灵活性。由于其未在 Object Map 中录制任何对象,所以不能调用 waitForExistence() 方法来阻塞等待,我们可通过一个循环来实现,示例代码如下:
while ( 等待时间值 ){ if( find(atDescendant(".class", "Html.Button") != null){ return; } sleep(1);} |
该方法将不断识别指定对象 ( 能明显区别开响应页面与其他页面的一个对象 ),直到识别成功或时间超时。
TestObject.find 方法是 RFT 提供给脚本开发人员的一个强大的接口,在开发可维护的脚本过程中不可避免的会用到该方法,而且其执行效率也得到了很大改进,下面给出了利用它在等待页面下载时的一些优缺点。
优点:利用该方法我们将能充分利用 find 方法的动态性和可重用性。
缺点:由于 find 方法只能依赖于对象的属性,而不会依赖于对象的层次结构来进行识别,所以即使我们找到了对象,也不能判断当前页面是否下载完毕。比如,页面中的图片资源会在其他元素下载完毕后再下载,所以如果此时对这些图片进行操作的话将会出现异常。
|
除了上述两种方法,如果当前之存在一个浏览器窗口,则可以利用浏览器对象的 .readyState 状态来进行判断。
如果响应页面中某个对象能被 RFT 识别(即该对象已下载成功)则该对象的 readyState 属性值将会是”4”或”complete”。不同浏览器中 readyState 的值会不一样,IE 中为 complete, FireFox 中为 4。(RFT 从 7.0 版本开始对 IE 及 FireFox 全部支持 )。
上面提到过 RFT 以树型结构的方式来识别对象,越外层的对象所包含的页面元素越多,因此我们可以利用浏览器对象的 readyState 值是否为”4”或”complete”来判断当前页面是否下载完毕。如果浏览器对象已下载成功,则页面其他元素(即其所有子元素都已下载),或者可将 HtmlBrowser 对象录入到 Object Map 中并调用 HtmlBrowser.waitForExistence() 方法 ( 不同的 HtmlBrowser 在 RFT 中并没有区别,所以将其录入到 Object Map 中可以达到重用的目的 ),可达到与上述方法同样的效果。
while ( 等待时间值 ){ if( find(atDescendant(".class","Html.Browser"). getProperty(“readyState”).equals(“complete”)){ return; } sleep(1);} |
该方法利用 Test Object 的一个属性值来进行判断,在只存在一个浏览器对象的时候这个方法能很好的帮我们解决页面等待问题。
下面对他的优缺点进行下比较。
优点:可准确的判断页面是否下载完毕,并且很容易做到重用。
缺点:由于该方法依赖于浏览器对象,而不能匹配页面具体元素,所以很难做到唯一指定一个页面。比如同时打开了多个浏览器页面,或者在请求页面和响应页面之间有个等待页面,这些情况下该方法不能很好的工作。
如前所述,方法一存在重用性问题,方法二不能准确判断页面是否下载完毕,而方法三在同时打开多个浏览器页面时不能准确识别,因此单独采用上述三种方法都不能很好地完成任务,不过我们可以结合方法二和方法三利用方法二中的 find 方法,可以指定响应页面中的一个标识对象,这样即使有多个页面也能唯一确认响应页面。同时利用方法三中浏览器对象的 readyState 状态值来判断当前页面是否下载完毕,这样的结合就能达到准确判断响应页面是否下载完毕的目的。
while(true){ if(getButton("Finish") != null && new BrowserTestObject(getButton("Finish"). getTopParent().getChildren()[0]). getProperty("readyState").equals("complete")){ return; } sleep(1);} |
在方法三种我们提到可用 Object Map 中录入 HtmlBrowser 对象的方法来替代判断浏览器对象 readyState 状态的方法,但如果同时打开多个浏览器页面,将无法区分开来。所以此处最好采用上述代码中所列方法:判断当前对象所在的浏览器的 readyState 状态。
由于该方法完全采用了动态识别的方式,因此我们在程序中可以更好的来重用它,通过定义一个 Helper super class,在这个类中定义上述方法,需要调用该功能的类通过继承这个 class 并将需要动态查找的对象作为参数传递给该 class 这种方式,我们能在代码级得到更好的重用。
优点:该方法能准确的找到指定页面并且能很好的判断页面是否下载完毕。而且利用了 find 方法来动态识别能很好的做到重用。
五、总结
自动化测试的页面等待是一个常见的问题,本文介绍了 RFT 中常用的几种解决办法。每一种方法都有自己的优缺点,这些方法的差别也正体现了 RFT 中静态与动态识别的差异,在具体的实践过程中我们可以依据具体的应用类别来选择合适的解决方案。
例如:在相似页面重复很少的情况下,我们可以采用方法一,这样可以充分利用 Object Map 的易用性及性能优势在相似页面重复较多,同时打开多个浏览器页面,页面响应比较快的时候可以采用方法二在只打开一个浏览器页面的时候可以采用方法三在相似页面重复较多,同时打开多个浏览器页面,而且页面响应比较慢的时候可以采用方法四。
文章来源于领测软件测试网 https://www.ltesting.net/