Linux ARM64 Docker化.NET6程序中WebDriverManager无法定位Chrome
Linux ARM64 Docker环境下.NET 6 + Selenium+Chrome运行问题
问题背景
在Linux ARM64架构的Docker容器中运行.NET 6程序,依赖Selenium.WebDriver 4.18.1和WebDriverManager 2.17.2包,执行浏览器驱动初始化代码时触发错误:System.Exception: Unable to locate installed browser for runtime platform Unix。已尝试安装Linux64版Chrome、Mac-ARM64版Chrome及chrome-headless-shell,但问题未解决。
相关代码与错误信息
.csproj依赖配置
<PackageReference Include="Selenium.WebDriver" Version="4.18.1" /> <PackageReference Include="WebDriverManager" Version="2.17.2" />
FooService.cs核心代码
new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser, Architecture.X64); var cService = ChromeDriverService.CreateDefaultService(); _driver = new ChromeDriver(cService, options);
错误栈
System.Exception: Unable to locate installed browser for runtime platform Unix at WebDriverManager.Helpers.RegistryHelper.GetInstalledBrowserVersionLinux(String[] executableAndArgumentsPairs) at WebDriverManager.DriverConfigs.Impl.ChromeConfig.GetRawBrowserVersion() at WebDriverManager.DriverConfigs.Impl.ChromeConfig.GetMatchingBrowserVersion() at WebDriverManager.DriverManager.GetVersionToDownload(IDriverConfig config, String version) at WebDriverManager.DriverManager.SetUpDriver(IDriverConfig config, String version, Architecture architecture) at Blabla.Services.Foo.StartChrome() in /src/Bla/FooService.cs:line 46
已尝试的手动安装命令
curl -L -o chrome-headless-shell.zip "https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.22/linux64/chrome-headless-shell-<file>.zip" unzip chrome-headless-shell.zip -d /opt rm chrome-headless-shell.zip export PATH="/opt:${PATH}"
解决方案
1. 安装适配ARM64的Chrome版本
之前安装的Linux64/Mac-ARM64版本与容器架构不匹配,需安装Linux ARM64版Chrome Headless Shell,修改安装命令:
# 下载对应版本的ARM64安装包 curl -L -o chrome-headless-shell.zip "https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.22/linux-arm64/chrome-headless-shell-linux-arm64.zip" unzip chrome-headless-shell.zip -d /opt # 将可执行文件路径加入系统PATH,确保WebDriverManager能识别 export PATH="/opt/chrome-headless-shell-linux-arm64:${PATH}"
2. 调整WebDriverManager的架构参数
代码中指定了Architecture.X64,与容器ARM64架构冲突,改为Architecture.Arm64:
new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser, Architecture.Arm64);
3. 手动指定Chrome可执行路径(可选)
若WebDriverManager仍无法识别浏览器,在ChromeOptions中直接指定路径:
var options = new ChromeOptions(); // 指定ARM64版Chrome Headless Shell路径 options.BinaryLocation = "/opt/chrome-headless-shell-linux-arm64/chrome-headless-shell"; // 添加无头模式等必要运行参数 options.AddArgument("--headless=new"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); var cService = ChromeDriverService.CreateDefaultService(); _driver = new ChromeDriver(cService, options);
4. 修正Docker镜像基础环境
使用支持ARM64的.NET 6基础镜像,并安装Chrome运行依赖库,示例Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:6.0-bookworm-slim-arm64v8 # 安装Chrome运行依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libglib2.0-0 \ libnss3 \ libfontconfig1 \ unzip \ curl \ && rm -rf /var/lib/apt/lists/* # 安装ARM64版Chrome Headless Shell RUN curl -L -o chrome-headless-shell.zip "https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.22/linux-arm64/chrome-headless-shell-linux-arm64.zip" \ && unzip chrome-headless-shell.zip -d /opt \ && rm chrome-headless-shell.zip \ && chmod +x /opt/chrome-headless-shell-linux-arm64/chrome-headless-shell \ && echo 'PATH="/opt/chrome-headless-shell-linux-arm64:$PATH"' >> /etc/profile WORKDIR /app COPY . . ENTRYPOINT ["dotnet", "YourApp.dll"]
内容的提问来源于stack exchange,提问作者kevinob
相关产品推荐
相关产品推荐

