Selenium Grid es un sistema de ejecución de navegadores web de forma remota, con Selenium Grid un servidor actúa como hub mientras el resto de servidores actúan como nodos(WebDriver nodes).
Cuando se ejecuta un test este se envÃa al hub y el hub se encarga de repartir el trabajado entre los nodos, de esta manera es posible ejecutar tests de forma paralela en multitud de navegadores, versiones y sistemas operativos de forma centralizada.
Empecemos instalando el hub, para ello precisaremos de Java:
Nos bajamos el selenium server:
Finalmente ejecutamos el selenium server con la opción -role hub:
Ahora ya podemos pasar a los WbdriverNodes, también instalamos java:
Vamos a instalar Chrome, Firefox y sus controladores asociados, de este modo desde el script de test podremos elegir en cual de ellos ejecutarlo.
Crearemos un usuario para ejecutar todo lo relacionado con Selenium:
su selenium -l
Nos bajamos el chrome driver de la versión de Chrome que hayamos instalado:
unzip chromedriver_linux64.zip
Instalamos el driver de Firefox(gecko):
tar xvzf geckodriver-v0.26.0-linux64.tar.gz
Nos bajamos selenium server:
Esta vez lo ejecutamos con el parámetro -role node e indicando la URL del hub:
Podemos consultar el estado de la grid accediendo al hub:
http://{{ip or host}}:4444/grid/console
Ya podemos empezar a programar nuestro primer test, en mi caso lo haré en Python, primero instalaremos selenium mediante pip:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Remote(command_executor='http://{{ip or host}}:4444/wd/hub', desired_capabilities=chrome_options.to_capabilities())
driver.get("http://alfaexploit.com")
print(driver.title)
assert "Seguridad, Linux, BSD y demás frikerias" in driver.title
driver.close()
Ejecutamos el test:
En el Hub veremos:
15:54:24.742 INFO [RequestHandler.process] - Got a request to create a new session: Capabilities {browserName: chrome, goog:chromeOptions: {args: [--headless, --no-sandbox, --disable-dev-shm-usage], extensions: []}, version: }
15:54:24.743 INFO [TestSlot.getNewSession] - Trying to create a new session on test slot {server:CONFIG_UUID=03799637-35c8-455c-a3e5-7d9e77f52819, seleniumProtocol=WebDriver, browserName=chrome, maxInstances=5, platformName=LINUX, platform=LINUX}
En el nodo:
15:54:24.765 INFO [ActiveSessionFactory.apply] - Capabilities are: {
"browserName": "chrome",
"goog:chromeOptions": {
"extensions": [
],
"args": [
"--headless",
"--no-sandbox",
"--disable-dev-shm-usage"
]
},
"version": ""
}
15:54:24.766 INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.grid.session.remote.ServicedSession$Factory (provider: org.openqa.selenium.chrome.ChromeDriverService)
Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 22576
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
15:54:24.956 INFO [ProtocolHandshake.createSession] - Detected dialect: W3C
15:54:24.978 INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session 02d65cf76d5b0bf4ef74da780f9b20e8 (org.openqa.selenium.chrome.ChromeDriverService)
En el servidor final:
A.B.C.D - - - [05/Mar/2020:16:55:43 +0100] "GET /css/custom.css HTTP/1.1" 200 491 "http://alfaexploit.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/80.0.3987.132 Safari/537.36"
NOTA: SerÃa conveniente proteger mediante reglas de firewall los servidores de la SeleniumGrid para evitar el uso por parte de usuarios no autorizados.
Para agilizar las pruebas podemos programar el siguiente script en bash:
#! /bin/bash
for i in $(seq 1 100); do
python3 seleniumGrid.py &
done
./test.sh