Entradas

Mostrando las entradas etiquetadas como SerenityBDD

Que hacer cuando la librería Ensure de serenitybdd te comienza a molestar

Buenas lectores. Me he encontrado con casos particulares usando la librería Ensure en el IDE de IntelliJ, es posible que se presente en cualquier otro IDE por consiguiente antes de investigar la razón mejor hice una migración al assert para no tener problemas a futuro. Podemos tener algo así: jadcode . attemptsTo ( Ensure . that ( ElementLocated . by ( "#firstName" ) ) . isDisplayed ( ) ) ; Lo podemos cambiar por lo siguiente: theActorInTheSpotlight () . should ( seeThat ( Visibility . of ( LocationForm . FIRST_NAME ) , is ( true ))) ; Si quedamos que no este visible y usando softasserts, sería de la siguiente forma: theActorInTheSpotlight () . should ( seeThat ( Visibility . of ( LocationInfoWindowView . LBL_STATUS_LASTREPORT ) , is ( false )) , seeThat ( Visibility . of ( LocationInfoWindowView . LBL_LASTREPORT ) , is ( false ))) ; Se puede observar que migramos el código a una forma común que todo IDE pu...

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.HasDevTool...

Como capturar el response cuando estamos trabajando con SerenityBDD, RestAssured y screenplay

Buenas lectores Alguna vez te has preguntado como puedo imprimir en consola o ver la respuesta de una petición a un servicio cuando estamos usando screenplay?, normalmente en la documentación encontramos lo siguiente: @Test public void list_all_users() {     Actor sam = Actor.named("Sam the supervisor")                      .whoCan(CallAnApi.at(theRestApiBaseUrl));     sam.attemptsTo(             Get.resource("/users")     );     sam.should(             seeThatResponse("all the expected users should be returned",                     response -> response.statusCode(200)                                         .body("data.first_name", hasItems("George", "Janet", "Emma")))     ...

Como configurar el tamaño de la ventana de chrome cuando lanzas una automatización con SerenityBDD

Buenas lectores. Cuando lanzamos nuestra automatización en modo "background" siempre se envía un tamaño de ventana por defecto, esto hace que algunos escenario fallen por ser una pantalla pequeña. Para solucionar o manipular el tamaño simplemente enviamos por medio de chromeoptions el tamaño deseado de la siguiente forma: ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--window-size=1300,1000"); Cuando trabajamos con SerenityBDD tenemos la ventaja que el mismo nos levanta la sesión, para manipular el tamaño simplemente agregamos al serenity.conf lo siguiente: "goog:chromeOptions" {         args = ["start-maximized", "no-sandbox", "ignore-certificate-errors", "disable-popup-blocking","headless"," --window-size=1920,1080 "                 "disable-default-apps", "disable-extensions-file-access-check", "disable-infobars", "disable-gpu...

Como hacer que las ejecuciones de las pruebas en serenitybdd salgan por un proxy

Buenas lectores. Cuando necesitamos que nuestra ejecución de las pruebas salga por un proxy, generamos algo parecido a esto:     Proxy proxy = new Proxy();     proxy.setAutodetect(false);     proxy.setHttpProxy("localhost:8092");     proxy.setSslProxy("localhost:8092");     ChromeOptions chromeOptions = new ChromeOptions();     chromeOptions.addArguments("--ignore-certificate-errors");     chromeOptions.setCapability(CapabilityType.PROXY, proxy);     chromeOptions.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);     chromeOptions.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);     driver = new FirefoxDriver(chromeOptions);     driver.get(URL); El problema radica cuando usamos SerenityBDD puesto que el automaticamente lanza el driver de acuerdo a la configuración que tengamos, por ende, si accedemos al driver y le enviamos este nuevo, el genera otra instancia... y...

Error en consola cuando se ejecuta serenitybdd Invalid Status code=403 text=Forbidden

Buenas lectores. Ejecutando algunos proyectos me he encontrado con el error del título de este post. Resulta que la última actualización de selenium exige ciertos parámetros nuevos de configuración. Para no entrar al detalle e ir directamente a la solución, debemos hacer lo siguiente en el archivo de serenity.conf serenity { encoding = "UTF-8" compress.filenames = true take.screenshots = FOR_EACH_ACTION } webdriver { driver = chrome autodownload = true capabilities { "goog:chromeOptions" { args = [ "start-maximized", "test-type", "no-sandbox", "lang=es", "disable-popup-blocking", "disable-download-notification", "ignore-certificate-errors", "allow-running-insecure-content", "disable-translate", "always-authorize-plugins", "disable-extensions","remote-allow-origins=*"] } } } Con esto se arregla el error, pued...

Extraer el texto de un control oculto (hidden)

Buenas lectores. En ocasiones necesitamos traer el texto de un elemento que se encuentra oculto al usuario, esto por facilidad en algunas operaciones o simplemente el desarrollador almacena algun identificador o valor que vamos a necesitar mas adelante. En estos escenarios que son "atipicos" tambien necesitamos soluciones de las mismas características puesto que al ser un elemento invisible no podemos interactuar con el con un simple getText. Para esto la solución es sencilla, recurrimos a nuestra siempre confiable (la vieja confiable) javascript. Vamos a traernos el atributo del texto: Si usamos screenplay: WebElementFacade element = target.resolveFor(actor); String value = BrowseTheWeb.as(actor).evaluateJavascript("return arguments[0].innerText;", element).toString().trim(); Si estamos usando POM  @FindBy(id="color") WebElementFacade colorDropdown; String value = colorDropdown.getAttribute("innerText") Si estamos usando Selenium directo String ...

