You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何阻止Java版Selenium自动下载最新Chrome浏览器及驱动?

解决Selenium在Docker/Fargate中重复下载Chrome及Chromedriver的方案

核心思路:彻底绕过Selenium Manager自动下载逻辑

Selenium Manager的自动下载优先级很高,仅靠环境变量可能无法完全禁用,需结合镜像预配置+代码硬指定路径+环境变量锁死三重保障。

1. 镜像构建阶段:固定浏览器与驱动版本并赋予权限

在Dockerfile中手动指定Chrome和Chromedriver的版本,安装到固定路径,避免Selenium Manager触发下载:

# 安装指定版本的Chrome(示例为118.0.5993.70,可根据需求调整)
RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
    dpkg -i google-chrome-stable_current_amd64.deb && \
    apt-get install -f -y && \
    rm google-chrome-stable_current_amd64.deb

# 下载与Chrome完全匹配的Chromedriver
RUN CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+') && \
    wget -q https://storage.googleapis.com/chrome-for-testing-public/$CHROME_VERSION/linux64/chromedriver-linux64.zip && \
    unzip chromedriver-linux64.zip && \
    mv chromedriver-linux64/chromedriver /usr/bin/chromedriver && \
    chmod +x /usr/bin/chromedriver && \
    rm -rf chromedriver-linux64.zip chromedriver-linux64

# 锁死Selenium Manager的下载开关
ENV SE_OFFLINE=true
ENV SELENIUM_MANAGER_SKIP_BROWSER_DOWNLOAD=true
ENV SELENIUM_MANAGER_SKIP_DRIVER_DOWNLOAD=true
ENV SE_AVOID_BROWSER_DOWNLOAD=true

2. 代码层面:强制指定本地路径,完全绕过Selenium Manager

不要依赖Selenium自动查找浏览器和驱动,在测试代码中直接硬编码路径:

Python示例

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

options = webdriver.ChromeOptions()
# 指定本地Chrome二进制文件路径
options.binary_location = "/usr/bin/google-chrome"
# 添加无头测试必要参数
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

# 直接指定本地驱动路径,禁用Selenium Manager自动查找
service = Service(executable_path="/usr/bin/chromedriver")
driver = webdriver.Chrome(service=service, options=options)

Java示例

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.chrome.ChromeDriverService;
import java.io.File;

public class SeleniumTest {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.setBinary("/usr/bin/google-chrome");
        options.addArguments("--headless=new", "--no-sandbox", "--disable-dev-shm-usage");

        // 绑定本地驱动路径
        ChromeDriverService service = new ChromeDriverService.Builder()
                .usingDriverExecutable(new File("/usr/bin/chromedriver"))
                .build();

        ChromeDriver driver = new ChromeDriver(service, options);
        // 测试逻辑...
        driver.quit();
    }
}

3. Fargate任务配置:确保环境变量不被覆盖

Fargate任务定义可能会重置容器环境变量,需在任务配置中手动添加所有禁用下载的环境变量,而非仅依赖Dockerfile设置:

  • 在Fargate任务的"环境变量"列表中添加:
    • SE_OFFLINE=true
    • SELENIUM_MANAGER_SKIP_BROWSER_DOWNLOAD=true
    • SELENIUM_MANAGER_SKIP_DRIVER_DOWNLOAD=true

4. 排查验证步骤

  • 容器启动时执行echo $SELENIUM_MANAGER_SKIP_BROWSER_DOWNLOAD,确认环境变量生效
  • 查看Selenium DEBUG日志,检查是否有"downloading browser/driver"相关日志输出
  • 验证Chrome与Chromedriver版本完全匹配:执行google-chrome --versionchromedriver --version,确保主版本号一致

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

火山引擎 最新活动