martes, 15 de abril de 2025

Esperar a que un elemento desaparezca en Playwright (Manual)

 Buenas lectores.

En este post vamos a observar dos cosas, la primera como hacer un condicional o ciclo para que la automatización espere hasta que un elemento ya no sea visible y adicional observaremos como realizar un control a una acción sin que se detenga nuestra automatización:

 

let visible = await page.locator('#btn').isVisible();  
  while (visible) {    
    try {
    await page.locator('#btn').click({ timeout: 1000 });    
    } catch (error) {
      console.error('El elemento no se encontró o no se pudo hacer clic en él.');
    }
    visible = await page.locator('#btn').isVisible();
    console.log(visible);
  }  


Observamos lo siguiente:

Almacenamos en la variable visible el valor booleando que nos retorna si es visible o no.

Mientras es visible tratamos de dar un clic a un elemento, en caso que ya no sea visible por los milisegundos, al estar dentro del try nos retorna que ya no lo puede ver y sigue el proceso.

De esta manera tan simple podemos controlar y esperar que algunos controles que se resisten a seguir con las funciones normales que nos ofrece el framework se controlen.

Saludos.


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/01/como-tener-un-condicional-en-playwright.html

Tiempo de espera muerto / estático / explicito en Playwright

 Buenas lectores.

En ocasiones necesitamos esperar un tiempo específico debido a que no contamos con alguna referencia o elemento que nos facilite seguir con el proceso. En estos casos usamos tiempos muertos los cuales no son buenos, nadie los quiere pero algunas veces son necesarios.


await page.waitForTimeout(1000);


Cabe anotar que el tiempo es en milisegundos como casi en todas las herramientas, en este caso es equivalente a esperar 1 segundo. Es decir, si quieres que espere 2 segundos sería 2000, 3 segundos = 3000.


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/01/tiempo-de-espera-muerto-explicito-en.html

Elementos SVG y/o mapas con selenium en python

 Buenas lectores

Un reto muy interesante que se nos puede presentar es cuando tratamos de interactuar con elementos en un mapa o en un gráfico, normalmente los encontramos como SVG.

El resto consiste en que normalmente no encuentra los elementos a pesar de que hagamos correctamente el cambio al iframe donde se supone están los controles. Es algo complicado y puede llegar a frustrarnos.

Soluciones hay varias, pero hoy vamos a usar las mas comunes y mas estables.


Usando xpath:

//div[@id="map"]//*[name()="svg"]/*[name()="g"]

//div[@id="map"]//*[name()="svg"]/*[name()="g"]/*[name()="image"]


En muchas ocasiones no funciona el xpath, esto porque pareciera que los elementos no están en el DOM o por lo menos , no en el orden que los vemos ya construidos. Para esos casos podemos recurrir a CSS

En este ejemplo vamos a capturar todos los puntos del mapa y luego los recorremos pulsando click sobre cada uno de ellos:


from selenium import webdriver

driver.get("tu_url_aquí")

elements = driver.find_elements_by_css_selector('[id^="OpenLayers.Geometry.Point_"]')

for element in elements:

    element.click()


Con esto podemos interactuar con todos los elementos del mapa, recuerdo agregar un try y catch por cada click debido a que puede que encuentre elementos los cuales no sean interactuables.


Saludos


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/02/como-interactuar-con-elementos-svg-yo.html

Como hacer click a un elemento escondido en Playwright

 Buenas lectores.

En la mayoria de frameworks que se usan para automatizar pruebas funcionales encontramos funciones que nos permiten realizar click forzados, esto es necesario cuando un elemento se encuentra oculto y necesitamos ejecutarlo. Normalmente esto no debería funcionar así puesto que un usuario no puede ver elementos ocultos pero... a veces es nuestra magía para poder simular a nuestro usuario final (enredado lo sé).


En todo caso, cuando necesitamos hacerlo usando js es cuando se complica un poco, sin embargo existe una funcion que simula el click y nos puede sacar de los apuros:


page.getByTestId('#id').dispatchEvent("click");


