使用C#捕获Edge DevTools网络响应时遇WebSocket会话创建错误
解决Selenium 4.6.0中Edge DevTools会话创建失败的问题
问题重现
使用C# + .NET 6 + Selenium.WebDriver 4.6.0,在调用OpenQA.Selenium.DevTools.IDevToolsSession session = devTools.GetDevToolsSession();时,触发以下错误:
OpenQA.Selenium.WebDriverException: 'Unexpected error creating WebSocket DevTools session.'NullReferenceException: Object reference not set to an instance of an object.
核心解决方案
1. 强制匹配Edge浏览器与EdgeDriver版本
Selenium 4.x自带的EdgeDriver版本必须和本地安装的Edge浏览器主版本完全一致(比如Edge 118.x对应EdgeDriver 118.x)。版本不匹配是触发WebSocket会话创建失败的最常见原因。
2. 正确初始化DevTools会话
不能直接调用GetDevToolsSession(),必须先通过CreateDevToolsSession()完成会话初始化,否则会返回null导致空引用异常。完整初始化代码如下:
using OpenQA.Selenium; using OpenQA.Selenium.Edge; using OpenQA.Selenium.DevTools; // 初始化EdgeDriver var edgeOptions = new EdgeOptions(); edgeOptions.AddArgument("--start-maximized"); IWebDriver driver = new EdgeDriver(edgeOptions); // 转换为IDevTools接口 IDevTools devTools = driver as IDevTools; if (devTools == null) { throw new InvalidOperationException("当前EdgeDriver不支持DevTools协议"); } // 先创建会话,再获取会话实例 devTools.CreateDevToolsSession(); IDevToolsSession session = devTools.GetDevToolsSession();
3. 完整捕获网络响应的示例代码
结合登录操作,监听网络响应的完整实现:
using OpenQA.Selenium.DevTools.V118.Network; // 注意版本要和Edge匹配 // 启用网络监听 await session.Network.Enable(new EnableCommandSettings()); // 绑定响应接收事件 session.Network.ResponseReceived += (sender, args) => { Console.WriteLine($"请求URL: {args.Response.Url}"); Console.WriteLine($"状态码: {args.Response.Status}"); Console.WriteLine($"响应类型: {args.Response.MimeType}"); // 如需获取响应体,调用GetResponseBody方法 var responseBodyTask = session.Network.GetResponseBody(new GetResponseBodyCommandSettings { RequestId = args.RequestId }); responseBodyTask.Wait(); Console.WriteLine($"响应体预览: {responseBodyTask.Result.Body.Substring(0, 500)}"); }; // 执行登录操作 driver.Navigate().GoToUrl("https://your-login-page.com"); driver.FindElement(By.Id("username")).SendKeys("your-username"); driver.FindElement(By.Id("password")).SendKeys("your-password"); driver.FindElement(By.Id("login-btn")).Click(); // 触发目标网络请求 driver.Navigate().GoToUrl("https://target-page.com"); // 等待请求完成 System.Threading.Thread.Sleep(8000); // 清理资源 session.Dispose(); driver.Quit();
4. 手动指定DevTools协议版本
如果自动匹配失败,可手动指定与Edge版本对应的协议版本:
var devToolsOptions = new DevToolsOptions(); devToolsOptions.BrowserVersion = "118"; // 替换为你的Edge浏览器版本 IDevToolsSession session = devTools.GetDevToolsSession(devToolsOptions);
空引用异常排查要点
- 确认
driver实例初始化成功,未抛出异常 - 检查
driver as IDevTools转换结果不为null,旧版EdgeDriver可能不支持DevTools协议 - 必须在
GetDevToolsSession()前调用CreateDevToolsSession()
内容的提问来源于stack exchange,提问作者sriram srinivasan
相关产品推荐
相关产品推荐

