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

如何使用C#基于Selenium 4 BiDi监听浏览器console.log事件?

问题原因

await monitor.StartEventMonitoring()会阻塞后续代码执行,是因为该方法是一个长期运行的异步任务,作用是维持Selenium和浏览器之间的BiDi长连接,持续接收浏览器抛出的各类事件,本身不会主动终止,直接await会等待任务结束才继续执行后续逻辑,所以出现卡死的情况。

正确集成方案

第一步:开启浏览器BiDi支持

初始化Driver前需要先在选项中开启BiDi功能,否则监听无法正常工作:

var chromeOptions = new ChromeOptions();
// 启用BiDi协议支持,为必填配置
chromeOptions.EnableBiDi = true;
var driver = new ChromeDriver(chromeOptions);

第二步:后台运行监听任务

不要直接await监听启动方法,将其放到后台任务中运行即可不阻塞主线程的Selenium操作:

List<string> consoleMessages = new List<string>();
IJavaScriptEngine monitor = new JavaScriptEngine(driver);
// 注册console事件回调
monitor.JavaScriptConsoleApiCalled += (sender, e) =>
{
    consoleMessages.Add(e.MessageContent);
};

// 将监听任务放到后台运行,不阻塞主线程操作
var runMonitorTask = Task.Run(async () =>
{
    await monitor.StartEventMonitoring();
});

// 此处可以正常执行原有Selenium逻辑,不会被阻塞
someButton.Click();
int messageCount = consoleMessages.Count;

// 所有操作完成后,主动停止监听释放资源
await monitor.StopEventMonitoring();
// 等待监听任务正常退出
await runMonitorTask;
补充说明
  • 原有旧版Chrome日志采集是拉模式,需要主动调用GetLog才能拿到历史日志;BiDi方案是推模式,浏览器产生console日志的瞬间就会触发回调写入你定义的列表,实时性更高
  • 如果你的调用环境不支持async/await,也可以在启动监听时加.ConfigureAwait(false),但更推荐上面的写法,方便后续资源释放,避免内存泄漏

内容的提问来源于stack exchange,提问作者Fractal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:09