Cuando necesitamos pulsar un botón y este se resista pero es visible, podemos usar el force:


click("//button[contains(@id, 'secondaryDownload')]", { force: true })


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/02/como-hacer-click-un-elemento-escondido.html

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 puede interpretar, sin embargo quieres una solución sin hacer los asserts manuales simplemente actualiza el IDE, con eso funciona.

En caso que te guste mi solución, recuerda agregar las librerias y las importaciones:

import static net.serenitybdd.screenplay.GivenWhenThen.seeThat;

import static net.serenitybdd.screenplay.actors.OnStage.theActorInTheSpotlight;

import static org.hamcrest.CoreMatchers.*;

import net.serenitybdd.screenplay.questions.Visibility;


Saludos.


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/02/que-hacer-cuando-la-libreria-ensure-de.html

Ejecutar un proyecto de Jmeter que usa Kafka desde azure devops

Buenas lectores.

Existen varias maneras de ejecutar Jmeter desde azure, sea integrado, sea como tarea para descargarlo, sea como maven, en fin, todo depende de tu necesidad. El problema es cuando usamos librerias que no están incluidas normalmente en Jmeter, aquí se nos dificulta un poco nuestra tarea de ejecutar nuestros scritps.

De momento no existe una manera optima de realizar el proceso, es decir, puedes simplemente agregando en tu pipeline la opción que descargue Jmeter y luego copias tus librerias a la carpeta de lib/ext , sin  embargo el proceso de descarga es lento , yo opté por tener todo versionado usando una versión fija y estandarizada para los procesos internos, así evito en el mismo pipeline problemas de descarga y configuraciones que siempre van a ser las mismas. La contra es que el proyecto se vuelve más pesado y demasiado estático, sin embargo, en mi caso es la más optima.

Los pasos son sencillos:

1- Subo el proyecto a azure repos, si no lo sabes hacer ya tengo un post relacionado con eso.

2- Creo un pipeline y le agrego una tarea cmd, en la línea de comandos ingresamos lo siguiente:

jmeter -n -t "$(Build.SourcesDirectory)/bin/projects/Trip/Genertor_Trip.jmx"

3- Ejecutamos

El archivo yml quedaría de la siguiente manera:

steps:

- script: 'jmeter -n -t "$(Build.SourcesDirectory)/bin/projects/Recorrido_Diario/Generar_Recorrido.jmx"'

  workingDirectory: bin

  displayName: 'Generate_Report'

Cabe anotar que le estamos diciendo que el workingDirectory sea el bin, esto para poder ejecutar directamente con la palabra jmeter, tu lo puedes configurar a tu antojo.

Adicional te dejo muchas fuentes para que pases una tarde entretenida resolviendo dudas que te vayan resultado.


Cordial saludo


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/02/ejecutar-un-proyecto-de-jmeter-que-usa.html

jueves, 13 de febrero de 2025

Soft Asserts: La Clave para una Automatización de Pruebas Más Flexible y Robusta

 La automatización de pruebas ha revolucionado la forma en que desarrollamos y mantenemos software, proporcionando velocidad y precisión que simplemente no son posibles con las pruebas manuales. Sin embargo, cuando se trata de validar múltiples condiciones dentro de una prueba, el uso de aserciones tradicionales puede ser limitante. Aquí es donde entran en juego los soft asserts.

¿Qué son los Soft Asserts?

Los soft asserts o aserciones suaves son una técnica utilizada en la automatización de pruebas que permite que una prueba continúe su ejecución incluso después de que una aserción falle. A diferencia de las aserciones tradicionales (hard asserts), que detienen inmediatamente la ejecución de la prueba cuando una condición no se cumple, los soft asserts permiten que todas las aserciones se evalúen y reporten al final de la ejecución de la prueba.

