Mostrando entradas con la etiqueta Selenium. Mostrar todas las entradas
Mostrando entradas con la etiqueta Selenium. Mostrar todas las entradas

martes, 15 de abril de 2025

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

domingo, 29 de diciembre de 2024

Selenium 4.27 - Deprecación del método getAttribute

¡Hola lectores!

Si has actualizado a Selenium 4.27 y te has llevado la sorpresa de que al usar el método getAttribute aparece como deprecado, no te preocupes. Aquí te explico qué debes hacer para actualizarte y, sobre todo, cómo mantener tu código limpio y sin deuda técnica.

¿Qué es el método getAttribute?

El método getAttribute ha sido una herramienta fundamental en Selenium para obtener el valor de un atributo de un elemento HTML. Por ejemplo, si querías obtener el valor de un campo de entrada, usarías getAttribute("value").

¿Por qué está siendo deprecado?

El método getAttribute ha sido deprecado en Selenium 4.27 por varias razones:

  • Uso incorrecto: Muchos usuarios intentaban usar getAttribute para obtener el texto visible (innerText), lo cual llevaba a resultados inconsistentes en diferentes navegadores.

  • Nueva aproximación: Selenium quiere hacer las cosas más fáciles y limpias para los desarrolladores. Al alejarse de getAttribute, la biblioteca fomenta el uso de métodos más específicos diseñados para sus respectivas tareas.

Nuevos métodos: getDomProperty y getDomAttribute

Para reemplazar getAttribute, Selenium ha introducido dos nuevos métodos:

  • getDomProperty: Para propiedades del DOM como value, checked, selected, etc.

  • getDomAttribute: Para atributos HTML como id, class, href, src, etc.

Ventajas de los nuevos métodos

  • Precisión: Estos métodos son más precisos y específicos, lo que reduce la posibilidad de errores y resultados inconsistentes.

  • Rendimiento: Al ser más específicos, estos métodos pueden mejorar el rendimiento de tus pruebas.

  • Compatibilidad: Los nuevos métodos están mejor alineados con los estándares modernos de navegadores web, lo que garantiza una mayor compatibilidad.

Ejemplo de migración

Antes (usando getAttribute):

WebElement element = driver.findElement(By.id("username"));

String value = element.getAttribute("value");


Después (usando getDomProperty):

WebElement element = driver.findElement(By.id("username"));
String value = element.getDomProperty("value");

Conclusión

La deprecación del método getAttribute en Selenium 4.27 es un paso importante hacia pruebas más precisas y fiables. Al adoptar los nuevos métodos getDomProperty y getDomAttribute, tus scripts de automatización serán más robustos y futuros.

Espero que esta información te sea útil. Si tienes alguna pregunta o necesitas más detalles, no dudes en comentar. ¡Hasta la próxima!


Fuentes:
https://www.youtube.com/watch?v=qMiu4DIomyE

martes, 5 de noviembre de 2024

Automatización con Java y Selenium (Todo lo que necesitas para comenzar)

Buenos días lectores.


Selenium es una potente herramienta (marco de código abierto) para automatizar aplicaciones web en múltiples navegadores y plataformas. Con soporte para varios lenguajes de programación como Java, permite crear scripts de prueba robustos que simulan interacciones de usuario.

Aquí te voy a dejar lo básico para manejarlo, con solo saber esto ya podrás automatizar todos los sitios:


Abrir un Navegador y Navegar a una URL:

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

public class OpenBrowser {

    public static void main(String[] args) {

        WebDriver driver = new ChromeDriver();

        driver.get("https://example.com");

        driver.quit();

    }

}


Encontrar Elementos Usando Diferentes Localizadores:

Por ID:

driver.findElement(By.id("elementID")).click();

Por Nombre:

driver.findElement(By.name("elementName")).sendKeys("input text");

Por XPath:

driver.findElement(By.xpath("//input[@id='elementID']")).click();

Por Selector CSS:

driver.findElement(By.cssSelector("#elementID")).click();


Hacer Clic en un Botón

driver.findElement(By.id("buttonID")).click();


Escribir texto en un cuadro de Texto

driver.findElement(By.name("textboxName")).sendKeys("Sample Text");


Hacer clic en un checkbox (Casillas de Verificación)

WebElement checkbox = driver.findElement(By.id("checkboxID"));

checkbox.click();

System.out.println(checkbox.isSelected());  // Verificar si está seleccionada


Manejo de Listas Desplegables

Select dropdown = new Select(driver.findElement(By.id("dropdownID")));

dropdown.selectByVisibleText("OptionText");


