
本文详解如何在无外网连接的内网环境中,使用docker容器化部署selenium standalone服务,并通过java remotewebdriver安全、稳定地驱动浏览器完成ui自动化测试,涵盖镜像准备、网络配置、代码适配与常见错误规避。
本文详解如何在无外网连接的内网环境中,使用docker容器化部署selenium standalone服务,并通过java remotewebdriver安全、稳定地驱动浏览器完成ui自动化测试,涵盖镜像准备、网络配置、代码适配与常见错误规避。
在金融、政务、军工等强合规场景中,测试环境常处于完全隔离的内网(即“离线环境”),无法访问公网拉取Docker镜像或下载依赖。此时,若仍需构建可靠、可复现的UI自动化测试流水线,必须摒弃docker pull和在线依赖管理的惯性思维,转而采用全离线预置+本地容器编排的方案。本文以Java语言为客户端、selenium/standalone-chrome为服务端,提供一套经生产验证的5步落地流程。
✅ 第一步:离线物料全量预打包(联网机执行)
在具备互联网连接的“跳板机”上,提前下载并保存所有必需组件:
# 1. 拉取指定版本镜像(避免latest漂移) docker pull selenium/standalone-chrome:4.37.0-20251020 # 2. 导出为tar包(便于离线传输) docker save selenium/standalone-chrome:4.37.0-20251020 > selenium-standalone-chrome-4.37.0.tar # 3. 下载OpenJDK 11(Debian系)及Selenium Server JAR wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.1.2/selenium-server-4.1.2.jar
将生成的 .tar、.jar、.tar.gz 文件通过U盘或内网FTP拷贝至目标内网服务器。
✅ 第二步:内网环境初始化
在内网Linux服务器上完成基础环境搭建:
# 安装Docker(离线RPM包方式,以CentOS为例) rpm -ivh docker-ce-24.0.7-1.el7.x86_64.rpm docker-ce-cli-24.0.7-1.el7.x86_64.rpm # 加载Selenium镜像 docker load <blockquote><p>⚠️ 注意:务必关闭SELinux或配置container-selinux策略,否则Chrome可能因权限拒绝启动;同时确认内核shm支持,--shm-size="2g"为必需参数。</p></blockquote><h3>✅ 第三步:正确启动Selenium容器(关键网络配置)</h3><p>直接运行容器时,<strong>必须显式暴露4444端口并启用离线模式</strong>,否则ChromeDriver可能尝试联网更新:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2530" title="Java JDK 25"><img src="https://img.php.cn/upload/manual/001/221/864/6a6091217fc2f681.png" alt="Java JDK 25" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/gongju/2530" title="Java JDK 25" class="overflowclass">Java JDK 25</a> <p class="overflowclass">Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。</p> </div> <a rel="nofollow" href="/xiazai/gongju/2530" title="Java JDK 25" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><pre class="brush:php;toolbar:false;">docker run -d \ --name selenium-standalone \ -p 4444:4444 \ -p 7900:7900 \ --shm-size="2g" \ -e SE_OFFLINE=true \ -e TZ=Asia/Shanghai \ selenium/standalone-chrome:4.37.0-20251020
✅ 启动后验证服务可用性:
- 访问 http://:4444 —— 应显示Selenium Grid控制台
- 访问 http://:7900(密码 secret)—— 可实时查看Chrome操作画面
✅ 第四步:修正Java客户端代码中的网络引用(核心避坑点)
原代码中使用 http://chrome:4444/wd/hub 会触发DNS解析失败(UnknownHostException: chrome),原因在于:
❌ docker run 默认不创建自定义主机名映射;
❌ 容器内Java进程与Selenium服务同处一台宿主机,应直连宿主机IP或localhost。
✅ 正确写法(推荐使用 localhost,简洁且无需额外网络配置):
// systemTests/InstagramTester.java
public InstagramTester() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox", "--window-size=1920,1080", "--disable-gpu");
try {
// ✅ 改为 localhost —— 因为 -p 4444:4444 已将容器4444映射到宿主机4444
URL remoteUrl = new URL("http://localhost:4444/wd/hub");
this.driver = new RemoteWebDriver(remoteUrl, options);
} catch (MalformedURLException e) {
throw new RuntimeException("Invalid Selenium Hub URL", e);
}
}
? 补充说明:若需跨容器通信(如Java应用也运行在独立容器中),则应使用 docker network 创建自定义桥接网络,并通过服务名访问,例如:
docker network create selenium-net docker run -d --network selenium-net --name selenium-hub ... selenium/standalone-chrome docker run -it --network selenium-net your-java-app # 此时可写 http://selenium-hub:4444/wd/hub
✅ 第五步:构建与运行Java应用(无Maven纯命令行)
沿用你提供的Dockerfile逻辑,但需确保:
- COPY 的 selenium-server-4.1.2.jar 仅用于编译(javac -cp),运行时无需该JAR(Selenium服务由容器提供);
- RemoteWebDriver 依赖的是 selenium-api 和 selenium-remote-driver,建议一并离线下载并加入lib/目录;
- 编译命令保持不变,运行命令明确指定类路径:
# Dockerfile(精简版) FROM selenium/standalone-chrome:4.37.0-20251020 USER root RUN apt-get update && apt-get install -y openjdk-11-jdk && rm -rf /var/lib/apt/lists/* USER seluser WORKDIR /app COPY src/ test/ lib/ ./ RUN javac -cp ".:lib/*" -d classes src/main/*.java test/systemTests/*.java CMD ["java", "-cp", ".:lib/*:classes", "main.MainClass"]
构建并运行:
docker build -t java-selenium-test . docker run -it --rm -p 4444:4444 -p 7900:7900 java-selenium-test
? 总结:离线部署三大铁律
| 类别 | 正确实践 | 禁忌行为 |
|---|---|---|
| 镜像管理 | 使用固定语义化版本(如 4.37.0-20251020),docker save/load离线传输 | 依赖 latest 或在线 pull |
| 网络通信 | 宿主机运行Java → 用 localhost:4444;多容器 → 用 docker network + 服务名 | 硬编码 chrome/hub 而不配网络 |
| 浏览器稳定 | 必设 SE_OFFLINE=true + --shm-size="2g" + --no-sandbox | 忽略共享内存限制导致Chrome崩溃 |
遵循以上步骤,即可在零外网依赖的内网环境中,快速、健壮地交付一套可维护的Java+Selenium UI自动化能力。这不仅是技术方案,更是面向高安全等级场景的工程化交付范式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










