Saltar al contenido principal

Configurando Selenium WebDriver

Selenium WebDriver te permite ejecutar tus pruebas en una variedad de navegadores, cada uno con diversas opciones de configuración. En esta sección veremos cómo configurar tu driver de WebDriver en Serenity.

La forma más sencilla de configurar el driver que deseas usar es en el archivo serenity.conf de tu proyecto (que encontrarás en la carpeta src/test/resources).

Las opciones de configuración básicas van en la sección webdriver. Por ejemplo, para ejecutar tus pruebas con Chrome, establece la propiedad webdriver.driver a "chrome":

webdriver {
driver = "chrome"
}

Todos los navegadores estándar de WebDriver están soportados:

NavegadorValorEjemplo
Chromechromewebdriver.driver = "chrome"
Firefoxfirefoxwebdriver.driver = "firefox"
Microsoft Edgeedgewebdriver.driver = "edge"
Internet ExplorerIEwebdriver.driver = "IE"
Safarisafariwebdriver.driver = "safari"

Configurando los drivers de WebDriver

Cuando ejecutas una prueba de WebDriver contra casi cualquier driver, necesitas un archivo binario específico del sistema operativo para actuar como intermediario entre tu prueba y el navegador que deseas manipular. Los principales drivers, y de dónde puedes descargarlos, se listan a continuación:

NavegadorDriverUbicaciónPropiedad del Sistema
Chromechromedriverhttp://chromedriver.chromium.orgwebdriver.chrome.driver
Firefoxgeckodriverhttps://github.com/mozilla/geckodriver/releaseswebdriver.gecko.driver
Microsoft Edgemsedgedriverhttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/webdriver.edge.driver
Internet ExplorerIEDriverServerhttps://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriverwebdriver.ie.driver

Descargas automáticas de drivers

Por defecto, Selenium descarga e instala automáticamente los binarios de driver apropiados para el driver especificado.

Configurando binarios de drivers manualmente

Si no puedes o no deseas descargar los binarios de WebDriver automáticamente usando WebDriverManager (por ejemplo, si estás en una red corporativa que no tiene acceso a los binarios de WebDriverManager), puedes descargar los binarios y configurarlos directamente en el archivo serenity.conf.

En este caso necesitas tener el binario del driver correcto en la ruta de tu sistema, o proporcionar la ruta al binario usando la propiedad del sistema mostrada en la tabla anterior. Por ejemplo, tu archivo serenity.conf podría contener lo siguiente:

webdriver.gecko.driver=/path/to/my/geckodriver

Sin embargo, añadir una ruta del sistema a tu archivo serenity.properties es una mala práctica, ya que significa que tus pruebas solo se ejecutarán si el directorio y binario especificados existen, y que estás ejecutando las pruebas en el sistema operativo correcto. Esto obviamente tiene poco sentido si estás ejecutando tus pruebas tanto localmente como en un entorno de CI.

Un enfoque más robusto es tener tus drivers en tu código fuente, pero tener diferentes drivers por sistema operativo. Serenity te permite pasar propiedades específicas del driver a un driver, siempre que estén prefijadas con drivers.os. Por ejemplo, la siguiente línea configurará webdriver.chrome.driver si estás ejecutando tus pruebas en Windows.