Esperar a que un Elemento Sea Visible y dar click cuando este visible

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementID")));

element.click();


Manejo de Alertas

Aceptar Alerta:

Alert alert = driver.switchTo().alert();

alert.accept();


Rechazar Alerta:

Alert alert = driver.switchTo().alert();

alert.dismiss();


Manejo de Múltiples Ventanas

String parentWindow = driver.getWindowHandle();

Set<String> allWindows = driver.getWindowHandles();


for (String window : allWindows) {

    if (!window.equals(parentWindow)) {

        driver.switchTo().window(window);

    }

}

// Volver a la ventana principal

driver.switchTo().window(parentWindow);


Manejo de Carga de Archivos

driver.findElement(By.id("uploadButtonID")).sendKeys("C:\\path\\to\\file.txt");


Tomar Capturas de Pantalla

File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

FileUtils.copyFile(srcFile, new File("path/to/screenshot.png"));


Extraer Texto de un Elemento Web

String elementText = driver.findElement(By.xpath("//div[@id='elementID']")).getText();

System.out.println(elementText);


Manejo de Marcos (Iframes)

Por Índice:

driver.switchTo().frame(0);

Por Nombre o ID:

driver.switchTo().frame("frameNameOrID");


Manejo de Elementos Dinámicos

driver.findElement(By.xpath("//*[contains(@id, 'dynamicPart')]")).click();


Realizar Acción de Hover con el Ratón

Actions actions = new Actions(driver);

WebElement element = driver.findElement(By.id("elementID"));

actions.moveToElement(element).perform();


Acción de Arrastrar y Soltar (Drag and drop)

Actions actions = new Actions(driver);

WebElement source = driver.findElement(By.id("sourceElementID"));

WebElement target = driver.findElement(By.id("targetElementID"));

actions.dragAndDrop(source, target).perform();


Aserciones en TestNG/JUnit

Aserción en TestNG:

import org.testng.Assert;

String pageTitle = driver.getTitle();

Assert.assertEquals(pageTitle, "Expected Title");


Aserción en JUnit:

import static org.junit.Assert.*;

String pageTitle = driver.getTitle();

assertEquals("Expected Title", pageTitle);


Cerrar el Navegador

Cerrar la ventana actual del navegador:

driver.close();


Terminar la sesión de WebDriver (cerrar todas las ventanas):

driver.quit();


Esta lista cubre preguntas y soluciones esenciales proporcionando una base sólida para la preparación de entrevistas. Así que tienes un 2x1.


Saludos


Fuentes:

https://www.linkedin.com/pulse/basic-selenium-java-automation-testing-kushal-parikh-kgsxf/

jueves, 22 de agosto de 2024

Se te comienzan a quedar sesiones de chrome abiertas luego de ejecutar automatizaciones?

Buenas lectores.

Ha venido ocurriendo que en algunos proyectos ejecutados se van quedando procesos de chrome huerfanos ocasionando que el consumo de la CPU suba al 100% y finalmente la caida del servidor de pruebas.

He realizado descarte de muchos factores, sin embargo, el parámetro que parece funcionar es quitar el siguiente flag: "disable-gpu".

He probado y funciona con la creación directa del webdriver y también cuando lo parametrizamos desde el serenity.conf.

Espero les sirva el tip.

Saludos.




martes, 25 de junio de 2024

Configurar un proyecto de serenitybdd para que se ejecute en un grid de Selenium

Buenas tardes lectores.

Nos encontramos con nuevos desafios cada día, uno de los más grandes es la automatización de procesos. Cuando estamos en un equipo complejo es frecuente encontrar automatizaciones de pruebas funcionales y estos proyectos están construidos en frameworks que permiten un mantenimiento a largo plazo como lo puede ser SerenityBDD.

Al contar con muchos proyectos, es factible encontrarnos la lentitud de ejecución, una de las soluciones es la ejecución paralela y esa es la razón por la que estamos aquí. Para que nuestro proyecto se ejecute de manera rápida y paralelamente puedes montar un grid y añadir los nodos que requieras, luego en el proyecto en el archivo serenity.conf dejas lo siguiente:


# Remote

webdriver {
  driver = remote
  remote {
      url="http://localhost:4445/wd/hub"
      driver=chrome
  }
}


Cambias localhost y el puerto , por el que corresponda cuando ejecutaste el selenium grid.

Espero te sirva.

Saludos.

Fuentes:
https://stackoverflow.com/questions/49535381/how-do-i-specify-the-selenium-hub-url-when-running-serenity-tests-from-eclipse