Cómo manejar llamadas AJAX en Selenium controlador web

¿Qué es Ajax?

AJAX significa Asincrónico JavaScript y XML, y permite que la página web recupere pequeñas cantidades de datos del servidor sin recargar toda la página.

Ajax es una técnica utilizada para crear páginas web rápidas y dinámicas. Esta técnica es asincrónica y utiliza una combinación de Javascript y XML. Actualizará partes de una página web sin tener que recargar toda la página. Algunas de las aplicaciones famosas que utilizan la técnica AJAX son Gmail, Google Maps, Facebook, Youtube, etc.

¿Cómo funciona Ajax?

Por ejemplo, cuando hace clic en el botón enviar, JavaGuión realizará una solicitud al servidor, interpretará el resultado y actualizará la pantalla actual sin recargar la página web.

Cómo funciona Ajax

  • Una llamada Ajax es una solicitud asincrónica iniciada por el navegador que no da como resultado directamente una transición de página. Esto significa que, si se realiza una solicitud Ajax, el usuario puede seguir trabajando en la aplicación mientras la solicitud espera una respuesta.
  • AJAX envía solicitudes HTTP desde el cliente al servidor y luego procesa la respuesta del servidor, sin recargar toda la página. Entonces, cuando haces una llamada AJAX, No estoy muy seguro del tiempo que tarda el servidor en enviarle una respuesta..

Desde el punto de vista de un tester, si estás comprobando el contenido o el elemento que se va a mostrar, debes esperar hasta obtener la respuesta. Durante la llamada AJAX, los datos se almacenan en formato XML y se recuperan del servidor.

Cómo manejar llamadas Ajax en Selenium controlador web

La El mayor desafío al gestionar llamadas Ajax es saber el tiempo de carga de la página web. Dado que la carga de la página web durará sólo una fracción de segundos, es difícil para el evaluador probar dicha aplicación a través de la herramienta de automatización. Para eso, Selenium Webdriver tiene que utilizar el método de espera en esta llamada Ajax.

Entonces, al ejecutar este comando de espera, Selenium suspenderá la ejecución de la corriente. Caso de prueba y espere el valor esperado o nuevo. Cuando aparezca el nuevo valor o campo, los casos de prueba suspendidos serán ejecutados por Selenium Controlador web.

A continuación se muestran los métodos de espera que Selenium Webdriver puede utilizar

Thread.Sleep ()

  • Thread.Sleep() no es una buena opción ya que suspende el hilo actual durante el tiempo especificado.
  • En AJAX, nunca puedes estar seguro del tiempo de espera exacto. Por lo tanto, su prueba fallará si el elemento no aparece dentro del tiempo de espera. Además, aumenta la sobrecarga porque llamar a Thread.sleep(t) hace que el hilo actual se mueva de la cola en ejecución a la cola de espera.
  • Después de alcanzar el tiempo "t", el hilo actual pasará de la cola de espera a la cola listo, y luego la CPU tardará un tiempo en seleccionarlo y ejecutarlo.

Espera implícita()

  • Este método le dice a webdriver que espere si el elemento no está disponible inmediatamente, pero esta espera se mantendrá durante todo el tiempo que el navegador esté abierto. Por lo tanto, cualquier búsqueda de elementos en la página podría llevar el tiempo establecido en la espera implícita.

Espera explícita()

  • Espera explícita se utiliza para congelar la ejecución de la prueba hasta que se cumpla una condición particular o transcurra el tiempo máximo.

WebdriverEsperar

  • Se puede utilizar para cualquier condición. Esto se puede lograr con WebDriverWait en combinación con ExpectedCondition
  • La mejor manera de esperar un elemento dinámicamente es verificar la condición cada segundo y continuar con el siguiente comando en el script tan pronto como se cumpla la condición.

Pero el problema con todas estas esperas es que hay que mencionar la unidad de tiempo de espera. ¿Qué pasa si el elemento aún no está presente dentro del tiempo? Entonces hay una espera más llamada espera fluida.

Espera fluida

  • Esta es una implementación de la interfaz Wait que tiene su tiempo de espera y su intervalo de sondeo. Cada instancia de FluentWait determina la cantidad máxima de tiempo para esperar una condición, así como la frecuencia con la que verificar la condición.

Desafíos en el manejo de llamadas Ajax Selenium controlador web

  • Usar el comando "pausar" para manejar llamadas Ajax no es completamente confiable. El tiempo de pausa prolongado hace que la prueba sea inaceptablemente lenta y aumenta la Pruebas tiempo. En cambio, "esperar condición" será más útil para probar aplicaciones Ajax.
  • Es difícil evaluar el riesgo asociado con aplicaciones Ajax particulares.
  • Dar total libertad a los desarrolladores para modificar la aplicación Ajax hace que el proceso de prueba sea un desafío.
  • La creación de solicitudes de prueba automatizadas puede resultar difícil para las herramientas de prueba, ya que las aplicaciones AJAX a menudo utilizan diferentes técnicas de codificación o serialización para enviar datos POST.

Ejemplo de código para Ajax HANDLING usando Selenium controlador web

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Ajaxdemo {
	
	private String URL = "https://demo.guru99.com/test/ajax.html";
	
	WebDriver driver;
	WebDriverWait wait;
	
	@BeforeClass
	public void setUp() {
		System.setProperty("webdriver.chrome.driver",".\\chromedriver.exe");
		//create chrome instance
		driver = new ChromeDriver();
		driver.manage().window().maximize();
		driver.navigate().to(URL);
	}
	
	@Test
	public void test_AjaxExample() {

		By container = By.cssSelector(".container");
		wait = new WebDriverWait(driver, 5);
		wait.until(ExpectedConditions.presenceOfElementLocated(container));
		
		//Get the text before performing an ajax call
		WebElement noTextElement = driver.findElement(By.className("radiobutton"));
		String textBefore = noTextElement.getText().trim();
		
		//Click on the radio button
		driver.findElement(By.id("yes")).click();
	
		//Click on Check Button
		driver.findElement(By.id("buttoncheck")).click();
		
		/*Get the text after ajax call*/
		WebElement TextElement = driver.findElement(By.className("radiobutton"));
		wait.until(ExpectedConditions.visibilityOf(TextElement));
		String textAfter = TextElement.getText().trim();
		
		/*Verify both texts before ajax call and after ajax call text.*/
		Assert.assertNotEquals(textBefore, textAfter);
		System.out.println("Ajax Call Performed");
		
		String expectedText = "Radio button is checked and it's value is Yes";
		
		/*Verify expected text with text updated after ajax call*/
		Assert.assertEquals(textAfter, expectedText);
		driver.close();
	}
	
}

Resumen

  • AJAX permite que la página web recupere pequeñas cantidades de datos del servidor sin recargar toda la página.
  • Para probar la aplicación Ajax, se deben aplicar diferentes métodos de espera.
    • HiloSueño
    • Espera implícita
    • Espera explícita
    • WebdriverEsperar
    • Espera fluida
  • La creación de solicitudes de prueba automatizadas puede resultar difícil para las herramientas de prueba, ya que las aplicaciones AJAX a menudo utilizan diferentes técnicas de codificación o serialización para enviar datos POST.