C# Selenium3如何快速检测Chromium Edge浏览器是否已关闭?
C# Selenium3 快速检测Chromium Edge浏览器关闭的实现方案
问题根因
原有实现延迟高的核心原因是Selenium3默认的WebDriver命令超时为5秒,当浏览器关闭后,CurrentWindowHandle请求会等待到超时才抛出异常,所以会出现4秒以上的等待时间。
方案1:临时调整命令超时(改造成本最低)
该方案仅需调整原有判断逻辑,不需要额外引入其他依赖,检测耗时可降低到100ms以内:
public bool IsOpen { get { if (_isDisposed || _webDriver == null) return false; // 保存原有命令超时配置,避免影响后续Selenium操作 var originalTimeout = _webDriver.Manage().Timeouts().CommandTimeout; try { // 临时将超时设置为100ms,大幅缩短等待时间 _webDriver.Manage().Timeouts().CommandTimeout = TimeSpan.FromMilliseconds(100); _ = _webDriver.CurrentWindowHandle; return true; } catch { return false; } finally { // 无论检测是否成功,都恢复原有超时配置 if (!_isDisposed && _webDriver != null) { _webDriver.Manage().Timeouts().CommandTimeout = originalTimeout; } } } }
方案2:关联浏览器进程检测(延迟最低)
直接通过系统进程状态判断浏览器是否关闭,检测延迟几乎为0,适合对性能要求极高的场景:
首先在初始化WebDriver时记录你启动的Edge浏览器进程:
// 类成员变量,存储对应Edge浏览器进程 private Process _targetEdgeProcess; // 初始化EdgeDriver时的逻辑 var preEdgeProcessIds = Process.GetProcessesByName("msedge") .Select(p => p.Id) .ToHashSet(); // 此处替换为你自己的EdgeDriver初始化逻辑 _webDriver = new EdgeDriver(yourEdgeOptions); // 筛选出本次新启动的带主窗口的Edge进程 _targetEdgeProcess = Process.GetProcessesByName("msedge") .FirstOrDefault(p => !preEdgeProcessIds.Contains(p.Id) && p.MainWindowHandle != IntPtr.Zero);
然后改写IsOpen属性:
public bool IsOpen { get { if (_isDisposed || _webDriver == null || _targetEdgeProcess == null) return false; try { return !_targetEdgeProcess.HasExited; } catch { return false; } } }
注意事项
- 方案1的临时超时时间可根据设备性能调整,最低可设置为50ms,避免正常网络波动导致误判。
- 方案2需注意如果用户同时手动打开了其他Edge窗口,需保证筛选进程逻辑的准确性,也可以通过Edge启动参数附加唯一标识来更精准匹配进程。
内容的提问来源于stack exchange,提问作者making
相关产品推荐
相关产品推荐

