我正在使用Selenium Webdriver与某些网站进行交互。
如果网站使用的是jQuery,则可以使用jQuery.active
来获取待处理的AJAX请求。
JavascriptExecutor jsx = (JavascriptExecutor) driver;
Int totAjaxRequest =(Int)jsx.executeScript(“ jQuery.active”);
Int totAjaxRequest = (Int)jsx.executeScript("return jQuery.active");
如果网站未使用jQuery,我们如何计算XMLHttpRequest
请求的数量。
答案 0 :(得分:1)
下面是一个示例,该示例如何使用守夜人自定义命令来完成等待AJAX请求的操作。
一个用于初始化计数器的命令。如果每个send
的计数器都会增加,而open
的计数器则会减少customCommands/initAjaxCounters.js
:
exports.command = function () {
this.execute(function () {
window.sumStartedAjaxRequests = 0
window.activeAjaxCount = 0
function isAllXhrComplete () {
window.activeAjaxCount--
}
(function (open) {
XMLHttpRequest.prototype.open = function () {
this.addEventListener('loadend', isAllXhrComplete)
return open.apply(this, arguments)
}
})(XMLHttpRequest.prototype.open)
})
this.execute(function () {
(function (send) {
XMLHttpRequest.prototype.send = function () {
window.activeAjaxCount++
window.sumStartedAjaxRequests++
return send.apply(this, arguments)
}
})(XMLHttpRequest.prototype.send)
})
return this
}
然后是另一个自定义命令以等待
const sleepWhenOutstandingAjaxCalls = function (result) {
if (result.value > 0) {
this.pause(this.globals.waitForConditionPollInterval)
this.waitForOutstandingAjaxCalls()
}
}
exports.command = function () {
// init the ajax counter if it hasn't been initialized yet
this.execute('return (typeof window.activeAjaxCount === "undefined")', [], function (result) {
if (result.value === true) {
throw Error('checking outstanding Ajax calls will not work without calling initAjaxCounter() first')
}
})
this.execute(
'return window.activeAjaxCount', [], sleepWhenOutstandingAjaxCalls
)
return this
}
答案 1 :(得分:0)
将其保留在您的网站中,并从硒中调用它。我认为没有任何类似的内置js函数。我认为这不是您要寻找的答案,但是正如我上面所说的,javascript本身并不具有这样的功能。
var activeXhr = (function(){
var count = 0;
XMLHttpRequest.prototype.nativeSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.onreadystatechange = function(){
switch(this.readyState){
case 2: count++; break
case 4: count--; break
}
};
this.nativeSend(body);
};
return count;
})();
console.log(activeXhr);
如果您不能编辑或向网站添加新脚本,则仍然可以运行该脚本。
Int totAjaxRequest = (Int)jsx.executeScript("
(function(){
var count = 0;
XMLHttpRequest.prototype.nativeSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.onreadystatechange = function(){
switch(this.readyState){
case 2: count++; break
case 4: count--; break
}
};
this.nativeSend(body);
};
return count;
})()
");