Como lidar com chamadas AJAX no Selenium Webdriver

O que é Ajax?

AJAX significa AsyncJavaScript e XML completos, e permite que a página da Web recupere pequenas quantidades de dados do servidor sem recarregar a página inteira.

Ajax é uma técnica usada para criar páginas web rápidas e dinâmicas. Esta técnica é umasynchronous e usa uma combinação de Javascript e XML. Ele atualizará as partes de uma página da web sem recarregar a página inteira. Alguns dos aplicativos famosos que usam a técnica AJAX são Gmail, Google Maps, Facebook, Youtube, etc.

Como funciona o Ajax?

Por exemplo, quando você clica no botão enviar, JavaScript fará uma solicitação ao servidor, interpretará o resultado e atualizará a tela atual sem recarregar a página.

Como funciona o Ajax

  • Uma chamada Ajax é umsyncsolicitação crônica iniciada pelo navegador que não resulta diretamente em uma transição de página. Isso significa que, se você disparar uma solicitação Ajax, o usuário ainda poderá trabalhar no aplicativo enquanto a solicitação aguarda uma resposta.
  • AJAX envia solicitações HTTP do cliente para o servidor e então processa a resposta do servidor, sem recarregar a página inteira. Então, quando você faz uma chamada AJAX, você não tenho certeza sobre o tempo que o servidor leva para enviar uma resposta.

Do ponto de vista do testador, se você estiver verificando o conteúdo ou o elemento a ser exibido, precisará esperar até obter a resposta. Durante a chamada AJAX, os dados são armazenados em formato XML e recuperados do servidor.

Como lidar com chamadas Ajax no Selenium Webdriver

A o maior desafio em lidar com chamadas Ajax é saberwing o tempo de carregamento da página da web. Como o carregamento da página web durará apenas uma fração de segundos, é difícil para o testador testar tal aplicação por meio de uma ferramenta de automação. Para isso, o Selenium Webdriver deve utilizar o método wait nesta chamada Ajax.

Portanto, ao executar este comando de espera, o Selenium irá suspender a execução do atual Caso de teste e aguarde o valor esperado ou novo. Quando o novo valor ou campo aparecer, os casos de teste suspensos serão executados pelo Selenium Webdriver.

Following são os métodos de espera que o Selenium Webdriver pode usar

Thread.Sleep ()

  • Thread.Sleep() não é um wise escolha, pois suspende o thread atual pelo período de tempo especificado.
  • No AJAX, você nunca pode ter certeza do tempo exato de espera. Portanto, seu teste falhará se o elemento não aparecer dentro do tempo de espera. Além disso, aumenta a sobrecarga porque chamar Thread.sleep(t) faz com que o thread atual seja movido da fila de execução para a fila de espera.
  • Após o tempo 't' ser atingido, o thread atual passará da fila de espera para a fila de prontos e então levará algum tempo para ser selecionado pela CPU e estar em execução.

Espera Implícita()

  • Este método diz ao webdriver para esperar se o elemento não estiver disponível imediatamente, mas essa espera permanecerá em vigor durante todo o tempo em que o navegador estiver aberto. Portanto, qualquer pesquisa pelos elementos da página pode levar o tempo definido para a espera implícita.

Espera explícita()

  • Espera explícita é usado para congelar a execução do teste até o momento em que uma condição específica seja atendida ou o tempo máximo decorrido.

WebdriverEspere

  • Pode ser usado para qualquer condição. Isso pode ser alcançado com WebDriverWait em combinação com ExpectedCondition
  • A melhor maneira de esperar dinamicamente por um elemento é verificar a condição a cada segundo e continuar para o próximo comando no script assim que a condição for atendida.

Mas o problema com todas essas esperas é que você precisa mencionar a unidade de tempo limite. E se o elemento ainda não estiver presente dentro do prazo? Portanto, há mais uma espera chamada espera fluente.

Espera Fluente

  • Esta é uma implementação da interface Wait com seu tempo limite e intervalo de pesquisa. Cada instância do FluentWait determina o tempo máximo de espera por uma condição, bem como a frequência com a qual a condição deve ser verificada.

Desafios no tratamento de chamadas Ajax no Selenium Webdriver

  • Usar o comando “pause” para lidar com chamadas Ajax não é totalmente confiável. Um longo tempo de pausa torna o teste inaceitavelmente lento e aumenta a ensaio tempo. Em vez disso, “waitforcondition” será mais útil para testar aplicativos Ajax.
  • É difícil avaliar o risco associado a aplicações Ajax específicas
  • Dada total liberdade aos desenvolvedores para modificar o aplicativo Ajax, o processo de teste é desafiador
  • A criação de solicitações de teste automatizadas pode ser difícil para ferramentas de teste, pois os aplicativos AJAX geralmente usam diferentes técnicas de codificação ou serialização para enviar dados POST.

Exemplo de código para Ajax HANDLING usando Selenium Webdriver

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();
	}
	
}

Resumo

  • AJAX permite que a página da Web recupere pequenas quantidades de dados do servidor sem recarregar a página inteira.
  • Para testar o aplicativo Ajax, diferentes métodos de espera devem ser aplicados
    • ThreadSleep
    • Espera implícita
    • Espera explícita
    • WebdriverEspere
    • Espera Fluente
  • A criação de solicitações de teste automatizadas pode ser difícil para ferramentas de teste, pois os aplicativos AJAX geralmente usam diferentes técnicas de codificação ou serialização para enviar dados POST.