Ventajas de los Soft Asserts

  1. Identificación Completa de Errores: Una de las mayores ventajas de los soft asserts es que permiten identificar y reportar múltiples fallos dentro de una sola ejecución de prueba. Esto proporciona una visión más completa de los problemas que puedan existir en el código.

  2. Mejora en el Análisis de Resultados: Al permitir que todas las aserciones se ejecuten, los soft asserts facilitan un análisis más profundo y detallado de los resultados de las pruebas. Esto es especialmente útil en entornos donde se ejecutan múltiples pruebas automatizadas de manera concurrente.

  3. Aumento de la Eficiencia: Al no detener la ejecución de la prueba ante el primer fallo, se evita la necesidad de ejecutar la prueba múltiples veces para identificar todos los posibles errores. Esto resulta en una mayor eficiencia y ahorro de tiempo.

  4. Reducción del Estrés: Para los desarrolladores y testers, trabajar con aserciones suaves reduce el estrés de tener que lidiar con pruebas que fallan constantemente. En lugar de enfrentarse a pruebas fallidas por un único error, pueden centrarse en corregir múltiples errores de una sola vez.

¿Cuándo Utilizar los Soft Asserts?

Los soft asserts son especialmente útiles en los siguientes escenarios:

  1. Pruebas de Integración: Cuando se realizan pruebas de integración, es posible que quieras verificar múltiples aspectos de la integración sin detener la prueba en el primer fallo. Los soft asserts permiten validar todas las condiciones necesarias y reportar los resultados al final.

  2. Pruebas de UI: En pruebas de interfaz de usuario, donde es crucial verificar varios elementos y condiciones, los soft asserts garantizan que todas las validaciones se realicen, proporcionando una visión completa de la experiencia del usuario.

  3. Pruebas Complejas: En pruebas que involucran múltiples pasos o condiciones, los soft asserts aseguran que todas las condiciones sean evaluadas, facilitando la identificación de múltiples problemas en una sola ejecución.

Implementación de los Soft Asserts

Implementar soft asserts puede variar dependiendo de la herramienta o marco de trabajo que estés utilizando. Aquí tienes un ejemplo básico en Java con TestNG:

import org.testng.asserts.SoftAssert;

import org.testng.annotations.Test;


public class SoftAssertExample {


    @Test

    public void testSoftAsserts() {

        SoftAssert softAssert = new SoftAssert();


        System.out.println("Checking the first condition...");

        softAssert.assertTrue(false, "First condition failed");


        System.out.println("Checking the second condition...");

        softAssert.assertEquals("actual", "expected", "Second condition failed");


        System.out.println("All conditions checked.");

        softAssert.assertAll(); // Report all failures at the end of the test

    }

}



En este ejemplo, ambas condiciones son evaluadas y los resultados se reportan al final de la prueba, en lugar de detenerse en la primera falla.


En caso de estar usando SerenityBDD podemos usar softasserts de la siguiente manera:

theActorInTheSpotlight().should(

seeThat(Visibility.of(LocationInfoWindowView.LBL_STATUS_LASTREPORT), is(false)),

seeThat(Visibility.of(LocationInfoWindowView.LBL_LASTREPORT), is(false)));

Solo ten en cuenta importar las librerias que son:


import static net.serenitybdd.screenplay.GivenWhenThen.seeThat;

import static net.serenitybdd.screenplay.actors.OnStage.theActorInTheSpotlight;

import static org.hamcrest.CoreMatchers.*;

import net.serenitybdd.screenplay.questions.Visibility;


Los soft asserts son una herramienta poderosa en la automatización de pruebas, proporcionando flexibilidad y permitiendo un análisis más exhaustivo de los errores. Al incorporarlos en tus pruebas, puedes mejorar significativamente la eficiencia y efectividad de tus suites de pruebas.


Fuentes:

https://automatizaciondefuncionales.blogspot.com/2024/02/que-hacer-cuando-la-libreria-ensure-de.html

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

https://github.com/serenity-bdd/serenity-screenplay-train-demo/blob/master/src/test/java/serenitylabs/tutorials/trains/features/steps/BuyTicketsStepDefinitions.java

https://serenity-bdd.info/docs/articles/soft-asserts.html