You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中保存Selenium Chrome会话及导出Chrome缓存至指定文件方法求助

我之前刚好折腾过这两个需求,给你分享亲测可行的具体实现步骤,分两部分来说:

一、在C#中保存Selenium Chrome会话

保存Chrome会话的核心是利用Chrome的用户数据目录(User Data Directory)——浏览器的会话信息(登录状态、Cookies、本地存储等)全存在这个目录里。只要启动Chrome时指定同一个目录,就能复用之前的会话。

具体步骤:

  1. 首次启动并保存会话
    先指定一个自定义的用户数据目录,启动浏览器完成登录等操作后,关闭浏览器,会话会自动保存在该目录中:

    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    
    var options = new ChromeOptions();
    // 替换成你想保存会话的本地文件夹路径,提前创建好或者Chrome会自动创建
    options.AddArgument(@"--user-data-dir=C:\MyChromeSavedSession");
    // 可选:指定Profile,默认是Default,也可以自定义名称
    options.AddArgument(@"--profile-directory=Default");
    
    // 启动浏览器,执行登录等操作
    var driver = new ChromeDriver(options);
    driver.Navigate().GoToUrl("https://example.com/login");
    // 这里手动或自动化完成登录流程...
    
    // 关闭浏览器,会话已保存到指定目录
    driver.Quit();
    
  2. 复用已保存的会话
    下次启动时,只需指定同一个用户数据目录,浏览器就会自动加载之前的会话状态:

    var options = new ChromeOptions();
    options.AddArgument(@"--user-data-dir=C:\MyChromeSavedSession");
    options.AddArgument(@"--profile-directory=Default");
    
    var driver = new ChromeDriver(options);
    // 此时浏览器会直接恢复之前的登录状态,无需重新登录
    driver.Navigate().GoToUrl("https://example.com/dashboard");
    

注意事项:

  • 不要同时启动多个使用同一个用户数据目录的Chrome实例,会导致会话冲突。
  • 确保目标目录有读写权限,否则Chrome无法保存会话数据。
  • 如果是在CI/CD环境中使用,记得把用户数据目录加入持久化存储。

二、导出Chrome浏览器缓存至指定文件

Chrome的缓存分为两种存储形式:一是磁盘上的缓存文件夹,二是可通过DevTools协议获取的缓存条目。这里提供两种实现方案:

方案1:直接复制缓存文件夹(简单粗暴)

Chrome的缓存文件默认存在用户数据目录的Default\CacheDefault\Code Cache子目录中,直接复制这些文件夹到指定位置即可完成导出:

using System.IO;

// 源缓存目录(对应你保存会话的用户数据目录)
string sourceCacheDir = @"C:\MyChromeSavedSession\Default\Cache";
string sourceCodeCacheDir = @"C:\MyChromeSavedSession\Default\Code Cache";

// 目标导出目录
string targetExportDir = @"D:\ExportedChromeCache";

// 创建目标目录
Directory.CreateDirectory(targetExportDir);

// 复制普通缓存文件
foreach (string file in Directory.GetFiles(sourceCacheDir))
{
    string destPath = Path.Combine(targetExportDir, Path.GetFileName(file));
    File.Copy(file, destPath, overwrite: true);
}

// 复制代码缓存文件
string targetCodeCacheDir = Path.Combine(targetExportDir, "Code Cache");
Directory.CreateDirectory(targetCodeCacheDir);
foreach (string file in Directory.GetFiles(sourceCodeCacheDir))
{
    string destPath = Path.Combine(targetCodeCacheDir, Path.GetFileName(file));
    File.Copy(file, destPath, overwrite: true);
}

优点:操作简单,能完整导出所有缓存;缺点:缓存文件是Chrome专属格式,只有Chrome能直接识别读取。

方案2:通过DevTools协议导出单个缓存资源(精准可控)

如果你需要导出特定的缓存资源(比如图片、JS文件),可以用Selenium 4支持的Chrome DevTools协议来获取并保存:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.DevTools;
using OpenQA.Selenium.DevTools.V114.Network; // 版本要和你的Chrome对应

var options = new ChromeOptions();
options.AddArgument(@"--user-data-dir=C:\MyChromeSavedSession");
var driver = new ChromeDriver(options);

// 创建DevTools会话
var devTools = driver.CreateDevToolsSession();
// 启用Network域
await devTools.Network.Enable(new EnableCommandSettings());

// 获取所有缓存条目
var cacheResult = await devTools.Network.GetAllCachedEntries();
string exportDir = @"D:\ExportedSpecificCache";
Directory.CreateDirectory(exportDir);

foreach (var entry in cacheResult.CacheEntries)
{
    // 获取缓存内容
    var contentResponse = await devTools.Network.GetCachedResponse(
        new GetCachedResponseCommandSettings { CacheId = entry.CacheId });

    // 生成唯一文件名,避免重复
    string fileName = $"{entry.RequestUrl.GetHashCode()}{Path.GetExtension(new Uri(entry.RequestUrl).AbsolutePath)}";
    string filePath = Path.Combine(exportDir, fileName);

    // 保存到文件
    File.WriteAllBytes(filePath, contentResponse.Body);
}

driver.Quit();

优点:可以精准导出单个资源,文件是可直接打开的格式;缺点:需要Selenium 4及以上版本,且部分系统级缓存可能无法通过DevTools获取。


内容的提问来源于stack exchange,提问作者Ilyas Zahir

火山引擎 最新活动