更新:我用同样的方法(wrapRequest)与Selenium2相同,它仍然有效。唯一的区别是我不使用用户扩展。我只是执行JavaScript来查询由JSP加载的代码。
这就是我们最终做的。 (注意,如果你总是只使用像JQuery这样的单个框架,那么有更简单的方法来获得Ajax调用是否正在运行,因为我们有几个使用JQuery和一堆的页面使用GWT)
我创建了一个JavaScript文件,每个页面只在你正在测试时加载。 (我通过在我们的JSP模板中包含一个片段来做到这一点:如果测试查询字符串参数被传入为真,请设置一个cookie。如果设置了该cookie,请包含JavaScript文件) 此JavaScript文件基本上包装XMLHttpRequest对象以保留所有发送请求的计数:
function wrapRequest(xmlRequest) {
var oldSend = xmlRequest.prototype.send;
xmlRequest.prototype.send = function() {
var oldOnReady = this.onreadystatechange;
oldOnReady = function() {
oldOnReady.apply(this, arguments);
// if call is complete, decrement counter.
}
// increment counter
if(oldSend.apply)
oldSend.apply(this, arguments);
else if (oldOnReady.handleEvent) { //Firefox sometimes will need this
oldOnReady.handleEvent.apply(this, arguments);
}
}
}
还有一点,比如果async == false,但应该很容易弄清楚。
然后,我增加了一个功能,硒用户extensions.js,仅仅是这样的:
Selenium.prototype.getIsNetworkReady = function() {
if(this.browserbot.topWindow.isNetworkReady) { //sometimes this method is called before the page has loaded the isNetworkReady function
return this.browserbot.topWindow.isNetworkReady();
}
return false;
}
另外,还要注意对topWindow检查:这是因为当选择一个iframe你的问题。
此外,您将不得不调用每个加载的iFrame的XMLHttpRequest对象上的wrapRequest方法。我现在使用:document.addEventListener("DOMNodeInserted", onElementAdded, true);
,然后在onElementAdded中,我只是在加载iframe时传入XMLHttpRequest对象。但在IE中不起作用,所以我正在寻找替代方案。如果有人知道更好的方式来做到这一点,所以它在IE和FF都有效,我很乐意听到它。
无论如何,这是实施的要点。希望这有助于任何人在未来。
对于我们内部构建的AJAX框架,我们做了同样的事情,在WaitForCondition()中调用IsTheCountZeroYet()函数。我明白你可以轻松地用jQuery来做到这一点。其他框架,也许也是。 – 2010-11-11 22:07:08
有趣的是,prototype.js中的ajax计数器是越野车,它们并不总是返回0。视觉效果还没有这种类型的计数器。所以我们必须推出自己的。 – krosenvold 2010-11-13 19:21:57