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

.NET Framework桌面应用自动更新ChromeDriver NuGet包遇错求助

解决.NET Framework桌面应用自动更新ChromeDriver的问题

问题分析

你遇到的Unable to find package 'Selenium.WebDriver.ChromeDriver'错误,核心原因是PackageManager初始化时指向的路径错误:你传入了应用的输出目录(调试文件夹),但NuGet包实际存储在项目根目录的packages文件夹中,导致PackageManager找不到已安装的包。

另外,PackageManager.UpdatePackage方法不会更新你的.csproj文件,它仅会更新本地packages文件夹内的包文件,不会修改项目的引用配置——这意味着下次在Visual Studio中打开项目时,仍会使用旧版本的包引用,除非手动更新NuGet包。

方案1:修正NuGet包更新代码(仅适用于开发环境)

如果仅在开发阶段需要自动更新包,可以调整路径指向项目的packages文件夹,更新完成后再将新的chromedriver.exe复制到输出目录:

using NuGet;
using System.IO;
using System.Linq;
using System.Windows.Forms;

private void Form_Load(object sender, EventArgs e)
{
    string packageID = "Selenium.WebDriver.ChromeDriver";
    
    // 获取项目根目录下的packages文件夹路径(开发环境下有效)
    string projectRoot = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\"));
    string packagesFolder = Path.Combine(projectRoot, "packages");

    // 连接NuGet官方仓库
    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");

    // 获取最新稳定版包
    var latestStablePackage = repo.FindPackagesById(packageID)
                                   .Where(p => p.IsReleaseVersion())
                                   .OrderByDescending(p => p.Version)
                                   .FirstOrDefault();

    if (latestStablePackage == null)
    {
        MessageBox.Show("未找到可用的ChromeDriver稳定版包");
        return;
    }

    try
    {
        // 初始化PackageManager,指向packages文件夹
        PackageManager packageManager = new PackageManager(repo, packagesFolder);
        // 更新指定包
        packageManager.UpdatePackage(packageID, latestStablePackage.Version, true, false);

        // 将新的chromedriver.exe复制到应用输出目录
        string newDriverPath = Path.Combine(
            packagesFolder,
            $"{packageID}.{latestStablePackage.Version}",
            "driver", "win32", "chromedriver.exe"
        );
        string outputDriverPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "chromedriver.exe");

        File.Copy(newDriverPath, outputDriverPath, overwrite: true);
        MessageBox.Show("ChromeDriver已成功更新");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"更新失败:{ex.Message}");
    }
}

方案2:直接下载匹配Chrome版本的Driver(适合部署后的应用)

开发环境的方案依赖项目packages文件夹,部署后的应用通常没有这个目录。更通用的方式是直接根据本地Chrome版本下载对应chromedriver.exe,避免版本不兼容问题:

using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Windows.Forms;

private void Form_Load(object sender, EventArgs e)
{
    try
    {
        // 获取本地Chrome浏览器的版本(取前三位)
        string chromeVersion = GetChromeVersion();
        // 下载并解压对应版本的chromedriver
        DownloadAndExtractChromeDriver(chromeVersion);
        MessageBox.Show("ChromeDriver已更新至匹配版本");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"更新失败:{ex.Message}");
    }
}

// 获取Chrome浏览器版本
private string GetChromeVersion()
{
    // Chrome的默认安装路径
    string[] chromePaths = new[]
    {
        @"C:\Program Files\Google\Chrome\Application\chrome.exe",
        @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    };

    foreach (string path in chromePaths)
    {
        if (File.Exists(path))
        {
            FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(path);
            // 取前三位版本号(Chrome与chromedriver版本前三位一致即可兼容)
            return string.Join(".", versionInfo.ProductVersion.Split('.').Take(3));
        }
    }
    throw new Exception("未检测到Google Chrome浏览器");
}

// 下载并解压chromedriver
private void DownloadAndExtractChromeDriver(string chromeVersion)
{
    string appDir = AppDomain.CurrentDomain.BaseDirectory;
    using (WebClient client = new WebClient())
    {
        // 获取对应Chrome版本的chromedriver最新版本号
        string versionUrl = $"https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{chromeVersion}";
        string driverVersion = client.DownloadString(versionUrl).Trim();

        // 下载chromedriver压缩包
        string zipUrl = $"https://chromedriver.storage.googleapis.com/{driverVersion}/chromedriver_win32.zip";
        string zipPath = Path.Combine(appDir, "chromedriver.zip");
        client.DownloadFile(zipUrl, zipPath);

        // 解压压缩包到应用目录(覆盖旧文件)
        ZipFile.ExtractToDirectory(zipPath, appDir, overwriteFiles: true);

        // 删除临时压缩包
        File.Delete(zipPath);
    }
}

方案2优势

  • 不依赖NuGet包管理器,适配部署后的桌面应用
  • 严格匹配Chrome版本,彻底解决版本不兼容导致的崩溃问题
  • 无需修改项目配置文件,完全在应用运行时自动处理

注意事项

  1. 权限问题:部署后的应用需要有写入应用目录的权限,若权限不足可将chromedriver.exe下载到用户文档目录
  2. 版本缓存:可添加本地版本检查逻辑,避免每次启动都重复下载(比如记录当前chromedriver.exe的版本,与需要的版本对比后再决定是否更新)
  3. 异常处理:需处理Chrome未安装、网络下载失败等异常场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:16:06