如何用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
相关产品推荐
相关产品推荐

