我正在尝试使用QTP测试使用ajax4jsf实现ajax功能的Web应用程序。 QTP无法识别ajax何时完成。 我已经读过,QTP 9.5和QTP 10提供的Web扩展性工具包是我的问题的解决方案。 但是,我无法理解这对我有什么帮助:我需要知道httpRequest对象的就绪状态,并在状态为“完成”时继续测试。但我不知道如何从Web扩展工具包到达httpRequest。 任何帮助将不胜感激。
答案 0 :(得分:2)
根据我使用AJAX调用自动测试基于Web的应用程序的经验,我建议您考虑以下事项。
QTP的对象识别机制正在寻找使用Windows Handle的 GUI 对象。 因此,只要可能,只使用GUI对象。手动测试您将无法访问XmlHttpRequest对象,但它不会阻止您进行功能测试。 您仍然可以根据GUI对象的属性更改来同步各种事件。 例如。 “loading ...”图像或文字出现/消失。下拉列表停止添加新项目。按钮变为启用/禁用。
如果这是您的内部应用程序,您可以为QTP开发更友好的支持,在这里您可以使用扩展性工具包中的指南。 此外,作为测试构建选项,您可以包含GUI对象(不可见图像或文本元素),并使用它来指示AJAX事务的状态。
最后,您仍然可以直接访问DOM以访问非GUI对象,尽管我没有关于以这种方式使用XmlHttpRequest对象的信息。
谢谢你, Albert Gareev
答案 1 :(得分:2)
感谢您的回答。
我们使用QTP Extensibilty工具包设法解决了我们的问题:
A4j使用在ajax之前和之后唤醒的侦听器队列(取决于侦听器的类型)。
在我们的解决方案中,我们为每个ajax组件实现了一个Jscript函数(例如webButton):
1.将globalVariable初始化为0
2.将一个新函数注册为onafterajax类型的监听器:
_elem.ownerDocument.parentWindow.A4J.AJAX.AddListener({
onafterajax: function(req, event, data) {
globalVariable = 1;
}
});
进入一种忙碌的等待循环:
while (globalVariable != 1) {
_util.Wait(250);
}
我们注册的函数在ajax完成时调用并更改globalVariable,因此while循环将退出。 我知道这很难看,但效果很好。
我们唯一的问题是QTP 10实现_util.wait而QTP 9.5没有。没有等待,浏览器将陷入无限循环,并且永远不会调用注册的函数。 关于在Jscript中实现非忙等待等待的任何解决方案都将非常受欢迎。
答案 2 :(得分:0)
我希望您能找到以下文章。
AJAX应用程序的同步 http://relevantcodes.blogspot.com/2009/06/synchronization-for-ajax-applications.html
谢谢你, Albert Gareev