Ejecución de Selenium en GitLab CI

Avanzado
Selenium
Selenium
Actualizado: 05/09/2025

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 - Autor del tutorial

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.