Como trabajar con iframes manteniendo la arqutiectura de screenplay

Buenas lectores. A estas alturas alguno en determinado momento le ha sacado tiempo un iframe, estas pequeñas piedras en el zapato que nos diculta la fluidez de interactuar con los elementos de la web. En la mayoria de veces que me he enfrentado con los iframes ha sido en sitios algo viejos y por lo tanto las automatizaciones estaban desarrollada bajo el page object model. Actualmente es mucho mas fluido trabajar con screnplay es por eso que hoy vamos a revisar como lo podemos hacer. Lo primero es determinar que todo en screenplay lo trabajamos por Targets, a diferencia de page object model que todo son WebElementFacade que en sí es casi un WebElement pero con esteroides. Para crear nuestro iframe como target usamos lo siguiente: private static IFrame PROFILE_MARCO = IFrame.withPath(By.id("ib-iframe-messaging")); y para buscar un elemento dentro del iframe public static final Target TITTLE_MARCO = Target.the("icon Marco over map").inIFrame(PROFILE_MARCO).locatedBy(...

Cambiar el thread.sleep para no tener deuda técnica

Buenas lectores. Siempre en nuestras automatizaciones nos encontramos con el problema que el robot cuando se ejecuta va muy rápido, esto ocasiona que los test fallen. En esta situación necesitamos que el robot espere algún elemento para poder continuar la ejecución de forma correcta. Existen muchas formas de poder lograrlo, aquí algunos ejemplos usando SerenityBDD: Con screenplay: Ejemplo 1: jadcode.attemptsTo( WaitUntil.the(LocationForm.BTN_CREATE,isVisible()).forNoMoreThan(2).seconds(), Click.on(LocationForm.BTN_CREATE));   Ejemplos 2: jadcode.attemptsTo(Click.on(LocationForm.BTN_CREATE).afterWaitingUntilEnabled()); jadcode.attemptsTo(Click.on(LocationForm.BTN_CREATE).afterWaitingUntilPresent()); Ejemplo 3: jadcode.attemptsTo(Click.on(LocationForm.BTN_CREATE.waitingForNoMoreThan(Duration.ofSeconds(2)))); Con pageobject: Ejemplo 1: waitForPresenceOf("//h2[.='A title that is not immediately visible']"); Ejemplo 2: waitFor("//h2[.='A title that is not immedia...

Invocar un actor en cualquier parte de la automatización con serenityBDD

Buenas lectores. Alguna vez han necesitado invocar el actor en algún punto de la automatización que no sea en los steps? por ejemplo: WebElement element = MAP_ROUTE.of(MAP_ROUTE_NAME_MAP).resolveFor( currentActor() ).getElement(); Como pueden observar necesitemos resolver un target pero resulta que en la clase o método no recibimos ningún actor. Existen diferentes formas de abordar el problema, de momento para limitar a lo más común voy a citar 3 ejemplos: 1. Recibir el Actor en el método: Con esto solucionamos directamente nuestro problema y sin mayores contratiempos  public WebElement traerMapa (Actor actor){  return MAP_ROUTE.of(MAP_ROUTE_NAME_MAP).resolveFor(actor).getElement(); } El problema es que no es una buena práctica, con solo pensar que ya se vuelve un parámetro de entrada ya sabemos como pinta la cosa. 2. Recibir el Actor por almacenamiento: Si ya has visto mi blog encontraras muy familiar la siguiente manera de resolver el problema En el step almacenamos el actor...

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

Buenas lectores. En algunas ocasiones nos encontramos con la necesidad de almacenar algún valor para luego ser usado en otro sitio, algunos ejemplos son: Pasar información entre clases Persistir valores  Pasar información entre los steps  Cabe aclarar que existen muchas formas de solucionar esta necesidad, sin embargo, hoy la idea es ligarnos directamente al framework de SerenityBDD. Para esto tenemos dos formas más comunes de hacelo. 1. Usando variables globales Primero almacenamos el valor que necesitamos en la memoria de Serenity, esto aplica para cualquier valor, es decir, variables (String, int, boolean), clases, listas etc... Almacenar el valor: Serenity.setSessionVariable("User Name").to("Jane"); Explicación de la sintaxis: Serenity.setSessionVariable : Invoca la sesión para almacenar ("User Name") : Define el nombre de la asignación  Extraer el valor: Lo unico que resta es traer el valor por medio del identificador  String currentUserName = Sereni...

Como generar código Selenium de forma automática y sin conocimientos de desarrollo

Imagen
Buenas lectores. La forma tradicional de autogenerar código de automatización de pruebas sin conocimientos de desarrollo o de automatización era usando Selenium IDE, hoy veremos otra forma de hacerlo mucho más actualiazada y que promete enormemente revolucionar la industria. Pero primero miremos como era la forma tradicional: 1. Selenium IDE Selenium IDE es un plugin que se encuentra integrado en el navegador que nos permite ir generando el código de automatización a medida que realizamos la prueba funcional. Cuando terminamos de realizar la prueba funcional el resultado es que validamos nuestra prueba y adicional tenemos la prueba automatizada para realizar nuestros retest o regresiones. El código generado luce de la siguiente manera: Cada comando se va generando a partir de las acciones que vayamos realizando en el navegador. Finalmente si necesitamos generar automatizaciones con mayor robustes simplemente lo exportamos a nuestro lenguaje favorito y listo. 2. ChatGPT (Inteligencia ar...