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

如何用Selenium Java DevTools格式化输出网页请求的状态码、URL及错误信息

解决Cucumber+Selenium DevTools请求信息关联输出问题

核心思路是用**请求ID(requestId)**作为关联键,把每个请求的URL、状态码、错误信息暂存在线程安全的容器中,待请求完成(收到响应或加载失败)时统一输出指定格式。

步骤1:定义请求信息存储类

用普通类封装请求的完整数据:

private static class RequestInfo {
    String url;
    Integer statusCode;
    String failureMessage;

    RequestInfo(String url) {
        this.url = url;
        this.statusCode = null;
        this.failureMessage = "na";
    }
}

步骤2:初始化线程安全的存储容器

在Cucumber的@Before钩子中初始化DevTools和存储容器:

private DevTools devTools;
private final ConcurrentHashMap<String, RequestInfo> requestMap = new ConcurrentHashMap<>();

@Before
public void setupDevTools() {
    ChromeDriver driver = (ChromeDriver) getDriver(); // 替换成你的Driver获取逻辑
    devTools = driver.getDevTools();
    devTools.createSession();

    // 启用Network域
    devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
}

步骤3:关联各事件的请求数据

分别监听Network的三个关键事件,通过requestId关联数据:

// 监听请求发起事件,存入基础URL信息
devTools.addListener(Network.requestWillBeSent(), event -> {
    String requestId = event.getRequestId();
    String url = event.getRequest().getUrl();
    requestMap.put(requestId, new RequestInfo(url));
});

// 监听响应接收事件,更新状态码并输出完整信息
devTools.addListener(Network.responseReceived(), event -> {
    String requestId = event.getRequestId();
    RequestInfo info = requestMap.get(requestId);
    if (info != null) {
        info.statusCode = event.getResponse().getStatus();
        System.out.printf("Status = %d, Request url = %s, Failure = %s%n", 
            info.statusCode, info.url, info.failureMessage);
        requestMap.remove(requestId); // 输出后移除,避免内存占用
    }
});

// 监听请求失败事件,更新错误信息并输出完整信息
devTools.addListener(Network.loadingFailed(), event -> {
    String requestId = event.getRequestId();
    RequestInfo info = requestMap.get(requestId);
    if (info != null) {
        info.failureMessage = event.getErrorText();
        // 失败请求可能没有状态码,这里可设为null或自定义标记
        System.out.printf("Status = %s, Request url = %s, Failure = %s%n", 
            "null", info.url, info.failureMessage);
        requestMap.remove(requestId);
    }
});

关键说明

  • 使用ConcurrentHashMap保证多线程环境下的线程安全(DevTools事件是异步触发的)
  • 每个事件都通过requestId关联到同一个请求记录,确保URL、状态码、错误信息一一对应
  • 输出后从Map中移除记录,避免长时间运行导致内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:10:05