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

GitLab CI中使用Docker-in-Docker无法连接Selenium Grid 4的问题

问题原因
  1. 用docker作为主机名时解析失败:junit任务的容器无法正确连通docker:dind服务,或者dind容器内的Selenium Hub未完成启动就被发起连接。
  2. 用localhost时连接被拒绝:junit任务的容器和运行Selenium的dind容器是独立实例,localhost仅指向junit容器自身,无法跨容器访问Selenium服务。
解决方案

方案一:修正GitLab CI配置,确保跨容器连通性

1. 更新.gitlab-ci.yml配置

补充docker:dind的标准环境变量,添加Selenium Hub就绪等待步骤:

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
  SELENIUM_GRID_URL: "http://docker:4444"
  # 新增docker:dind必备变量
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"

cache:
  paths:
    - .m2/repository/
    - target/

stages:
  - build
  - test

compile:
  stage: build
  image: maven:3.8.7-eclipse-temurin-17
  script: mvn compile

docker-selenium:
  stage: test
  image: docker:23.0.0
  services:
    - docker:23.0.0-dind
  script:
    - docker compose up -d
    # 验证容器启动状态
    - docker compose ps

junit:
  stage: test
  needs: ["docker-selenium"]
  image: maven:3.8.7-eclipse-temurin-17
  script:
    # 等待Selenium Hub完全就绪,避免提前发起连接
    - until curl -s $SELENIUM_GRID_URL/status | grep -q "ready"; do sleep 5; done
    - mvn test -Dparallel-enabled=true -Dthread-count=7 -Dselenium.grid.url=$SELENIUM_GRID_URL

2. 修正测试代码的Grid地址读取逻辑

确保代码能读取maven传入的系统变量:

String gridUrl = System.getProperty("selenium.grid.url", "http://localhost:4444");
WebDriver driver = new RemoteWebDriver(new URL(gridUrl), options);

方案二:直接将Selenium作为GitLab CI服务(更简洁)

不需要单独维护docker-compose,直接在junit任务中配置Selenium服务:

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
  SELENIUM_GRID_URL: "http://selenium-hub:4444"

cache:
  paths:
    - .m2/repository/
    - target/

stages:
  - build
  - test

compile:
  stage: build
  image: maven:3.8.7-eclipse-temurin-17
  script: mvn compile

junit:
  stage: test
  needs: ["compile"]
  image: maven:3.8.7-eclipse-temurin-17
  services:
    - name: selenium/hub:latest
      alias: selenium-hub
    - name: selenium/node-chrome:latest
      variables:
        SE_EVENT_BUS_HOST: selenium-hub
        SE_EVENT_BUS_PUBLISH_PORT: 4442
        SE_EVENT_BUS_SUBSCRIBE_PORT: 4443
        SE_NODE_MAX_SESSIONS: 8
        SE_NODE_OVERRIDE_MAX_SESSIONS: "true"
    - name: selenium/node-firefox:latest
      variables:
        SE_EVENT_BUS_HOST: selenium-hub
        SE_EVENT_BUS_PUBLISH_PORT: 4442
        SE_EVENT_BUS_SUBSCRIBE_PORT: 4443
        SE_NODE_MAX_SESSIONS: 8
        SE_NODE_OVERRIDE_MAX_SESSIONS: "true"
  script:
    - until curl -s $SELENIUM_GRID_URL/status | grep -q "ready"; do sleep 5; done
    - mvn test -Dparallel-enabled=true -Dthread-count=7 -Dselenium.grid.url=$SELENIUM_GRID_URL

这种方式下GitLab会自动管理Selenium服务的网络,junit容器可直接通过selenium-hub主机名访问Grid。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:36:00