Components del Selenium

Per tal de construir proves funcionals utilitzant el WebDriver de Selenium, requereix entendre els seus components. Igual que amb tot el programari, diferents perfils utilitzant diferents terminologies per la mateixa idea. A continuació es mostra una definició de termes amb descripció, per tal d’evitar ambigüitats.

Terminologia

  • API: interfície de programació d’aplicacions. Aquest és el conjunt d’ordres que s’utilitza per controlar els WebDriver.

  • Biblioteca: Un mòdul de codi que conté les API i el codi necessari per implementar-les. p. ex. fitxers .jar per a Java, fitxers .dll per a .NET, etc.

  • Driver: responsable de controlar el navegador real. La majoria dels controladors son creats pels mateixos fábricants dels navegadors.

  • Framework: Una biblioteca addicional que s’utilitza com a suport per a entorns de WebDriver. Aquests marcs de treball poden ser marcs de prova com JUnit o NUnit. També donen suport a característiques del llenguatge natural com poden ser Cucumber o Robotium. Igualment es poden utilitzar per a tasques com manipular o configurar el sistema sota prova, creació de dades, proves oracle, etc.

Components de Selenium

Els WebDriver es comuniquen amb els navegadors a través de controladors. La comunicació és bidireccional: els WebDriver passen ordres al navegador a través del controlador, i rep informació de nou a través de la mateixa ruta.

Host System Font: Selenium

Els controladors són específics dels navegador, per exemple ChromeDriver simula Google Chrome/Chromium o GeckoDriver simula Mozilla Firefox. El controlador s’executa en el mateix sistema que el navegador.

Selenium GRID

Selenium Grid és un servidor proxy intel·ligent que facilita l’execució de proves en paral·lel en diverses màquines. Això es fa mitjançant la creació d’instàncies remotes de navegadors web a un servidor remot que actua com a concentrador i orquestrador. Aquest concentrador balanceja les peticions a diferents executors distribuïts.

És una solució de programari que serveix per a executar múltiples proves web desde diferents entorns, permetent llançar proves en paral·lel amb diferents versions de navegadors i sistemes operatius.

sistemes operatius

L’objectiu de Selenium Grid és:

  • Proporcionar una forma senzilla d’executar proves en paral·lel en múltiples màquines.

  • Permetre la realització de proves en diferents versions de navegadors.

  • Permetre la realització de proves en diferents plataformes.

AVANTATGES

Selenium Grid ens permet llançar múltiples tests a través de diferents navegadors i màquines en paral·lel. Això assegura que l’aplicació que s’està testant tingui compatibilitat amb un ampli rang de combinacions de navegadors, elevant d’aquesta manera, a un altre nivell, les nostres proves sobre la compatibilitat de l’aplicació en qualsevol entorn. Això suposa un augment significatiu tant en velocitat com l’assegurament de la qualitat.

· Executa múltiples test de manera concurrent.

· Executa múltiples navegadors concurrentment.

· Executa múltiples màquines en paral·lel, augmentant la velocitat d’execució exponencialment.

Selenium Grid ens permet crear una xarxa de màquines connectades, a les quals anomenarem nodes, que estarà controlada per un balancejador (Grid) mitjançant el qual podrem executar el nostre conjunt de proves en els diferents nodes de la nostra xarxa.

Arquitectura de Selenium Grid

Arquitectura Imatge obtinguda de la pàgina oficial

