Esta pagina se ve mejor con JavaScript habilitado

Selenium Grid

 ·  🎃 kr0m

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:

emerge -av virtual/jre

Nos bajamos el selenium server:

wget https://bit.ly/2TlkRyu -O selenium-server-standalone-3.141.59.jar

Finalmente ejecutamos el selenium server con la opción -role hub:

java -jar selenium-server-standalone-3.141.59.jar -role hub

Ahora ya podemos pasar a los WbdriverNodes, también instalamos java:

emerge -av virtual/jre

Vamos a instalar Chrome, Firefox y sus controladores asociados, de este modo desde el script de test podremos elegir en cual de ellos ejecutarlo.

emerge -av www-client/google-chrome www-client/firefox

Crearemos un usuario para ejecutar todo lo relacionado con Selenium:

useradd selenium
su selenium -l

Nos bajamos el chrome driver de la versión de Chrome que hayamos instalado:

Instalamos el driver de Firefox(gecko):

Nos bajamos selenium server:

wget https://bit.ly/2TlkRyu -O selenium-server-standalone-3.141.59.jar

Esta vez lo ejecutamos con el parámetro -role node e indicando la URL del hub:

java -Dwebdriver.chrome.driver=chromedriver -Dwebdriver.gecko.driver=geckodriver -jar selenium-server-standalone-3.141.59.jar -role node -hub http://{{ip or host}}:4444/grid/register/ -port 4444

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:

pip install selenium --user

vi seleniumGrid.py
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:

python3 seleniumGrid.py

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:

vi test.sh

#! /bin/bash
for i in $(seq 1 100); do
    python3 seleniumGrid.py &
done
chmod 700 test.sh
./test.sh
Si te ha gustado el artículo puedes invitarme a un RedBull aquí