如何用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
相关产品推荐
相关产品推荐