- Encaminador (Router): És el punt d'entrada del Grid on s'envien totes les sol·licituds externes. La primera tasca de l'encaminador és verificar la sessió. Si es tracta d'una sol·licitud de sessió nova, l'encaminador l'agregarà a la cua de sessions. Si la sol·licitud pertany a una sessió existent, l'encaminador enviarà la identificació de la sessió al mapa de sessió, el mapa de sessió retornarà el node on s'està executant la sessió.
- Distribuïdor (Distributor): La seva funció principal és rebre una nova sol·licitud de sessió i trobar un Node adequat on es pugui crear la sessió. Una vegada que es crea la sessió, assigna la identificació de la sessió amb el node on s'executa la sessió en el Mapa de sessió.
- Nodes: És la màquina de proves on es duen a terme les execucions de les prova. El Node es registra en el Distribuïdor a través del Event Bus, i la seva configuració s'envia com a part del missatge de registre. De manera predeterminada, el Node registra automàticament tots els controladors de navegador disponibles en la ruta de la màquina on s'executa. 
- Mapa de sessió (Session Map): és un magatzem de dades que guarda la informació de la identificació de la sessió i el node on s'executa la sessió.
Cua de nova sessió (Session Queue): conté totes les sol·licituds de nova sessió en un ordre FIFO.
Bus d'esdeveniments: el bus d'esdeveniments serveix com una ruta de comunicació entre els nodes, el distribuïdor, la cua de nova sessió i el mapa de sessió. Grid realitza la major part de la seva comunicació interna a través de missatges, evitant costoses anomenades HTTP. En iniciar Grid en la seva manera totalment distribuïda, Event Bus és el primer component que ha d'iniciar-se.
- Cua de sessions (Session Queue): conté totes les sol·licituds de nova sessió en un ordre FIFO.
- Bus d'esdeveniments: el bus d'esdeveniments serveix com una ruta de comunicació entre els nodes, el distribuïdor, la cua de nova sessió i el mapa de sessió. Grid realitza la major part de la seva comunicació interna a través de missatges, evitant costoses anomenades HTTP. En iniciar Grid en la seva manera totalment distribuïda, Event Bus és el primer component que ha d'iniciar-se.

Quan utilitzar Selenium GRID?

Els enginyers de proves han d’utilitzar Selenium Grid en les següents casuístiques:

  • Per a executar proves en múltiples navegadors i versions, diferents dispositius i sistemes operatius

  • Per a reduir el temps que triga un conjunt de proves a completar l’execució.

  • Per a executar suites de proves en paral·lel contra múltiples màquines (anomenades Nodes).

  • Per a conjunts de proves grans i de llarga execució, això escurça el temps d’execució.

    • Selenium Grid millora el temps de resposta dels resultats de les proves. És especialment útil quan el conjunt de proves és gran i porta molt de temps executar-lo. Ofereix flexibilitat i garanteix la màxima cobertura de prova en un temps reduït. Degut a que la infraestructura és virtual, el manteniment es senzill.

Es pot comprovar la millora en el temps d’execució dels scripts basant-nos en un càlcul simple:

Nombre de proves * Temps mitjà de prova / Nombre de nodes = Temps total d’execució

Per exemple:
15      *       45s        /        1        =      11m 15s   // Sense usar Selenium Grid
15      *       45s        /        5        =      2m 15s    // Amb 5 Nodes
15      *       45s        /        15       =      45s       // Amb 15 Nodes
100      *       120s       /        15       =      13m 20s   // Aquesta execució prendria més de 3 hores sense Grid

Requeriments de màquina tester - Standalone

· Java 11 o superior instal·lat.

· Els navegadors que volem provar han d’estar instal·lats.

Els requisits de màquina per a instal·lar Selenium Grid poden variar segons la grandària i la complexitat de les proves, així com la quantitat de nodes “webdriver” que volem utilitzar.

Els requisits de maquinari dependran de la càrrega de proves i el nombre de nodes “webdriver” que planegis executar simultàniament. En general, es recomana:

Mínims Recomenable
RAM 4GB 16GB
CPU 1 processador de doble nucli 4 processadors
Emmagatzematge Suficient per a emmagatzemar registres icaptures de pantalla Suficient per a emmagatzemar registres icaptures de pantalla

Requisits de sistema

Instal·lar Docker:

Assegureu-vos que teniu Docker Compose instal·lat al vostre sistema. Podeu descarregar-lo des del lloc web oficial de Docker o utilitzar un gestor de paquets si està disponible per al vostre sistema operatiu.

Per Windows:

  1. Docker Desktop (recomanat per a Windows 10 Pro, Enterprise o Education): Docker Desktop per a Windows ofereix una interfície gràfica fàcil d’utilitzar per gestionar contenidors a Windows. També inclou Docker Compose. Baixeu i instal·leu Docker Desktop des del lloc web oficial de Docker: Docker Desktop per a Windows.

  2. Docker Toolbox (per a Windows Home o versions anteriors de Windows): Si utilitzeu Windows Home Edition o una versió anterior de Windows, podeu utilitzar Docker Toolbox. Baixeu i instal·leu Docker Toolbox des del lloc web oficial de Docker: Docker Toolbox.

