Configuración GitLab CI con WebDriver local
La integración de Selenium en pipelines de GitLab CI requiere un entorno controlado que simule un navegador real sin interfaz gráfica. Esta configuración permite ejecutar pruebas automatizadas de manera consistente en cada commit, garantizando la calidad del código antes de su despliegue.
Imagen Docker optimizada para Selenium
La imagen Docker markhobson/maven-chrome proporciona un entorno preconfigurado que incluye JDK 21, Maven y Google Chrome, eliminando la complejidad de configurar manualmente estas dependencias. Esta imagen está específicamente diseñada para entornos de CI/CD y mantiene las versiones actualizadas de todos los componentes necesarios.
La configuración base del archivo .gitlab-ci.yml establece el foundation para la ejecución automatizada:
# Imagen con JDK 21 + Maven + Chrome preinstalado
image: markhobson/maven-chrome:jdk-21
stages:
- test
# Cache para que no descargue dependencias cada vez
cache:
paths:
- .m2/repository/
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
Configuración del job de pruebas
El job de Selenium se define con artefactos que preservan los reportes de pruebas, permitiendo analizar los resultados incluso cuando las pruebas fallan:
selenium_tests:
stage: test
script:
- mvn clean test
artifacts:
when: always
reports:
junit: target/surefire-reports/TEST-*.xml
expire_in: 1 day
Esta configuración incluye caching inteligente de dependencias Maven, reduciendo significativamente los tiempos de construcción en ejecuciones posteriores. El parámetro when: always garantiza que los reportes se generen independientemente del resultado de las pruebas.
Configuración del WebDriver para CI
La configuración del ChromeDriver en modo headless es esencial para la ejecución en contenedores sin interfaz gráfica. El navegador debe configurarse con opciones específicas que optimicen su rendimiento en este entorno:
@BeforeEach
void configurarWebDriver() {
ChromeOptions opciones = new ChromeOptions();
opciones.setHeadless(true);
opciones.addArguments("--no-sandbox");
opciones.addArguments("--disable-dev-shm-usage");
opciones.addArguments("--disable-gpu");
opciones.addArguments("--window-size=1920,1080");
driver = new ChromeDriver(opciones);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
}
Optimizaciones específicas para contenedores
Las opciones adicionales del navegador abordan limitaciones específicas de los entornos containerizados. La opción --no-sandbox desactiva el sandbox de Chrome, necesario cuando se ejecuta como usuario root en contenedores Docker.
La configuración --disable-dev-shm-usage evita problemas de memoria relacionados con el uso compartido de memoria en sistemas con /dev/shm limitado, común en algunos runners de GitLab CI.
@Test
void validarConfiguracionCI() {
driver.get("https://example.com");
// Verificar que el driver funciona correctamente en CI
String titulo = driver.getTitle();
assertThat(titulo).isNotEmpty();
// Verificar resolución de pantalla configurada
Dimension tamaño = driver.manage().window().getSize();
assertThat(tamaño.getWidth()).isEqualTo(1920);
assertThat(tamaño.getHeight()).isEqualTo(1080);
}
Variables de entorno para flexibilidad
El uso de variables de entorno permite adaptar la configuración según diferentes contextos de ejecución sin modificar el código:
@BeforeEach
void configurarWebDriverConVariables() {
ChromeOptions opciones = new ChromeOptions();
// Determinar modo headless desde variable de entorno
boolean headless = Boolean.parseBoolean(
System.getenv().getOrDefault("HEADLESS", "true")
);
opciones.setHeadless(headless);
// Configurar timeout desde variable de entorno
String timeout = System.getenv().getOrDefault("IMPLICIT_WAIT", "10");
driver = new ChromeDriver(opciones);
driver.manage().timeouts()
.implicitlyWait(Duration.ofSeconds(Long.parseLong(timeout)));
}
Esta aproximación facilita la ejecución local con interfaz gráfica durante el desarrollo, mientras mantiene el modo headless para CI/CD.
Gestión de recursos y cleanup
La gestión adecuada de recursos es crítica en entornos de CI donde los recursos son limitados. El patrón de cleanup debe garantizar que el WebDriver se cierre correctamente:
@AfterEach
void limpiarRecursos() {
Optional.ofNullable(driver)
.ifPresent(WebDriver::quit);
}
@AfterAll
static void limpiezaGlobal() {
// Verificar que no queden procesos Chrome zombie
System.gc();
}
La configuración resultante proporciona un entorno robusto para la ejecución de pruebas Selenium en GitLab CI, balanceando rendimiento, estabilidad y facilidad de mantenimiento.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Selenium
Documentación oficial de Selenium
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Selenium es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Selenium
Explora más contenido relacionado con Selenium y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender cómo integrar Selenium en pipelines de GitLab CI para pruebas automatizadas.
- Configurar un entorno Docker optimizado con JDK, Maven y Chrome para CI/CD.
- Implementar la configuración adecuada del WebDriver en modo headless para entornos sin interfaz gráfica.
- Aplicar optimizaciones específicas para contenedores Docker en la ejecución de pruebas.
- Gestionar variables de entorno y recursos para flexibilizar y asegurar la estabilidad de las pruebas en CI.