Javascript 获取网页中发生的网络调用的计数

Javascript 获取网页中发生的网络调用的计数,javascript,selenium,selenium-webdriver,Javascript,Selenium,Selenium Webdriver,因此,基本上我正在尝试使用selenium设计一个通用方法,它等待所有后台网络调用完成(包括任何Ajax、Angular和API调用)。我知道有一种方法可以使用JQuery.active获取活动ajax的数量,但只有在应用程序构建在JQuery框架上时,这种方法才有效。此外,我想要的是等待所有网络调用完成的东西,而不仅仅是Ajax特有的东西 所以在这里,我试图获取当前在后台发生的网络呼叫数,并等待它为零 但是,这是我处理它的想法,欢迎任何新想法或建议。下面是一个示例,可以等待Chrome没有未决

因此,基本上我正在尝试使用selenium设计一个通用方法,它等待所有后台网络调用完成(包括任何Ajax、Angular和API调用)。我知道有一种方法可以使用JQuery.active获取活动ajax的数量,但只有在应用程序构建在JQuery框架上时,这种方法才有效。此外,我想要的是等待所有网络调用完成的东西,而不仅仅是Ajax特有的东西

所以在这里,我试图获取当前在后台发生的网络呼叫数,并等待它为零


但是,这是我处理它的想法,欢迎任何新想法或建议。

下面是一个示例,可以等待Chrome没有未决的Ajax请求:

from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.ui import WebDriverWait
import json


def send_chrome(driver, cmd, params={}) :
  resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
  url = driver.command_executor._url + resource
  body = json.dumps({'cmd': cmd, 'params': params})
  response = driver.command_executor._request('POST', url, body)
  if response.get('status'):
    raise Exception(response.get('value'))
  return response.get('value')

def extend_xhr_chrome(driver) :
  send_chrome(driver, "Page.addScriptToEvaluateOnNewDocument", {\
      "source":
        "(function(){"
        "  var send = XMLHttpRequest.prototype.send;"
        "  var release = function(){ --XMLHttpRequest.active };"
        "  var onloadend = function(){ setTimeout(release, 1) };"
        "  XMLHttpRequest.active = 0;"
        "  XMLHttpRequest.prototype.send = function() {"
        "    ++XMLHttpRequest.active;"
        "    this.addEventListener('loadend', onloadend, true);"
        "    send.apply(this, arguments);"
        "  };"
        "})();"
    })

def is_xhr_idle_chrome(driver) :
    return send_chrome(driver, 'Runtime.evaluate', {\
      'returnByValue': True,\
      'expression': "XMLHttpRequest.active == 0"
    })['result']['value']


# launch Chrome
driver = webdriver.Chrome()

# extend XMLHttpRequest
extend_xhr_chrome(driver)

driver.get("https://stackoverflow.com")

# wait for no pending request
WebDriverWait(driver, 20, 0.08) \
  .until(is_xhr_idle_chrome)

我们可以把它作为独立于浏览器的吗?因为我的测试可能会根据需要在不同的浏览器上运行。您可以在JavaScript中注入
execute\u script
,使其独立于浏览器。虽然每次加载一个新页面时都必须这样做,但它不会考虑已经在运行的请求。这样做对我很有效,我手动将JS注入DOM和
XMLHttpRequest.active
,这给了我活动调用的数量-瞧:)