Per MacOs:

  1. Docker Desktop per a Mac (recomanat): Docker Desktop per a Mac ofereix una interfície gràfica fàcil d’utilitzar per gestionar contenidors a macOS. També inclou Docker Compose. Baixeu i instal·leu Docker Desktop per a Mac des del lloc web oficial de Docker: Docker Desktop per a Mac. Baixeu i instal·leu Docker Desktop per a Mac des del lloc web oficial de Docker: Docker Desktop per a Mac.

Per linux:

Els passos d’instal·lació de Docker a Linux poden variar segons la vostra distribució. Aquí hi ha instruccions generals per a algunes distribucions de Linux habituals:

  1. Obriu un terminal.

    sudo apt-get update
    
  2. Actualitzeu la base de dades de paquets:

    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    
  3. Instal·leu les dependències necessàries:

    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    
  4. Afegeix la clau GPG oficial de Docker:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
  5. Afegiu el repositori Docker:

    echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  6. Torneu a actualitzar la base de dades de paquets:

    sudo apt-get update
    
  7. Instal·leu Docker:

    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    
  8. Inicieu i activeu el servei Docker:

    sudo systemctl start docker
    sudo systemctl enable docker
    

Instal·lar JDK:

  1. Si encara no ho heu fet, descarregueu i instal·leu un Java Development Kit (JDK) al vostre sistema. Podeu descarregar el JDK des del lloc web d’Oracle o utilitzar un JDK de codi obert com OpenJDK. Download the latest Jave LTS Free.

  2. Estableix la variable d’entorn JAVA_HOME

    • Feu clic amb el botó dret a “Aquest PC” o “El meu ordinador” (segons la vostra versió de Windows) i seleccioneu “Propietats”.
    • Feu clic a “Configuració avançada del sistema” a la part esquerra.
    • A la finestra Propietats del sistema, feu clic al botó “Variables d’entorn”.
    • A la secció “Variables del sistema”, feu clic a “Nou” per crear una nova variable del sistema.
    • Estableix el nom de la variable a JAVA_HOME.
    • Establiu el valor variable al camí del vostre directori d’instal·lació de JDK. Per exemple, si heu instal·lat el JDK a C:\Program Files\Java\jdk1.8.0_301, establiu el valor variable en aquest camí.
    • Feu clic a “OK” per desar la variable d’entorn.
  3. Actualitzeu la variable d’entorn PATH:

    • Encara a la finestra “Variables d’entorn”, cerqueu la variable “Camí” a la secció “Variables del sistema” i feu clic a “Edita”.
    • Afegiu el directori %JAVA_HOME%\bin al principi de la llista. Això garanteix que el directori bin del JDK estigui al PATH del sistema.
    • Feu clic a “D’acord” per desar els canvis.
  4. Verifiqueu la configuració:

    • Obriu una nova finestra de l’indicador d’ordres o de PowerShell.
    • Escriviu java -version per verificar que Java està instal·lat correctament i que fa servir el JDK (no el JRE).

Formes d’Instal·lació

    Tradicionalment, Grid s'ha executat com dues peces conceptuals: el Hub i un o més Nodes. Hi ha diferents maneres d'executar les imatges i crear el GRID amb un hub i nodes.

