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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:57:38