如何用Selenium捕获Chrome的Network XHR完整日志(含请求参数与响应)
解决Selenium捕获Chrome完整Network XHR日志的问题
嘿,我懂你现在的痛点——用LogType.BROWSER只能拿到API请求的基本信息,想要完整的请求参数、响应内容这些核心数据,确实得换个思路才行。默认的浏览器日志根本不是用来抓网络请求详情的,得靠**Chrome DevTools Protocol(CDP)**来实现,Selenium 4已经内置了对CDP的支持,不用额外装依赖,下面直接给你可行的方案:
为什么原来的方法不行?
driver.manage().logs().get(LogType.BROWSER)获取的是浏览器控制台的输出日志,比如console.log()的内容,它和Network面板里的请求响应数据完全是两回事,自然拿不到参数和响应体。
用CDP捕获完整XHR日志的Java代码示例
下面的代码可以帮你捕获请求的方法、请求头、参数,以及响应的状态码、响应头和响应内容:
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v114.network.Network; import java.util.Optional; public class FullNetworkCapture { public static void main(String[] args) { // 如果你没把chromedriver配置到环境变量,就手动指定路径 System.setProperty("webdriver.chrome.driver", "path/to/your/chromedriver"); ChromeOptions options = new ChromeOptions(); // 可选:禁用缓存,避免重复请求影响日志捕获 options.addArguments("--disable-cache"); ChromeDriver driver = new ChromeDriver(options); DevTools devTools = driver.getDevTools(); devTools.createSession(); // 启用Network域,这是捕获网络请求的前提 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 监听请求发送事件,拿到请求的全部细节 devTools.addListener(Network.requestWillBeSent(), requestEvent -> { // 只捕获XHR请求,过滤掉其他类型的请求(比如静态资源) if ("XHR".equals(requestEvent.getType())) { System.out.println("\n===== XHR 请求详情 ====="); System.out.println("请求URL: " + requestEvent.getRequest().getUrl()); System.out.println("请求方法: " + requestEvent.getRequest().getMethod()); System.out.println("请求头: " + requestEvent.getRequest().getHeaders()); // 获取POST请求的参数(GET参数在URL里,可自行解析) requestEvent.getRequest().getPostData().ifPresent(postData -> System.out.println("POST参数: " + postData) ); } }); // 监听响应接收事件,获取响应内容 devTools.addListener(Network.responseReceived(), responseEvent -> { if ("XHR".equals(responseEvent.getType())) { System.out.println("\n===== XHR 响应详情 ====="); System.out.println("响应URL: " + responseEvent.getResponse().getUrl()); System.out.println("响应状态码: " + responseEvent.getResponse().getStatus()); System.out.println("响应头: " + responseEvent.getResponse().getHeaders()); // 调用getResponseBody获取响应体内容 String requestId = responseEvent.getRequestId(); try { Network.GetResponseBodyResponse bodyRes = devTools.send(Network.getResponseBody(requestId)); System.out.println("响应体: " + bodyRes.getBody()); } catch (Exception e) { // 二进制响应(比如图片)可能拿不到内容,这里做异常处理 System.out.println("无法获取响应体: " + e.getMessage()); } } }); // 打开你要测试的页面,触发XHR请求 driver.get("https://your-target-page.com"); // 等待几秒,让页面的XHR请求都完成(根据实际情况调整时长) try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } driver.quit(); } }
关键细节说明
- CDP版本匹配:代码里用的是
v114的Network API,要确保你的Chrome浏览器和ChromeDriver版本一致,不然会出现API不兼容的问题。如果版本不同,把v114改成对应的版本号即可。 - 过滤XHR请求:通过
requestEvent.getType()判断是否为XHR,避免捕获到CSS、图片等静态资源的请求,让日志更干净。 - 响应体获取:响应体不会自动包含在
responseReceived事件里,必须调用Network.getResponseBody()方法主动获取,注意处理二进制响应的异常情况。 - Selenium版本要求:这个方案需要Selenium 4及以上版本,如果你还在使用Selenium 3,建议升级到Selenium 4,或者使用第三方的CDP客户端库。
内容的提问来源于stack exchange,提问作者Suresh Sharma
相关产品推荐
相关产品推荐

