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

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协议方案可以完整满足需求,只要补充响应体获取逻辑即可:

  1. 首先定义全局容器存储异常网络请求信息,保证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; }
}
  1. 修改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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:57:04