drivers {
windows {
webdriver.chrome.driver = src/test/resources/webdriver/windows/chromedriver.exe
}

Puedes configurar fácilmente diferentes binarios para diferentes sistemas operativos de esta manera:

drivers {
windows {
webdriver.chrome.driver = src/test/resources/webdriver/windows/chromedriver.exe
}
mac {
webdriver.chrome.driver = src/test/resources/webdriver/mac/chromedriver
}
linux {
webdriver.chrome.driver = src/test/resources/webdriver/linux/chromedriver
}
}

Este enfoque también funciona cuando tienes más de un driver que configurar. Supongamos que necesitas ejecutar pruebas en tres entornos, usando Firefox o Windows. Un enfoque conveniente es almacenar tus drivers en una estructura de directorios bajo src/test/resources similar a la siguiente:

src/test/resources
└── webdriver
├── linux
│ ├── chromedriver
│ └── geckodriver
├── mac
│ ├── chromedriver
│ └── geckkodriver
└── windows
├── chromedriver.exe
└── geckodriver.exe

Esto significa que tus pruebas no necesitarán que los binarios de webdriver estén instalados en cada máquina.

La configuración correspondiente de serenity.conf para ambos navegadores y cada sistema operativo se vería así:

drivers {
windows {
webdriver.chrome.driver = src/test/resources/webdriver/windows/chromedriver.exe
webdriver.gecko.driver = src/test/resources/webdriver/windows/geckodriver.exe
}
mac {
webdriver.chrome.driver = src/test/resources/webdriver/mac/chromedriver
webdriver.gecko.driver = src/test/resources/webdriver/mac/geckodriver
}
linux {
webdriver.chrome.driver = src/test/resources/webdriver/linux/chromedriver
webdriver.gecko.driver = src/test/resources/webdriver/linux/geckodriver
}
}

Especificando propiedades W3C

Las capacidades W3C son un conjunto estándar de características del driver que toda implementación de driver debe soportar. Puedes configurar las capacidades W3C en la sección wenbdriver.capabilities de tu archivo serenity.conf, como se muestra aquí:

webdriver {
capabilities {
browserName = "Chrome"
browserVersion = "103.0"
platformName = "Windows 11"
acceptInsecureCerts = true
}
}

Puedes definir timeouts en una subsección dedicada de esta manera:

webdriver {
capabilities {
browserName = "Chrome"
browserVersion = "103.0"
platformName = "Windows 11"
timeouts {
script = 30000
pageLoad = 300000
implicit = 2000
}
}
}

También puedes definir detalles de configuración de proxy en la sección proxy:

webdriver {
capabilities {
browserName = "Chrome"
browserVersion = "103.0"
platformName = "Windows 11"
proxy {
proxyType = "30000"
httpProxy = "myproxy.myorgcom:3128"
}
}
}

Configurando Chrome

Configurando Selenium WebDriver

[Contenido anterior sin cambios hasta la sección de configuración de Chrome...]

Configurando Chrome

Puedes usar la capacidad especial "goog:chromeOptions" para definir cualquiera de las opciones de ChromeDriver

webdriver {
capabilities {
browserName = "Chrome"
browserVersion = "103.0"
platformName = "Windows 11"
screenResolution = "1280x1024"

"goog:chromeOptions" {
args = [ "window-size=1000,800", "headless" ]
binary = ${HOME}/path/to/chromedriver
detach = true
localState = {
cart-contents = [1,2,3]
}
}
}
}

Configurando argumentos de Chromedriver

Configurando ajustes de proxy

Chrome soporta varias configuraciones de proxy que pueden especificarse en tu archivo serenity.conf. Puedes configurar proxies en la sección general de capacidades o dentro de las opciones específicas de Chrome:

Configuración básica de proxy

webdriver {
capabilities {
"goog:chromeOptions" {
proxy {
proxyType = "MANUAL"
httpProxy = "proxy.example.com:8080"
sslProxy = "proxy.example.com:8443"
noProxy = "localhost,127.0.0.1,.example.com"
}
}
}
}

Tipos de proxy

Serenity soporta varios tipos de proxy:

  1. Configuración manual de proxy
"goog:chromeOptions" {
proxy {
proxyType = "MANUAL"
httpProxy = "proxy.example.com:8080" # Proxy HTTP
sslProxy = "proxy.example.com:8443" # Proxy HTTPS
socksProxy = "socks.example.com:1080" # Proxy SOCKS
socksVersion = 5 # Versión SOCKS (4 o 5)
noProxy = "localhost,127.0.0.1" # Evitar proxy para estas direcciones
}
}
  1. PAC (Configuración Automática de Proxy)
"goog:chromeOptions" {
proxy {
proxyType = "PAC"
proxyAutoconfigUrl = "http://proxy.example.com/proxy.pac"
}
}
  1. Proxy del sistema
"goog:chromeOptions" {
proxy {
proxyType = "SYSTEM" # Usar configuración de proxy del sistema
}
}
  1. Conexión directa
"goog:chromeOptions" {
proxy {
proxyType = "DIRECT" # Sin proxy (conexión directa)
}
}
  1. Auto-detección
"goog:chromeOptions" {
proxy {
proxyType = "AUTODETECT" # Auto-detectar configuración de proxy
}
}

Autenticación de proxy

Para proxies que requieren autenticación, incluye las credenciales en la URL del proxy:

"goog:chromeOptions" {
proxy {
proxyType = "MANUAL"
httpProxy = "username:password@proxy.example.com:8080"
}
}

Configuración de proxy específica por entorno

Puedes configurar diferentes ajustes de proxy para diferentes entornos:

environments {
dev {
webdriver.capabilities {
"goog:chromeOptions" {
proxy {
proxyType = "DIRECT"
}
}
}
}
qa {
webdriver.capabilities {
"goog:chromeOptions" {
proxy {
proxyType = "MANUAL"
httpProxy = "proxy.qa.example.com:8080"
sslProxy = "proxy.qa.example.com:8443"
noProxy = "*.qa.example.com,localhost"
}
}
}
}
}

Configurando Microsoft Edge

Microsoft Edge es un driver basado en Chromium, por lo que la configuración es muy similar a Chrome. La principal diferencia es el uso de "ms:edgeOptions'" en lugar de "goog:chromeOptions". Una configuración típica se muestra a continuación:

webdriver {
capabilities {
browserName = "MicrosoftEdge"
"ms:edgeOptions" {
args = ["test-type", "ignore-certificate-errors", "headless",
"incognito", "disable-infobars", "disable-gpu", "disable-default-apps", "disable-popup-blocking"]
}
}
}

Configurando Firefox

Firefox usa la capacidad "moz:firefoxOptions" para definir opciones específicas del navegador. Una configuración de ejemplo se muestra a continuación:

webdriver {
capabilities {
browserName = "firefox"

timeouts {
implicit = 1000
script = 1000
pageLoad = 1000
}
pageLoadStrategy = "normal"
acceptInsecureCerts = true
unhandledPromptBehavior = "dismiss"
strictFileInteractability = true

"moz:firefoxOptions" {
args = ["-headless"],
prefs {
"javascript.options.showInConsole": false
},
log {"level": "info"},
}
}
}

Configurando múltiples entornos

Puedes configurar múltiples configuraciones de driver usando la sección environments, como se muestra a continuación. Luego simplemente establece la propiedad del sistema environment al entorno correspondiente para usar estos ajustes, por ejemplo:

mvn clean verify -Denvironment=chrome

Una sección de entornos de ejemplo se muestra aquí:

environments {
chrome {
webdriver {
driver = chrome
autodownload = true
capabilities {
browserName = "chrome"
acceptInsecureCerts = true
"goog:chromeOptions" {
args = ["test-type", "ignore-certificate-errors", "headless", "--window-size=1000,800"
"incognito", "disable-infobars", "disable-gpu", "disable-default-apps", "disable-popup-blocking"]
}
}
}
}
edge {
webdriver {
capabilities {
browserName = "MicrosoftEdge"
"ms:edgeOptions" {
args = ["test-type", "ignore-certificate-errors", "headless",
"incognito", "disable-infobars", "disable-gpu", "disable-default-apps", "disable-popup-blocking"]
}
}
}
}
firefox {
webdriver {
capabilities {
browserName = "firefox"
pageLoadStrategy = "normal"
acceptInsecureCerts = true
unhandledPromptBehavior = "dismiss"
strictFileInteractability = true

"moz:firefoxOptions" {
args = ["-headless"],
prefs {
"javascript.options.showInConsole": false
},
log {"level": "info"},
}
}
}
}
}