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

Docker化Selenium Grid指定浏览器版本运行测试异常排查

问题:Docker化Selenium Grid无法指定浏览器版本运行自动化测试

尝试在Docker化的Selenium Grid中指定浏览器版本运行自动化测试,但设置mode="remote"、browser="chrome"、version="94.0"时,测试并未运行在指定的Chrome 94.0节点,而是随机分配到其他Chrome节点。

Webdriver实现代码

public static WebDriver get(String mode, String browser, String version) {
    WebDriver driver = null;
    Map<String, Object> prefs = new HashMap<>();
    prefs.put("download.default_directory", Constants.getDownloadpath());
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("prefs", prefs);
    options.addArguments("--blink-settings=imagesEnable=false");

    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("browser.download.folderList", 2);
    profile.setPreference("browser.download.dir", Constants.getDownloadpath());
    profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv");
    FirefoxOptions option = new FirefoxOptions();

    String remoteUrl = "http://localhost:4444/wd/hub";

    if (browser.equalsIgnoreCase("chrome")) {
        options.addArguments("--blink-settings=imagesEnabled=false");

        if (mode.equalsIgnoreCase("remote")) {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setVersion(version);
            capabilities.setCapability(ChromeOptions.CAPABILITY, options);

            try {
                driver = new RemoteWebDriver(new URL(remoteUrl), capabilities);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        } else {
            WebDriverManager.chromedriver().setup();
            driver = new ChromeDriver(options);
        }
    }
    return driver; // 原代码遗漏return,补充修正
}

Selenium Grid docker-compose.yml配置

version: "3"
services:
  chrome:
    image: selenium/node-chrome:4.1.2-20220217
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  chrome96:
    image: selenium/node-chrome:96.0.4664.93
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  chrome94:
    image: selenium/node-chrome:94.0-chromedriver-94.0
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  edge:
    image: selenium/node-edge:4.1.2-20220217
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  firefox:
    image: selenium/node-firefox:4.1.2-20220217
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  firefox42:
    image: selenium/node-firefox:4.2.2-20220609
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  selenium-hub:
    image: selenium/hub:4.1.2-20220217
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

Grid Hub节点状态

Selenium Grid hub显示两个Chrome节点


原因分析

  • DesiredCapabilities匹配逻辑失效:Selenium 4官方已废弃DesiredCapabilities作为版本指定的方式,旧的capabilities.setVersion()方法在Grid中的版本匹配精度不足,无法精准定位节点。
  • 版本号格式不匹配:代码中指定的94.0是模糊版本号,但Chrome节点镜像的实际版本是完整格式(如94.0.XXXX.X),模糊值无法触发精确匹配。
  • 节点版本未显式注册:部分Selenium节点镜像不会自动向Hub上报精确版本号,Hub无法识别节点的版本信息,导致分配逻辑随机。

解决办法

1. 修改Webdriver代码,使用ChromeOptions直接指定版本

放弃DesiredCapabilities,直接通过ChromeOptions设置浏览器版本,确保版本号与节点实际版本一致:

public static WebDriver get(String mode, String browser, String version) {
    WebDriver driver = null;
    Map<String, Object> prefs = new HashMap<>();
    prefs.put("download.default_directory", Constants.getDownloadpath());
    String remoteUrl = "http://localhost:4444/wd/hub";

    if (browser.equalsIgnoreCase("chrome")) {
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("prefs", prefs);
        options.addArguments("--blink-settings=imagesEnabled=false");
        
        if (mode.equalsIgnoreCase("remote")) {
            // 直接在ChromeOptions中设置精确版本号
            options.setBrowserVersion(version); 
            try {
                driver = new RemoteWebDriver(new URL(remoteUrl), options);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        } else {
            WebDriverManager.chromedriver().setup();
            driver = new ChromeDriver(options);
        }
    }
    // 补充Firefox等其他浏览器的逻辑
    return driver;
}

2. 优化Docker节点配置,显式声明版本

修改docker-compose.yml,给每个浏览器节点添加SE_NODE_BROWSER_VERSION环境变量,强制节点向Hub注册精确版本:

# Chrome 94节点示例
chrome94:
    image: selenium/node-chrome:94.0-chromedriver-94.0
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_BROWSER_VERSION=94.0  # 显式指定版本
      - SE_NODE_GRID_URL=http://selenium-hub:4444

# Chrome 96节点示例
chrome96:
    image: selenium/node-chrome:96.0.4664.93
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_BROWSER_VERSION=96.0.4664.93  # 显式指定完整版本
      - SE_NODE_GRID_URL=http://selenium-hub:4444

3. 验证配置生效

重启Grid后,访问http://localhost:4444/ui查看节点详情,确认每个节点的Browser Version字段已正确显示配置的版本号。此时运行测试指定对应版本,即可精准分配到目标节点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:22:07