使用selenium自动化操作本机有缓存数据的chrome

使用selenium自动化操作chrome的时候,怎么控制本机的已经有缓存的,而不是新建一个chrome无痕浏览器

在使用 Selenium 自动化控制 Chrome 时,若想复用本地已有的浏览器缓存(而非新建无痕 / 空白浏览器),核心是让 Selenium 连接到本地已启动的 Chrome 实例(该实例使用默认用户数据目录,包含缓存、登录状态等)。具体步骤如下:

步骤 1:关闭所有 Chrome 进程

确保本地没有运行的 Chrome 浏览器(包括后台进程),否则可能导致端口占用或配置冲突。

步骤 2:用指定端口启动 Chrome

方法1:使用 --profile-directory 参数(推荐)

"D:\Software\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\kamo\AppData\Local\Google\Chrome\User Data" --profile-directory="Profile 3"

手动启动 Chrome 时,通过命令行参数指定一个端口(例如 9527),并强制其使用默认用户数据目录(包含缓存)。

Windows 系统

  1. 打开「运行」(Win + R),输入 cmd 打开命令提示符。

  2. 输入以下命令(需替换 Chrome 安装路径):

    "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data"
    

    方法2:直接指向 User Data 根目录

    "D:\Software\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\kamo\AppData\Local\Google\Chrome\User Data"
    
  • 解释:
    • --remote-debugging-port=9527:开启调试端口,允许 Selenium 连接。
    • --user-data-dir:指定本地 Chrome 的用户数据目录(包含缓存、登录信息等),默认路径通常为上述路径,需替换为你的实际路径(可通过 Chrome 地址栏输入 chrome://version/ 查看「个人资料路径」)。

步骤 3:Selenium 连接到已启动的 Chrome 实例

通过 Selenium 的 ChromeOptions 配置,连接到步骤 2 中启动的 Chrome 端口,代码示例

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置 Chrome 选项,指定调试端口
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")  # 与启动时的端口一致

# 初始化浏览器驱动(无需指定 executable_path,若已配置环境变量)
driver = webdriver.Chrome(options=chrome_options)

# 测试:访问一个需要缓存的页面(例如已登录的网站)
driver.get("https://www.baidu.com")

C#代码

  private async Task InitializeBrowserAsynchromeid()
        {
            if (_isInitialized && driver != null) return;

            await Task.Run(() =>
            {
                lock (_lock)
                {
                    if (_isInitialized && driver != null) return;

                    try
                    {
                        string chromePath = @"D:\Software\Google\Chrome\Application\chrome.exe";
                        string userDataDir = @"C:\Users\kamo\AppData\Local\Google\Chrome\User Data";
                        string profileDir = "Profile 3";
                        int debugPort = 9527;

                        // 1. 构造启动命令
                        string arguments = $"--remote-debugging-port={debugPort} " +
                                           $"--user-data-dir=\"{userDataDir}\" " +
                                           $"--profile-directory=\"{profileDir}\" " +
                                           "--no-first-run " +
                                           "--no-default-browser-check " +
                                           "--disable-extensions";

                        // 2. 启动 Chrome
                        ProcessStartInfo psi = new ProcessStartInfo
                        {
                            FileName = chromePath,
                            Arguments = arguments,
                            UseShellExecute = false,
                            CreateNoWindow = false // 设为 true 可隐藏窗口
                        };

                        Process chromeProcess = Process.Start(psi);
                        UpdateLog("✅ Chrome 启动中...");

                        // 3. 等待 Chrome 启动并监听端口(简单等待,也可增加端口检测)
                        Thread.Sleep(100); // 等待 3 秒(可根据机器调整)
                        // 配置 Chrome 选项,连接到已启动的 Chrome 实例
                        var options = new ChromeOptions();
                        // 关键:指定调试地址(与手动启动时的端口一致,这里是 9527)
                        options.DebuggerAddress = "127.0.0.1:9527";  
                        options.AddArgument("--ignore-certificate-errors");  // 忽略证书错误
                        options.AddArgument("--allow-insecure-localhost");  // 允许不安全本地主机
                                                                            //options.AddArgument("--disable-web-security");      // 禁用同源策略(慎用)
                        // 创建一个不显示命令行窗口的 ChromeDriver 服务
                        var service = ChromeDriverService.CreateDefaultService();
                        service.HideCommandPromptWindow = true; // 关键:隐藏 CMD 窗口
                        driver = new ChromeDriver(service, options);

                        //Rectangle screenSize = Screen.PrimaryScreen.Bounds;
                        //driver.Manage().Window.Size = new System.Drawing.Size(screenSize.Width, screenSize.Height);

                        _isInitialized = true;
                        UpdateLog("浏览器初始化成功");
                    }
                    catch (Exception ex)
                    {
                        UpdateLog($"初始化失败: {ex.Message}");
                        throw;
                    }
                }
            });
        }

关键说明:

  1. 用户数据目录:必须正确指定本地 Chrome 的用户数据路径,否则 Selenium 会新建临时目录(无缓存)。
  2. 端口一致性:启动 Chrome 时的 remote-debugging-port 需与代码中的 debuggerAddress 端口一致(例如均为 9527)。
  3. 驱动版本匹配:确保 ChromeDriver 的版本与本地 Chrome 浏览器版本一致(可通过 chrome://version/ 查看 Chrome 版本,再下载对应 ChromeDriver)。

通过这种方式,Selenium 会直接控制你手动启动的 Chrome 实例,完全复用其缓存、登录状态等本地数据。

如果谷歌登陆了两个账号,那怎么定位uesrdata

当 Chrome 登录了多个账号(即存在多个用户配置文件)时,每个账号会对应一个独立的用户数据子目录。此时需要先确定目标账号的具体用户数据路径,再在启动 Chrome 时指定该路径,才能精准复用对应账号的缓存和状态。

步骤 1:找到多账号对应的用户数据子目录

  1. 打开 Chrome 浏览器,点击右上角的「用户头像」,查看所有登录的账号(例如 “账号 A”“账号 B”)。

  2. 切换到你想自动化控制的目标账号(例如 “账号 A”)。

  3. 在地址栏输入 chrome://version/ 并回车,找到 「个人资料路径」 字段:

    • 示例路径(Windows):C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Profile 1
    • 示例路径(Mac):/Users/你的用户名/Library/Application Support/Google/Chrome/Profile 2

    其中:

    • User Data 是主目录,
    • 后面的 Profile 1(或 Profile 2 等)是具体账号的子目录(默认账号可能叫 Default)。

步骤 2:启动指定账号的 Chrome 实例

关闭所有 Chrome 进程后,通过命令行启动目标账号的 Chrome,重点是指定该账号的子目录路径

# 替换为你的 Chrome 安装路径、目标账号的子目录路径、端口号(如 9527)
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Profile 1"

说明--user-data-dir 直接指向具体账号的子目录(如 Profile 1),而非主目录 User Data,这样就只会加载该账号的缓存和状态。

步骤 3:Selenium 连接到指定账号的实例

代码与之前类似,只需确保端口与启动时一致:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")  # 端口与启动时一致

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.google.com")  # 此时会使用目标账号的登录状态和缓存
"D:\Software\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\kamo\AppData\Local\Google\Chrome\User Data\Profile 3"

排错 遇到的问题

本来运行 chrome://version/  本来是显示的:命令行	"D:\Software\Google\Chrome\Application\chrome.exe" --flag-switches-begin --flag-switches-end --origin-trial-disabled-features=CanvasTextNg|WebAssemblyCustomDescriptors
可执行文件路径	D:\Software\Google\Chrome\Application\chrome.exe
个人资料路径	C:\Users\kamo\AppData\Local\Google\Chrome\User Data\Profile 3
然后
我想定位 谷歌浏览器登陆了两个账号, 定位uesrdata 启动指定账号的 Chrome 实例 使用Selenium 连接到指定账号的实例 # 替换为你的 Chrome 路径、目标账号的子目录路径、端口号我使用cmd运行后"D:\Software\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\kamo\AppData\Local\Google\Chrome\User Data\Profile 3" 跳出了新的chrome浏览器, 
显示的是
命令行	"D:\Software\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9527 --user-data-dir="C:\Users\kamo\AppData\Local\Google\Chrome\User Data\Profile 3" --flag-switches-begin --flag-switches-end
可执行文件路径	D:\Software\Google\Chrome\Application\chrome.exe
个人资料路径	C:\Users\kamo\AppData\Local\Google\Chrome\User Data\Profile 3\Default