Utilizant Docker Compose [recomanació] Creeu un fitxer docker-compose.yml al directori del vostre projecte. Aquest fitxer definirà els serveis, xarxes i volums necessaris per a la vostra aplicació. Aquí teniu un exemple bàsic:

  1. Creeu un fitxer Docker Compose:

    version: "3"
    services:
    chrome:
        image: selenium/node-chrome:4.10.0
        shm_size: 2gb
        depends_on:
        - selenium-hub
        environment:
        - SE_EVENT_BUS_HOST=selenium-hub
        - SE_EVENT_BUS_PUBLISH_PORT=4442
        - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
        - SE_NODE_MAX_INSTANCES=5
        - SE_NODE_MAX_SESSIONS=5
        - SE_NODE_SESSION_TIMEOUT=180
    
    
    edge:
        image: selenium/node-edge:4.10.0
        shm_size: 2gb
        depends_on:
        - selenium-hub
        environment:
        - SE_EVENT_BUS_HOST=selenium-hub
        - SE_EVENT_BUS_PUBLISH_PORT=4442
        - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
        - SE_NODE_MAX_INSTANCES=1
        - SE_NODE_MAX_SESSIONS=1
        - SE_NODE_SESSION_TIMEOUT=180
    
    
    firefox:
        image: selenium/node-firefox:4.10.0
        shm_size: 2gb
        depends_on:
        - selenium-hub
        environment:
        - SE_EVENT_BUS_HOST=selenium-hub
        - SE_EVENT_BUS_PUBLISH_PORT=4442
        - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
        - SE_NODE_MAX_INSTANCES=3
        - SE_NODE_MAX_SESSIONS=3
        - SE_NODE_SESSION_TIMEOUT=180
    
    
    selenium-hub:
        image: selenium/hub:4.10.0
        container_name: selenium-hub
        ports:
        - "4442:4442"
        - "4443:4443"
        - "4444:4444"
    Els valors
            SE_NODE_MAX_INSTANCES=5
            SE_NODE_MAX_SESSIONS=5
    Indiquen el nombre d'instàncies de cada navegador i el nombre de sessions màximes actives per cada navegador en paral·lel.
    
  2. Aixeca la arquitectura de serveis definida en el YAML anterior:

    anar a la direcció on es troba en fitxer .yml i executar docker-compose -f docker-compose-v3.yml up -d --scale chrome=3 --scale firefox=3 --scale edge=1

    Els valors de cada navegador indiquen el nombre de nodes (contenidors) per cada navegador.

    Docker Compose

  3. Amb la següent ordre es pot veure els contenidors aixecats a la teva màquina local:

    Docker Compose

  4. Accedir a la WebUI de Selenium Grid Ir a la dirección: http://localhost:4444/ui

    Docker Compose

  5. Elimina els serveis prèviament aixecats docker-compose -f docker-compose-v3.yml down

  6. Encara que no és necessari per a un entorn de ‘testing’, si es requereix desplegar l’arquitectura completa descrita en el apartat anterior, s’hauria d’utilitzar el següent .yaml:

        version: "3"
        services:
        selenium-event-bus:
            image: selenium/event-bus:4.12.1-20230920
            container_name: selenium-event-bus
            ports:
            - "4442:4442"
            - "4443:4443"
            - "5557:5557"
    
    
        selenium-sessions:
            image: selenium/sessions:4.12.1-20230920
            container_name: selenium-sessions
            ports:
            - "5556:5556"
            depends_on:
            - selenium-event-bus
            environment:
            - SE_EVENT_BUS_HOST=selenium-event-bus
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    
    
        selenium-session-queue:
            image: selenium/session-queue:4.12.1-20230920
            container_name: selenium-session-queue
            ports:
            - "5559:5559"
    
    
        selenium-distributor:
            image: selenium/distributor:4.12.1-20230920
            container_name: selenium-distributor
            ports:
            - "5553:5553"
            depends_on:
            - selenium-event-bus
            - selenium-sessions
            - selenium-session-queue
            environment:
            - SE_EVENT_BUS_HOST=selenium-event-bus
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
            - SE_SESSIONS_MAP_HOST=selenium-sessions
            - SE_SESSIONS_MAP_PORT=5556
            - SE_SESSION_QUEUE_HOST=selenium-session-queue
            - SE_SESSION_QUEUE_PORT=5559
    
    
        selenium-router:
            image: selenium/router:4.12.1-20230920
            container_name: selenium-router
            ports:
            - "4444:4444"
            depends_on:
            - selenium-distributor
            - selenium-sessions
            - selenium-session-queue
            environment:
            - SE_DISTRIBUTOR_HOST=selenium-distributor
            - SE_DISTRIBUTOR_PORT=5553
            - SE_SESSIONS_MAP_HOST=selenium-sessions
            - SE_SESSIONS_MAP_PORT=5556
            - SE_SESSION_QUEUE_HOST=selenium-session-queue
            - SE_SESSION_QUEUE_PORT=5559
    
    
        chrome:
            image: selenium/node-chrome:4.12.1-20230920
            shm_size: 2gb
            depends_on:
            - selenium-event-bus
            environment:
            - SE_EVENT_BUS_HOST=selenium-event-bus
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    
    
        edge:
            image: selenium/node-edge:4.12.1-20230920
            shm_size: 2gb
            depends_on:
            - selenium-event-bus
            environment:
            - SE_EVENT_BUS_HOST=selenium-event-bus
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    
    
        firefox:
            image: selenium/node-firefox:4.12.1-20230920
            shm_size: 2gb
            depends_on:
            - selenium-event-bus
            environment:
            - SE_EVENT_BUS_HOST=selenium-event-bus
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    

