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节点状态

原因分析
- 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
相关产品推荐
相关产品推荐

