如何在GitLab CI中运行无头Chrome?Java集成测试求助
在GitLab CI中运行Java Selenium无头Chrome集成测试的完整解决方案
嘿,我刚帮团队搞定过一模一样的场景,给你一套亲测有效的完整方案,分配置和代码两部分来:
第一步:配置.gitlab-ci.yml
首先,GitLab CI的容器环境默认没有Chrome和ChromeDriver,所以我们得先在CI流程里装好这些依赖,再跑测试。下面是用Maven构建的示例配置(用Gradle的话可以对应调整命令):
stages: - test selenium-integration-tests: stage: test # 选带Java+Maven的官方镜像,省得自己搭环境 image: maven:3.8.6-openjdk-11 before_script: # 更新源并安装Chrome(用chromium包,和Chrome完全兼容,源里自带不用手动下) - apt-get update && apt-get install -y --no-install-recommends chromium chromium-driver # 把ChromeDriver路径设为环境变量,方便代码找到 - export CHROME_DRIVER_PATH=/usr/bin/chromedriver script: # 运行集成测试,通过系统参数告诉代码启用无头模式 - mvn verify -Dselenium.headless=true # 如果测试耗时久,记得加超时设置,默认超时可能不够 timeout: 30m
配置里的关键细节
- 镜像选择:用官方的Java+Maven镜像,避免从零开始安装JDK和构建工具,节省时间
- chromium包:Debian/Ubuntu源里的
chromium和Chrome功能完全一致,chromium-driver会自动匹配版本,完美解决Chrome和ChromeDriver版本不兼容的坑 - 系统参数
-Dselenium.headless=true:给Java代码传开关,控制是否启用无头模式,本地测试时可以不传这个参数,正常打开Chrome调试
第二步:调整Java Selenium代码
接下来要在你的测试代码里配置ChromeOptions,启用无头模式,同时适配CI的容器环境:
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class BaseSeleniumTest { protected ChromeDriver getChromeDriver() { ChromeOptions options = new ChromeOptions(); // 读取系统参数,判断是否启用无头模式 boolean isHeadless = Boolean.parseBoolean(System.getProperty("selenium.headless", "false")); if (isHeadless) { // 新版无头模式,Chrome 96+推荐,行为更接近真实浏览器 options.addArguments("--headless=new"); // CI是容器环境,必须加这个参数才能启动Chrome options.addArguments("--no-sandbox"); // 解决容器/dev/shm分区太小导致Chrome崩溃的问题 options.addArguments("--disable-dev-shm-usage"); // 设置窗口大小,避免页面元素因为窗口太小无法定位 options.addArguments("--window-size=1920,1080"); // 禁用GPU,容器环境不需要 options.addArguments("--disable-gpu"); } // 初始化Driver,现在会自动找到环境变量里的ChromeDriver return new ChromeDriver(options); } }
代码里的必加参数
--no-sandbox:容器环境没有完整的用户会话,不加这个Chrome根本启动不了,踩过这个坑的人都懂--disable-dev-shm-usage:默认容器的/dev/shm只有64MB,Chrome运行时会不够用,加这个参数让Chrome用临时文件代替,避免崩溃--headless=new:别用旧版的--headless,新版的无头模式和正常Chrome几乎一样,很多旧版无头模式下的兼容性问题都能解决
常见问题排查
如果跑起来还是有问题,试试这几个排查点:
- ChromeDriver找不到:确认
CHROME_DRIVER_PATH的路径和实际安装的一致,或者直接在代码里用System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver")硬编码路径 - 依赖缺失:如果安装Chrome时报错,在
before_script里加apt-get install -y libnss3 libgconf-2-4 libxss1,这些是Chrome运行需要的依赖库 - 测试超时:如果测试里有等待元素的逻辑,确保用了显式等待(
WebDriverWait),别用Thread.sleep(),避免不必要的超时
内容的提问来源于stack exchange,提问作者Mohammad Najar
相关产品推荐
相关产品推荐

