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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:54:26