Selenium C# 测试结束后捕获Chrome网络错误及完整响应日志方案咨询
C# Selenium测试执行后网络错误检测方案问题
问题背景
我在C#环境下寻找Selenium测试执行后检查网络错误的方案,但现有方案均无法落地:要么存在无法导入的缺失对象,要么对象已被弃用(例如DesiredCapabilities)。
核心需求
我需要在测试执行完成后的tear down阶段,检查测试运行过程中是否出现网络异常,若存在异常则通过Assert.Fail抛出对应错误信息,标记测试失败。当前核心问题是无法获取到所需的完整日志内容,以下是我已尝试的方案:
方案1
ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.SetLoggingPreference("performance", LogLevel.All);
var logs = driver.Manage().Logs.GetLog("performance");
该方案可正常运行,但仅能提示存在错误,无法展示具体错误详情。
方案2
基于方案1修改日志获取类型:
var logs = driver.Manage().Logs.GetLog(LogType.Browser);
该方案仅能返回单条日志,无法获取测试执行全流程的所有日志。
方案3
采用Selenium 4请求拦截方案,但存在对象访问权限问题无法运行。
方案4
尝试通过HttpWebRequest捕获原始请求的非Selenium原生方案,实测不可用。
方案5
参考Chrome DevTools示例及.Net相关实现,在测试中接入DevTools捕获网络响应:
IDevTools devTools = driver as IDevTools; DevToolsSession session = devTools.CreateDevToolsSession(); session.Network.ResponseReceived += ResponseReceivedHandler; session.Network.Enable(new EnableCommandSettings()); driver.Navigate().GoToUrl("https://google.com");
配套响应处理方法:
public static void ResponseReceivedHandler(object sender, ResponseReceivedEventArgs e) { Debug.WriteLine($"Url: { e.Response.Url } Status: { e.Response.Status } Type: { e.Response.MimeType } "); }
目前我已能获取到e.Response.StatusText状态信息和状态码,但无法获取到浏览器Network面板中对应请求Preview标签页下的msg对象内容。
解决方案
你已经走对了方向,基于Selenium 4的Chrome DevTools协议方案可以完整满足需求,只要补充响应体获取逻辑即可:
- 首先定义全局容器存储异常网络请求信息,保证teardown阶段可以统一读取:
// 测试类全局变量,存储所有异常请求详情 public static List<NetworkErrorInfo> NetworkErrors = new List<NetworkErrorInfo>(); // 自定义实体类存储错误信息 public class NetworkErrorInfo { public string Url { get; set; } public int StatusCode { get; set; } public string StatusText { get; set; } public string ResponseBody { get; set; } }
- 修改
ResponseReceivedHandler,补充响应体读取逻辑,注意要同步等待CDP返回结果,避免异步丢失数据:
public async void ResponseReceivedHandler(object sender, ResponseReceivedEventArgs e) { // 过滤非错误状态码,可根据需求调整阈值(比如400以上都算异常) if (e.Response.Status >= 400) { var errorInfo = new NetworkErrorInfo { Url = e.Response.Url, StatusCode = e.Response.Status, StatusText = e.Response.StatusText }; try { // 调用CDP接口获取响应体内容 var responseBody = await session.Network.GetResponseBody(new GetResponseBodyCommandSettings { RequestId = e.RequestId }); // responseBody.Base64Encoded为true时是二进制资源,不需要解析内容 if (!responseBody.Base64Encoded) { errorInfo.ResponseBody = responseBody.Body; // 如果你要提取JSON返回里的msg字段,直接反序列化即可 // 示例:var jsonObj = JsonSerializer.Deserialize<JsonElement>(responseBody.Body); // var msg = jsonObj.GetProperty("msg").GetString(); } } catch { // 部分跨域、预请求、二进制资源无法读取响应体,跳过即可 errorInfo.ResponseBody = "无法读取响应体内容"; } NetworkErrors.Add(errorInfo); } }
- 在Teardown阶段统一校验网络错误:
[TearDown] public void TearDown() { if (NetworkErrors.Any()) { var errorMsg = string.Join("\n", NetworkErrors.Select(err => $"请求地址:{err.Url},状态码:{err.StatusCode},错误信息:{err.StatusText},响应详情:{err.ResponseBody}")); int errorCount = NetworkErrors.Count; NetworkErrors.Clear(); Assert.Fail($"测试过程中检测到{errorCount}个网络异常:\n{errorMsg}"); } driver.Quit(); }
兼容性说明
该方案原生支持所有Chromium内核浏览器(Chrome、Edge、Opera等),无需额外修改。Firefox目前也支持DevTools协议,仅需替换浏览器驱动初始化逻辑即可通用。
内容的提问来源于stack exchange,提问作者Schmebi
相关产品推荐
相关产品推荐

