更新:我用同樣的方法(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