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

如何在C#版Selenium 4中捕获特定网络响应后停止程序

可以实现,以下是具体修改方案

完全可以实现这个需求,核心是把固定次数的循环改成无限循环,并在网络响应回调中加入目标字符串的检查逻辑,一旦匹配成功就终止流程。

修改后的完整代码

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.DevTools;
using OpenQA.Selenium.DevTools.V113.Network;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var opt = new ChromeOptions();
        opt.AddArgument("--headless");
        opt.AddArgument("--log-level=3");
        
        using var driver = new ChromeDriver(opt);
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
        
        var devTools = (IDevTools)driver;
        var session = devTools.GetDevToolsSession();
        var domains = session.GetVersionSpecificDomains<V113.DevToolsSessionDomains>();
        
        var tcs = new TaskCompletionSource<bool>();
        domains.Network.ResponseReceived += async (sender, e) => await ResponseReceivedHandler(domains, e, tcs);
        
        await domains.Network.Enable(new EnableCommandSettings());
        
        int pageIndex = 1;
        while (!tcs.Task.IsCompleted)
        {
            Console.WriteLine($"加载页面 {pageIndex}");
            driver.Navigate().GoToUrl($"url/?page={pageIndex}");
            
            // 等待10秒,或者直到找到目标响应(以先发生的为准)
            await Task.WhenAny(tcs.Task, Task.Delay(10000));
            
            pageIndex++;
        }
        
        driver.Quit();
        Console.WriteLine("已捕获目标响应,浏览器退出");
    }

    static async Task ResponseReceivedHandler(V113.DevToolsSessionDomains domains, ResponseReceivedEventArgs e, TaskCompletionSource<bool> tcs)
    {
        // 可选:过滤只监控特定请求,减少不必要的检查
        if (!e.Response.Url.Contains("你要监控的请求关键词"))
            return;
            
        try
        {
            // 获取响应体内容
            var responseBody = await domains.Network.GetResponseBody(new GetResponseBodyCommandSettings
            {
                RequestId = e.RequestId
            });
            
            // 检查响应体是否包含目标字符串
            if (responseBody.Body.Contains("你的特定目标字符串"))
            {
                Console.WriteLine($"找到目标响应:{e.Response.Url}");
                tcs.SetResult(true);
            }
        }
        catch (Exception ex)
        {
            // 忽略无法获取响应体的请求(如图片、静态资源)
            Console.WriteLine($"获取响应体出错:{ex.Message}");
        }
    }
}

关键改动说明

  • 无限循环替代固定循环:用while (!tcs.Task.IsCompleted)替代原for循环,只要没找到目标就持续加载下一页
  • 响应内容检查:在ResponseReceivedHandler中通过GetResponseBody获取响应文本,判断是否包含目标字符串,匹配后通过TaskCompletionSource触发循环终止
  • 非阻塞等待:用Task.WhenAny同时等待目标响应和10秒延迟,一旦找到目标立刻停止等待,不用浪费剩余时间
  • 资源自动清理:用using包裹ChromeDriver,确保程序退出时自动释放浏览器资源

注意事项

  • 请替换代码中的"你要监控的请求关键词"和"你的特定目标字符串"为实际需求的内容
  • 如果不需要过滤请求,可以直接去掉请求URL的判断逻辑
  • 部分静态资源(如图片、字体)可能无法获取响应体,异常处理会自动忽略这类情况

内容的提问来源于stack exchange,提问作者José Soares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:23:26