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

