Como capturar los responses que hace el sitio mientras automatizamos el frontend

Buenas lectores.

Cuando estamos automatizando y por algún motivo la interfaz presenta error y/o se queda sin permitir ninguna acción; no es suficiente con reportar el bug puesto que en la mayoría del tiempo esto ocurre de manera aleatoria.

Para esto, es mejor estar preparados e imprimir la mayor cantidad de información que le permitan al desarrollador de la aplicación saber que pudo suceder en ese momento. Una forma facil y muy util es imprimir todas las peticiones que se envían por backend para saber si en algún momento algún servicio deja de funcionar. Para lograrlo vamos a interactuar con el devtools de chrome, cabe destacar que para poder usarlo debemos tener como mínimo Selenium v4.

Vamos al ejemplo:


Selenium directo:

 import java.time.Duration;

import java.util.HashMap;

import java.util.Optional;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.chrome.ChromeOptions;

import org.openqa.selenium.devtools.HasDevTools;

import org.openqa.selenium.devtools.v114.network.Network;

import org.openqa.selenium.devtools.v114.network.model.Request;

public class RequestChrome {

      public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver","./src/resources/drivers/chromedriver.exe");

        ChromeOptions options = new ChromeOptions();

        options.addArguments("--remote-allow-origins=*");

        WebDriver driver = new ChromeDriver(options);

        driver.manage().window().maximize();    

        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));

        org.openqa.selenium.devtools.DevTools devTool = ((HasDevTools) driver).getDevTools();

       devTool.createSession();       

       devTool.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));

       devTool.addListener(Network.responseReceived(), requestSent -> {

             System.out.println("URL => " + requestSent.getResponse().getUrl());

             System.out.println("Status => " + requestSent.getResponse().getStatus());

             System.out.println("Headers => " + requestSent.getResponse().getHeaders().toString());

             System.out.println("------------------------------------------------------");

       });

       driver.get("https://www.programsbuzz.com");

    }

}


Usando serenity y screenplay:


import org.openqa.selenium.devtools.v114.network.Network;

import org.openqa.selenium.devtools.v114.performance.Performance;

import org.openqa.selenium.devtools.v114.performance.model.Metric;

import net.serenitybdd.screenplay.Performable;

import net.serenitybdd.screenplay.Task;

import net.serenitybdd.screenplay.actions.WithDevTools;

public static Performable activeResponse() {

        return Task.where("Active devtools responses",               

                            WithDevTools.perform(

                                    devTools -> {

                                        devTools.createSession();                                        devTools.send(Network.enable(Optional.empty(),Optional.empty(),Optional.empty()));                                         devTools.addListener(Network.responseReceived(), responseReceived -> {                                

                                        logger.info("URL => {}",responseReceived.getResponse().getUrl());

                                        logger.info("Status => {}" ,responseReceived.getResponse().getStatus());

                                        logger.info("Headers => {}" ,responseReceived.getResponse().getHeaders());

                                        logger.info("------------------------------------------------------");

                                        });

                                   }

                            )

        );

    }


Fuentes:

https://www.programsbuzz.com/article/selenium-intercept-response

https://jar-download.com/artifacts/org.seleniumhq.selenium/selenium-devtools-v101/4.1.4/source-code/org/openqa/selenium/devtools/v101/network/model/Response.java

https://stackoverflow.com/questions/68668853/how-to-get-the-response-body-from-network-tab-using-selenium-4-devtools

https://www.youtube.com/watch?v=HtBhLdZ19iQ

https://serenity-bdd.github.io/docs/screenplay/screenplay_webdriver



Comentarios

Entradas populares de este blog

Tiempo de espera "muerto" explicito en Playwright

SerenityBDD - Almacenar valores en memoria (pasar información entre steps)

Subir mi proyecto local a Azure repos