如何在Selenium中获取响应头?

时间:2010-08-16 11:05:04

标签: selenium-rc

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

 selenium.captureNetworkTraffic("json");

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

6 个答案:

答案 0 :(得分:9)

不幸的是,看起来你不能以自动方式单独使用selen,因为这是against their design principles for selenium。我不同意它(因为它支持获取cookie信息 - 用户实际经历了什么并通过他们的cookie解析?)。

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

答案 1 :(得分:2)

我意识到这个问题已经过时了,但是我通过修改webdriver.xpi和创建driver.http_logger.variousLogMethods()为firefox + selenium开发了一种方法。如果对此感兴趣,请回复此帖,我可以将代码发布到github。

答案 2 :(得分:2)

如果有人仍在寻找答案,可以使用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);
                });
            }
        });

已使用硒4 alpha 6进行了测试

答案 3 :(得分:1)

您可以通过注入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 :(得分:0)

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

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

var globalVariableForSelenium = "";

在你的硒中你注册了听众:

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设置全局变量

答案 5 :(得分:0)

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

我已经使用Titanium Web Proxy并为以下驱动程序选项注册了代理:

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