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

