等效于javascript Selenium Web Driver中的jQuery.active

时间:2018-09-26 09:54:07

标签: javascript jquery selenium selenium-webdriver selenium-firefoxdriver

我正在使用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请求的数量。

2 个答案:

答案 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;
    })()

");