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

如何用Selenium(C#/.NET Core)获取并解析浏览器网络请求

在.NET Core中用Selenium获取浏览器请求详情与状态码

我用.NET Core编写Selenium代码,想要验证浏览器请求的状态码。目前通过以下代码尝试获取网络请求详情,但无法解析返回的对象:

String script = "var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;";
var networkdata = ((IJavaScriptExecutor)_driverHelper.Driver).ExecuteScript(script).ToString();

这段代码返回的是对象类型输出,我需要从中提取请求名称和请求状态值。

我还能通过以下代码获取浏览器控制台的日志:

List<LogEntry> entries = _driverHelper.Driver.Manage().Logs.GetLog(LogType.Browser).ToList();

但不知道如何获取网络标签页的请求详情,尝试过IDevTools但效果不佳。请问有没有办法用Selenium(C#)获取浏览器请求详情?


解决方法

方法1:改进JS脚本,返回可解析的JSON格式

直接返回performance.getEntries()的对象会因为序列化问题无法解析,你可以修改脚本将结果转为JSON字符串,再在C#中反序列化为实体类:

步骤1:修改JS脚本

var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};
// 只获取资源类请求,过滤无关条目
var networkEntries = performance.getEntriesByType('resource') || [];
// 提取需要的核心字段
var filteredEntries = networkEntries.map(entry => ({
    name: entry.name,
    status: entry.responseStatus || 'N/A',
    initiatorType: entry.initiatorType,
    duration: entry.duration
}));
return JSON.stringify(filteredEntries);

步骤2:C#端解析JSON

先定义对应实体类:

public class PerformanceEntry
{
    public string Name { get; set; }
    public string Status { get; set; }
    public string InitiatorType { get; set; }
    public double Duration { get; set; }
}

然后执行脚本并解析:

var script = @"var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var networkEntries = performance.getEntriesByType('resource') || []; var filteredEntries = networkEntries.map(entry => ({name: entry.name, status: entry.responseStatus || 'N/A', initiatorType: entry.initiatorType, duration: entry.duration})); return JSON.stringify(filteredEntries);";
var jsonResult = ((IJavaScriptExecutor)_driverHelper.Driver).ExecuteScript(script) as string;
var performanceEntries = System.Text.Json.JsonSerializer.Deserialize<List<PerformanceEntry>>(jsonResult);

// 遍历输出结果
foreach (var entry in performanceEntries)
{
    Console.WriteLine($"请求地址:{entry.Name},状态码:{entry.Status}");
}

注意:该方法只能捕获页面加载完成后的静态资源请求,动态加载的资源需要在触发操作后重新执行脚本获取。

方法2:使用Selenium DevTools API(推荐)

如果需要捕获所有动态请求、完整状态码,DevTools API是更可靠的方案:

步骤1:初始化DevTools会话

var devTools = _driverHelper.Driver as IDevTools;
var session = devTools.CreateDevToolsSession();
session.Network.Enable(new OpenQA.Selenium.DevTools.V125.Network.EnableCommandSettings());

步骤2:监听网络响应事件

List<OpenQA.Selenium.DevTools.V125.Network.ResponseReceivedEventArgs> responseList = new List<OpenQA.Selenium.DevTools.V125.Network.ResponseReceivedEventArgs>();

session.Network.ResponseReceived += (sender, e) =>
{
    responseList.Add(e);
    // 实时打印请求信息
    Console.WriteLine($"请求URL:{e.Response.Url},状态码:{e.Response.Status}");
};

步骤3:执行操作并获取结果

触发页面请求(比如跳转、点击按钮)后,即可从responseList中获取所有响应详情:

_driverHelper.Driver.Navigate().GoToUrl("https://example.com");

// 遍历所有响应记录
foreach (var response in responseList)
{
    Console.WriteLine($"URL: {response.Response.Url}, 状态码: {response.Response.Status}, 资源类型: {response.Response.MimeType}");
}

注意:

  • 确保浏览器版本与Selenium WebDriver版本匹配,否则DevTools可能无法正常工作
  • 使用完成后记得关闭会话:session.Dispose();

方法3:启用浏览器性能日志(有限支持)

部分浏览器可通过配置日志选项捕获网络日志,但信息格式较零散:

var options = new ChromeOptions();
options.SetLoggingPreference(LogType.Performance, LogLevel.All);
var driver = new ChromeDriver(options);

// 执行页面操作后获取日志
var performanceLogs = driver.Manage().Logs.GetLog(LogType.Performance);
foreach (var log in performanceLogs)
{
    var logJson = System.Text.Json.JsonDocument.Parse(log.Message);
    Console.WriteLine(logJson.RootElement.GetProperty("message").GetProperty("params").ToString());
}

内容的提问来源于stack exchange,提问作者Dinesh babu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:55:22