Selenium Esperar – Implícito e Explícito com Sintaxe


In Selenium, “Esperas” desempenham um papel importante na execução de testes. Neste tutorial, você aprenderá vários aspectos e diferenças entre espera implícita e explícita em Selenium.

Por que precisamos de espera Selenium?

A maioria das aplicações web são desenvolvidas usando Ajax e Javascript. Quando uma página é carregada pelo navegador, os elementos com os quais queremos interagir podem carregar em intervalos de tempo diferentes.

Não só dificulta a identificação do elemento, mas também se o elemento não for localizado, será gerado um “ElementNotVisibleException”exceção. Usando Selenium Aguarde, podemos resolver esse problema.

Vamos considerar um cenário onde temos que usar esperas implícitas e explícitas em nosso teste. Suponha que o tempo de espera implícito seja definido como 20 segundos e o tempo de espera explícito seja definido como 10 segundos.

Suponha que estamos tentando encontrar um elemento que tenha alguma “Condições Esperadas “(Espera explícita), se o elemento não estiver localizado dentro do intervalo de tempo definido pela espera explícita (10 segundos), ele usará o intervalo de tempo definido pela espera implícita (20 segundos) antes de lançar um“ElementNotVisibleException".

Selenium Espera do driver da web

  1. Espera implícita
  2. Espera explícita

Neste tutorial, você aprenderá sobre diferentes tipos de espera em Selenium:

Espera Implícita Selenium

A Espera Implícita Selenium é usado para informar ao driver da web para esperar um determinado período de tempo antes de lançar uma “Exceção de não tal elemento”. A configuração padrão é 0. Depois de definir o horário, o driver da web aguardará o elemento naquele horário antes de lançar uma exceção.

Selenium O Web Driver pegou emprestada a ideia de esperas implícitas de Watir.

No exemplo abaixo declaramos uma espera implícita com intervalo de tempo de 10 segundos. Isso significa que se o elemento não estiver localizado na página da web dentro desse período, ele lançará uma exceção.

Para declarar espera implícita em Selenium WebDriver:

Sintaxe de espera implícita:

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package guru.test99;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class AppTest {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

Explicação do Código

No exemplo acima,

Considere o seguinte código:

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;

A espera implícita aceitará 2 parâmetros, o primeiro parâmetro aceitará o tempo como um valor inteiro e o segundo parâmetro aceitará a medição do tempo em termos de SEGUNDOS, MINUTOS, MILISEGUNDOS, MICROSSEGUNDOS, NANOSSEGUNDOS, DIAS, HORAS, etc.

Espera explícita Selenium

A Espera explícita Selenium é usado para informar ao Web Driver para aguardar certas condições (Condições Esperadas) ou tempo máximo excedido antes de lançar a exceção “ElementNotVisibleException”. É um tipo inteligente de espera, mas só pode ser aplicado a elementos específicos. Ele oferece opções melhores do que a espera implícita, pois aguarda elementos Ajax carregados dinamicamente.

Depois de declararmos espera explícita, temos que usar “Condições esperadas”ou podemos configurar a frequência com que queremos verificar a condição usando Espera Fluente. Hoje em dia, durante a implementação, estamos usando Thread.Sleep () geralmente não é recomendado usar

No exemplo abaixo, estamos criando uma espera de referência para “WebDriverEspere”classe e instanciando usando“webdriver”Referência, e estamos dando um prazo máximo de 20 segundos.

Sintaxe de espera explícita:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package guru.test99;

import java.util.concurrent.TimeUnit;
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.annotations.Test;

public class AppTest2 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	WebElement guru99seleniumlink;
	guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
	guru99seleniumlink.click();
	}
	
}

Explicação do Código

Considere o seguinte código:

WebElement guru99seleniumlink;
guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
guru99seleniumlink.click();

Neste exemplo de espera do WebDriver, aguarde o tempo definido na caixa “WebDriverEspere”classe ou o“Condições esperadas”para ocorrer o que ocorrer primeiro.

