如何使用Selenium CDP等待指定请求完成(Java实现)
用CDP实现Selenium等待指定请求完成(Java版)
核心思路
通过Chrome DevTools Protocol(CDP)监听网络请求的生命周期,筛选出目标请求,等待其返回指定状态码(如200)后再执行后续操作,避免因请求未完成导致的测试失败。
具体实现步骤
1. 初始化CDP连接
先获取ChromeDriver的CDP会话,启用网络监听:
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v125.network.Network; import org.openqa.selenium.By; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class WaitForTargetRequest { public static void main(String[] args) { ChromeDriver driver = new ChromeDriver(); DevTools devTools = driver.getDevTools(); devTools.createSession(); // 启用网络监控 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
2. 配置请求筛选与等待触发机制
用CountDownLatch实现阻塞等待,当匹配到目标请求且返回指定状态码时,触发计数减少完成等待:
// 定义目标请求的URL标识(可替换为实际接口特征,比如完整URL、包含特定路径) String targetUrlKeyword = "/api/get-data"; CountDownLatch requestLatch = new CountDownLatch(1); // 添加请求完成监听事件 devTools.addListener(Network.responseReceived(), response -> { Network.ResponseReceivedParams params = response.getParams(); String requestUrl = params.getResponse().getUrl(); int statusCode = params.getResponse().getStatus(); // 筛选目标请求且状态码为200 if (requestUrl.contains(targetUrlKeyword) && statusCode == 200) { requestLatch.countDown(); System.out.println("目标请求已成功响应:" + requestUrl); } });
3. 执行操作并等待请求完成
点击元素后,阻塞等待目标请求完成,超时时间可按需调整:
// 执行触发请求的操作(比如点击logo) driver.findElement(By.cssSelector(".site-logo")).click(); // 等待目标请求完成,超时设置为10秒 try { boolean isRequestDone = requestLatch.await(10, TimeUnit.SECONDS); if (!isRequestDone) { throw new RuntimeException("目标请求超时未完成"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException("等待请求时被中断", e); } // 后续操作:验证数据加载结果 // driver.findElement(By.cssSelector(".data-content")).isDisplayed(); driver.quit(); } }
注意事项
- 确保ChromeDriver版本与CDP版本匹配,避免兼容性问题
- 可根据需求调整筛选规则,比如匹配完整URL、请求方法(GET/POST)、请求头参数等
- 若需等待多个请求,可修改
CountDownLatch的初始计数(比如计数为2表示等待两个目标请求) - 超时时间需根据实际接口响应速度合理设置
内容的提问来源于stack exchange,提问作者Karcel
相关产品推荐
相关产品推荐

