更新:我以与 Selenium2 相同的方式使用相同的方法 (wrapRequest),它仍然有效。唯一的区别是我不使用用户扩展。我只是执行javascript来查询JSP加载的代码。
这就是我们最终要做的事情。
(请注意,如果您始终只使用像 JQuery 这样的单一框架,则有更简单的方法来获取 Ajax 调用是否正在运行。我们不得不对它进行更多的调整,因为我们有一些使用 JQuery 的页面和一堆使用 GWT)
我创建了一个 Javascript 文件,只有在您进行测试时才会加载每个页面。 (我通过在我们的 JSP 模板中包含一个 sn-p 来做到这一点:如果测试查询字符串参数作为 true 传入,则设置一个 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 的话,还有一些问题,但这应该很容易弄清楚。
然后我在 selenium user-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 中工作,我很想听听。
无论如何,这就是实施的要点。希望这对将来的任何人都有帮助。