O referido Java o código afirma que estamos aguardando um elemento pelo período de 20 segundos conforme definido em “WebDriverEspere”classe na página da web até o“Condições esperadas”são atendidos e a condição é“visibilidadedeElementLocated".

A seguir estão as condições esperadas que podem ser usadas em Selenium Espera explícita

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilidadeOfTheElementLocated()
  7. invisibilidadeOfElementWithText()
  8. presençaOfAllElementsLocatedBy()
  9. presençaOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. títuloIs()
  14. títuloContém()
  15. visibilidadeOf()
  16. visibilidadeOfAllElements()
  17. visibilidadeOfAllElementsLocatedBy()
  18. visibilidadeOfElementLocated()

Espera Fluente Selenium

A Espera Fluente Selenium é usado para definir o tempo máximo para o driver web esperar por uma condição, bem como a frequência com que queremos verificar a condição antes de lançar uma exceção “ElementNotVisibleException”. Ele verifica o elemento da web em intervalos regulares até que o objeto seja encontrado ou o tempo limite atinja.

Frequência: Configurar um ciclo de repetição com prazo para verificar/verificar a condição em intervalos regulares de tempo

Vamos considerar um cenário onde um elemento é carregado em diferentes intervalos de tempo. O elemento pode carregar em 10 segundos, 20 segundos ou até mais do que se declararmos uma espera explícita de 20 segundos. Ele esperará até o tempo especificado antes de lançar uma exceção. Nesses cenários, a espera fluente é a espera ideal para usar, pois tentará encontrar o elemento em frequência diferente até encontrá-lo ou o cronômetro final se esgotar.

Sintaxe de espera fluente:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

O código acima está obsoleto em Selenium v3.11 e superior. Você precisa usar

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(SECONDS))
.ignoring(Exception.class);

package guru.test99;

import org.testng.annotations.Test;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest3 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

Explicação do Código

Considere o seguinte código:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

No exemplo acima, estamos declarando uma espera fluente com tempo limite de 30 segundos e a frequência é definida para 5 segundos ignorando “NoSuchElementException"

Considere o seguinte código:

public WebElement apply(WebDriver driver) {
        return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));

Criamos uma nova função para identificar o Elemento Web na página. (Ex: Aqui o Elemento Web nada mais é do que o Selenium link na página da web).

A frequência é definida para 5 segundos e o tempo máximo é definido para 30 segundos. Assim, isso significa que ele irá verificar o elemento na página web a cada 5 segundos pelo tempo máximo de 30 segundos. Se o elemento estiver localizado dentro deste período de tempo, ele executará as operações, caso contrário, lançará um “ElementNotVisibleException"

Verifique também: - Selenium Tutorial IDE para iniciantes

Diferença entre espera implícita e espera explícita

A seguir está a principal diferença entre espera implícita e espera explícita em Selenium:

Espera implícita Espera explícita
O tempo de espera implícito é aplicado a todos os elementos do script O tempo de espera explícito é aplicado apenas aos elementos pretendidos por nós
Na espera implícita, precisamos não especifique “ExpectedConditions” no elemento a ser localizado Em Espera Explícita, precisamos especificar “ExpectedConditions” no elemento a ser localizado
Recomenda-se utilizar quando os elementos estiverem localizados no intervalo de tempo especificado em Selenium espera implícita Recomenda-se usar quando os elementos estão demorando muito para carregar e também para verificar a propriedade do elemento como(visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Conclusão

Espera Implícita, Explícita e Fluente são as diferentes esperas usadas em Selenium. A utilização dessas esperas é totalmente baseada nos elementos que são carregados em diferentes intervalos de tempo. Nem sempre é recomendado usar Thread.Sleep() enquanto Ensaios nossa aplicação ou construindo nossa estrutura.

Verifique também: - Selenium Tutorial para iniciantes: Aprenda WebDriver em 7 dias

Saiba Mais Leia mais