You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webdriver BiDi替代DevTools:如何获取请求与响应体?

Webdriver BiDi 获取请求与响应体方案

Webdriver BiDi 完全支持通过BeforeRequestSent获取请求体、通过ResponseReceived(对应你提到的ResponseDetails)获取响应体,不过得注意API的正确用法,你给出的示例代码存在异步处理的问题,下面是具体说明和修正方案:

请求体获取(BeforeRequestSent事件)

  • BeforeRequestSent事件本身不会主动返回完整请求体,你示例里调用的getBody()、getRequest().getRequestBody()基本都会返回null——这些字段仅在极小体积的POST请求中可能被附带,且不同语言绑定的实现逻辑有差异。
  • 正确的做法是调用network.getRequestBody(requestId)方法,但这个方法是异步的,直接打印会得到Future对象而非实际内容,需要等待异步结果返回。

修正后的Java示例代码:

network.onBeforeRequestSent(request -> {           
    // 异步获取请求体
    CompletableFuture<RequestBody> bodyFuture = network.getRequestBody(request.getRequest().getRequestId());
    // 同步等待结果(也可用thenAccept做异步处理)
    RequestBody requestBody = bodyFuture.join();
    
    if (requestBody != null) {
        // 处理文本格式的请求体(如JSON、表单)
        if (requestBody.getText() != null) {
            System.out.println("请求体文本:" + requestBody.getText());
        }
        // 处理二进制格式的请求体(如文件上传)
        if (requestBody.getBytes() != null) {
            System.out.println("请求体字节序列:" + Arrays.toString(requestBody.getBytes()));
        }
    }
});

响应体获取(ResponseReceived事件)

  • 和请求体逻辑类似,ResponseReceived事件不会直接携带响应体,必须调用network.getResponseBody(requestId)来拉取内容。

Java示例代码:

network.onResponseReceived(response -> {
    CompletableFuture<ResponseBody> bodyFuture = network.getResponseBody(response.getResponse().getRequestId());
    ResponseBody responseBody = bodyFuture.join();
    
    if (responseBody != null) {
        // 处理文本格式响应体
        if (responseBody.getText() != null) {
            System.out.println("响应体文本:" + responseBody.getText());
        }
        // 处理二进制格式响应体(如图片、压缩包)
        if (responseBody.getBytes() != null) {
            System.out.println("响应体字节序列:" + Arrays.toString(responseBody.getBytes()));
        }
    }
});

关键注意事项

  1. BiDi API启用前提:确保你的浏览器版本支持(Chrome 102+、Firefox 115+),初始化Driver时要开启BiDi:
ChromeOptions options = new ChromeOptions();
options.addArguments("--enable-bidi");
ChromeDriver driver = new ChromeDriver(options);
// 获取BiDi实例和Network模块
BiDi bidi = driver.getBiDi();
Network network = bidi.getNetwork();
  1. 大体积内容配置:如果需要获取大体积的请求/响应体,要提前通过network.enable()设置不限制大小:
network.enable(new EnableParameters().setMaxResponseBodySize(-1)); // -1表示无限制

内容的提问来源于stack exchange,提问作者bog bogishvili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:35:04