Xarxes en entorn contenidoritzat

El Hub i els Nodes es crearan en la mateixa xarxa i es reconeixeran entre si pel nom del seu contenidor.

maOS/Linux

  • Per a la primera vegada que es configura Docker, crear la xarxa oportuna.

docker network create grid

  • Executar la sentència ‘docker run’ pel Hub.

docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.10.0

- Executar la sentència ‘docker run’ per a cada node (navegadors).

        $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
            --shm-size="2g" \
            -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
            -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
            selenium/node-chrome:4.12.1-20230912
        $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
            --shm-size="2g" \
            -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
            -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
            selenium/node-edge:4.12.1-20230912
        $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
            --shm-size="2g" \
            -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
            -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
            selenium/node-firefox:4.12.1-20230912

Windows PowerShell

    $ docker network create grid
    $ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.12.1-20230912
    $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub `
        --shm-size="2g" `
        -e SE_EVENT_BUS_PUBLISH_PORT=4442 `
        -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
        selenium/node-chrome:4.12.1-20230912
    $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub `
        --shm-size="2g" `
        -e SE_EVENT_BUS_PUBLISH_PORT=4442 `
        -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
        selenium/node-edge:4.12.1-20230912
    $ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub `
        --shm-size="2g" `
        -e SE_EVENT_BUS_PUBLISH_PORT=4442 `
        -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
        selenium/node-firefox:4.12.1-20230912

Quan acabeu d’utilitzar la graella i els contenidors han sortit, la xarxa es pot eliminar amb la següent ordre:

        # Removes the grid network
        $ docker network rm grid

Quick start (Local Machine not Dockerized) STANDALONE [recomanació]

  1. Baixeu Selenium Server (Grid)
  2. Baixeu la versió compatible amb Chrome, Firefox i Edge

  3. Baixeu els controladors web per a cada navegador Avís!!! Comproveu les versions compatibles entre el navegador i el controlador web.

  4. Comprovació del fitxer d’estructura

    Docker Compose
    De manera alternativa, podem allotjar els drivers de manera separada del fitxer selenium-server. En aquest cas, hem d’incloure en la variable d’entorn PATH la ruta on es troben els drivers.

    LINUX/MAC

    Per a veure quins directoris ja hi ha al PATH, obriu un Terminal i executeu:

        echo $PATH
    

    Si la ubicació del controlador no es troba en un directori llistat, podeu afegir un directori nou al PATH:

        echo 'export PATH=$PATH:/path/to/driver' >> ~/.bash_profile
        source ~/.bash_profile
    

    Podeu provar si s’ha afegit correctament comprovant la versió del controlador:

        chromedriver --version
    

    WINDOWS

    Per a veure quins directoris ja hi ha al PATH, obriu una ordre Pregunta i executeu:

        echo %PATH%
    

    Si la ubicació del controlador no es troba en un directori llistat, podeu afegir un directori nou al PATH:

        setx PATH "%PATH%;C:\WebDriver\bin"
    

    Podeu provar si s’ha afegit correctament comprovant la versió del controlador:

        chromedriver.exe --version
    
  5. Obrir un terminal i aneu on hi ha i executeu-lo Iniciar el ‘.jar’ de Selenium GRID, des d’un terminal, en mode ‘standalone’.

    java -jar selenium-server-4.10.0.jar standalone
    

    Docker Compose

  6. Una vegada instal·lat, connectar amb la URL:

    http://localhost:4444/ui

    Docker Compose

Quick start (Local Machine not Dockerized) –selenium-manager true

Aquesta opció et carrega els controladors web automàticament sense que tu tinguis que baixar prèviament. Esta version esta en fase beta, pot fallar.

  1. Obriu un terminal i aneu on hi ha i executeu-lo

    Iniciar Selenium GRID des d’una interfície de línia de comandos (CLI)

    java -jar selenium-server-4.10.0.jar standalone --selenium-manager true

    Docker Compose

  2. Una vegada instal·lat, connectar amb la URL:

    http://localhost:4444/ui

    Docker Compose
    Docker Compose