如何通过Selenium C#获取Chrome DevTools日志及页面传输大小
使用Selenium C#获取页面传输大小
问题背景
需要获取Chrome DevTools网络面板中页面的总传输大小,计划通过Chrome DevTools协议的Network.dataReceived属性实现。当前环境为Chrome 105、Selenium WebDriver 4.0.0(C#),现有代码能输出performance日志,但无法像旧版Java代码那样解析出传输大小,同时怀疑driver.Manage().Logs.GetLog("performance")是否能捕获所需的Network事件。
现有C#代码:
using OpenQA.Selenium.Chrome; using OpenQA.Selenium; ChromeOptions options = new ChromeOptions(); //Following Logging preference helps in enabling the performance logs options.SetLoggingPreference("performance", LogLevel.All); //Based on your need you can change the following options options.AddUserProfilePreference("intl.accept_languages", "en-US"); options.AddUserProfilePreference("disable-popup-blocking", "true"); options.AddArgument("test-type"); options.AddArgument("--disable-gpu"); options.AddArgument("no-sandbox"); options.AddArgument("start-maximized"); options.LeaveBrowserRunning = true; //Creating Chrome driver instance IWebDriver driver = new ChromeDriver(options); var url = " https://..............."; driver.Navigate().GoToUrl(url); //Extracting the performance logs var logs = driver.Manage().Logs.GetLog("performance"); for (int i = 0; i < logs.Count; i++) { Console.WriteLine((i+1) + " - " + logs[i].Message); }
参考的旧版Java代码:
for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) { if(entry.getMessage().contains("Network.dataReceived")) { Matcher dataLengthMatcher = Pattern.compile("encodedDataLength\":(.*?),").matcher(entry.getMessage()); dataLengthMatcher.find(); }
解决方案
1. 确认日志配置有效性
你的SetLoggingPreference("performance", LogLevel.All)配置是正确的,Selenium 4.x配合Chrome 105确实可以通过performance日志捕获Chrome DevTools的Network事件。需要注意:
- 必须在创建
ChromeDriver实例前设置好日志偏好,否则不会生效 - 页面加载完成后再获取日志,确保所有Network事件都已捕获
2. C#代码实现解析传输大小
日志的Message是JSON格式字符串,我们可以用JSON库(比如System.Text.Json)解析事件内容,提取Network.dataReceived中的encodedDataLength并累加得到总传输大小。
完整代码示例(使用System.Text.Json)
using OpenQA.Selenium.Chrome; using OpenQA.Selenium; using System.Text.Json; using System.Text.Json.Nodes; // 配置Chrome选项 ChromeOptions options = new ChromeOptions(); options.SetLoggingPreference("performance", LogLevel.All); options.AddUserProfilePreference("intl.accept_languages", "en-US"); options.AddUserProfilePreference("disable-popup-blocking", "true"); options.AddArgument("--disable-gpu"); options.AddArgument("no-sandbox"); options.AddArgument("start-maximized"); options.LeaveBrowserRunning = true; // 初始化驱动 using IWebDriver driver = new ChromeDriver(options); // 访问目标页面 var url = "https://example.com"; driver.Navigate().GoToUrl(url); // 等待页面完全加载(可根据实际情况调整等待逻辑) System.Threading.Thread.Sleep(3000); // 获取performance日志 var logs = driver.Manage().Logs.GetLog("performance"); long totalTransferredSize = 0; foreach (var logEntry in logs) { // 解析日志消息为JSON var jsonNode = JsonNode.Parse(logEntry.Message); if (jsonNode == null) continue; // 获取事件名称 string? method = jsonNode["message"]["method"]?.GetValue<string>(); if (method != "Network.dataReceived") continue; // 提取encodedDataLength并累加 long encodedLength = jsonNode["message"]["params"]["encodedDataLength"]?.GetValue<long>() ?? 0; totalTransferredSize += encodedLength; } Console.WriteLine($"页面总传输大小:{totalTransferredSize} 字节");
说明
- 使用
System.Text.Json解析日志内容,避免正则匹配的不稳定性 - 通过判断
method是否为Network.dataReceived筛选目标事件 - 累加所有
encodedDataLength值,得到页面加载过程中所有资源的总传输大小(对应Chrome DevTools网络面板的“传输大小”总和) - 页面加载后的等待时间可根据页面复杂度调整,或使用显式等待(如等待某个元素加载完成)替代
Thread.Sleep
3. 替代方案:直接使用Chrome DevTools协议(Selenium 4+支持)
Selenium 4原生支持与Chrome DevTools协议交互,可直接订阅Network.dataReceived事件实时获取数据:
using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V105.Network; // 初始化驱动和DevTools会话 using ChromeDriver driver = new ChromeDriver(options); DevToolsSession devTools = driver.CreateDevToolsSession(); // 启用Network域 var enableCommand = new EnableCommandSettings(); await devTools.SendCommand(enableCommand); long totalSize = 0; // 订阅Network.dataReceived事件 devTools.Network.DataReceived += (sender, e) => { totalSize += e.EncodedDataLength; }; // 访问页面 driver.Navigate().GoToUrl(url); // 等待页面加载完成 System.Threading.Thread.Sleep(3000); Console.WriteLine($"页面总传输大小:{totalSize} 字节");
该方案更直接,无需解析日志,通过DevTools会话直接监听事件,适合Selenium 4及以上版本。
内容的提问来源于stack exchange,提问作者ozziem
相关产品推荐
相关产品推荐

