【问题标题】:Get count of network calls happening in a web page获取网页中发生的网络调用计数
【发布时间】:2018-08-09 10:40:27
【问题描述】:

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

所以我在这里尝试获取当前在后台发生的网络调用的数量并等待它为零。

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

【问题讨论】:

    标签: javascript selenium selenium-webdriver


    【解决方案1】:

    这是一个使用 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)
    

    【讨论】:

    • 我们可以让它独立于浏览器吗?因为我的测试可能会根据需要在不同的浏览器上运行。
    • 您可以使用execute_script 注入JavaScript,使其独立于浏览器。虽然每次加载新页面时都必须这样做,但它不会考虑已经运行的请求。
    • 这样对我有用,我手动将 JS 注入 DOM 并查询 XMLHttpRequest.active,这给了我活跃的通话 - 瞧 :)
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多