【问题标题】:How do I get the response headers in Selenium?如何在 Selenium 中获取响应标头?
【发布时间】:2011-03-30 09:12:47
【问题描述】:

如何在 selenium 中获取请求/响应日志?我有一个返回登录信息的 ajax 调用,每当我尝试通过以下方式捕获它时:

 selenium.captureNetworkTraffic("json");

它只返回客户端项目(如图像 .pn),而不是我感兴趣的实际 JSON 响应。

【问题讨论】:

  • 任何人都可以帮助我,我认为 selenium 显然应该在内部进行点击并做出响应??没人试过吗??

标签: selenium-rc


【解决方案1】:

如果有人仍在寻找答案,可以使用 Selenium 4 和 Chrome 开发者工具 API 获取响应标头

DevTools devTools = driver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
devTools.addListener(Network.responseReceived(),
        responseReceived -> {
            Headers headers = responseReceived.getResponse().getHeaders();
            if (!headers.isEmpty()){
                System.out.println("Headers:");
                headers.forEach((key,value) -> {
                    System.out.println("    " + key + "="+ value);
                });
            }
        });

这是使用 Selenium 4 alpha 6 测试的

【讨论】:

    【解决方案2】:

    如果您正在寻找其他方式的解决方案,也可以使用代理服务器来完成,该服务器将输出日志文件,包括通过代理的每个请求/响应的标头。

    我使用了Titanium Web Proxy 并为这样的驱动程序选项注册了代理:

    ChromeOptions chromeOptions = new ChromeOptions
    {
        Proxy = new Proxy
        {
            Kind = ProxyKind.Manual,
            HttpProxy = "localhost:8888"
        }
    };
    

    【讨论】:

    • 我投了赞成票,我没有检查它是否真的有效。但我认为这个想法仍然值得一票。
    【解决方案3】:

    你可以通过注入一个 XMLHttpRequest 并等待结果来做到这一点:

    Object response = ((JavascriptExecutor) driver).executeAsyncScript(
           "var callback = arguments[arguments.length - 1];" +
           "var xhr = new XMLHttpRequest();" +
           "xhr.open('GET', '/resource/data.json', true);" +
           "xhr.onreadystatechange = function() {" +
           "  if (xhr.readyState == 4) {" +
           "    callback(xhr.getResponseHeader());" +
           "  }" +
           "};" +
           "xhr.send();");
       JsonObject json = new JsonParser().parse((String) response);
       assertEquals("cheese", json.get("food").getAsString());
    

    你可以修改xhr回调来得到你想要的。

    【讨论】:

      【解决方案4】:

      我意识到这个问题已经过时了,但我已经通过修改 webdriver.xpi 并创建 driver.http_logger.variousLogMethods() 为 firefox + selenium 开发了一种方法。有兴趣请回复本帖,我可以把代码发到github上。

      【讨论】:

      • 我很感兴趣。请发布github链接。
      • @user2426679 我也有兴趣,你能在 Github 上告诉我如何执行这个吗?
      • @David542 -- 我终于有时间上传这个小项目了。我前一阵子做过,所以文档很少。 bitbucket.org/stbrownlow/seleniumwithfirefoxhttplogging/src
      • 有趣。有没有人能够让它在较新版本的 FF 上工作?
      • @FlyingZebra1 如果不重写webdriver.xpi 中的补丁,它将无法工作。请参阅 BitBucket 中的自述文件以查找我对 .xpi selenium 扩展名所做的编辑,作为移植到更新版本 Firefox 的起点。
      【解决方案5】:

      我发现了一个技巧,如果你使用 jquery,你可以注册一个全局监听器:

      首先你需要在你的主脚本中声明一个全局变量:

      var globalVariableForSelenium = "";
      

      在你的 selenium 中注册监听器:

      if (driver instanceof JavascriptExecutor) {
                      ((JavascriptExecutor) driver)
                      .executeScript("$(document).ajaxSuccess(function(event, xhr, settings) {  globalVariableForSelenium = settings.headers    });");
                  }
      

      然后你执行你的动作

      最后你得到了全局变量的值:

      if (driver instanceof JavascriptExecutor) {
                  Object res = ((JavascriptExecutor) driver)
                  .executeScript("return  serializeGlobalvariable();");
      
      }
      

      serializeGlobalvariable() 是一个函数,它将序列化 globalVariableForSelenium,其中包含一个标头数组。

      ps:我需要访问 ajax 响应,所以我用 xhr.responseJSON.mypath 设置了全局变量

      【讨论】:

        【解决方案6】:

        不幸的是,您似乎无法以自动化方式单独使用 selenium,因为这是 against their design principles for selenium。我不同意它是(因为它支持获取 cookie 信息——用户实际通过并解析他们的 cookie?)。

        他们的 'schtick' 是 selenium 可以帮助您自动化用户所做的事情;既然用户不关心响应头,为什么要这个框架呢?对我来说,这令人失望,因为我需要确保返回的内容类型是我认为应该是的(测试 API)。看来another Stack Overflow question 也得出了类似的结论。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-28
          • 2013-06-19
          • 2016-09-21
          • 2013-03-01
          • 1970-01-01
          • 2016-07-25
          • 1970-01-01
          • 2015-11-15
          相关资源
          最近更新 更多