如何在selenium中获取请求/响应日志?我有一个返回登录信息的ajax调用,每当我尝试通过以下方式捕获它时:
selenium.captureNetworkTraffic("json");
它只返回客户端项(如图像.pn),但不返回我感兴趣的实际JSON响应。
答案 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"
}
};