Selenium Čekání – implicitní, explicitní a plynulé čekání


In Selenium„Čekání“ hraje důležitou roli při provádění testů. V tomto tutoriálu se naučíte různé aspekty a rozdíly mezi implicitním a explicitním čekáním Selenium.

Proč potřebujeme čekat dovnitř Selenium?

Většina webových aplikací je vyvíjena pomocí Ajax si Javascript. Když je stránka načtena prohlížečem, prvky, se kterými chceme pracovat, se mohou načítat v různých časových intervalech.

Nejen, že to ztěžuje identifikaci prvku, ale také pokud prvek není umístěn, zobrazí „ElementNotVisibleException“výjimka. Použitím Selenium Počkejte, můžeme tento problém vyřešit.

Uvažujme scénář, kde musíme v našem testu použít implicitní i explicitní čekání. Předpokládejme, že implicitní čekací doba je nastavena na 20 sekund a explicitní čekací doba je nastavena na 10 sekund.

Předpokládejme, že se snažíme najít prvek, který nějaké má „Očekávané podmínky “(Explicit Wait), Pokud se prvek nenachází v časovém rámci definovaném Explicit Wait (10 sekund), použije časový rámec definovaný implicitním čekáním (20 sekund) před vyvoláním “ElementNotVisibleException".

Selenium Webový ovladač čeká

  1. Implicitní čekání
  2. Explicitně čekejte

V tomto tutoriálu se dozvíte o různých typech čekání Selenium:

Implicitní čekání Selenium

Jedno Implicitní čekání Selenium používá se k tomu, aby řekl webovému ovladači, aby po určitou dobu počkal, než vyvolá „No Such Element Exception“. Výchozí nastavení je 0. Jakmile nastavíme čas, bude webový ovladač čekat na prvek po tuto dobu, než vyvolá výjimku.

Selenium Web Driver si vypůjčil myšlenku implicitního čekání Watir.

V níže uvedeném příkladu jsme deklarovali implicitní čekání s časovým rámcem 10 sekund. To znamená, že pokud se prvek nenachází na webové stránce v tomto časovém rámci, vyvolá výjimku.

Chcete-li deklarovat implicitní čekání Selenium WebDriver:

Implicitní syntaxe čekání:

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("http://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();
}
}

Vysvětlení kódu

Ve výše uvedeném příkladu

Zvažte následující kód:

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

Implicitní čekání akceptuje 2 parametry, první parametr akceptuje čas jako celočíselnou hodnotu a druhý parametr akceptuje měření času v SEKUNDÁCH, MINUTÁCH, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS atd.

Explicitně počkejte Selenium

Jedno Explicitně počkejte Selenium se používá k informování webového ovladače, aby počkal na určité podmínky (očekávané podmínky) nebo překročení maximální doby, než vyvolá výjimku „ElementNotVisibleException“. Je to inteligentní druh čekání, ale lze jej použít pouze pro specifikované prvky. Poskytuje lepší možnosti než implicitní čekání, protože čeká na dynamicky načtené prvky Ajax.

Jakmile deklarujeme explicitní čekání, musíme použít „Očekávané podmínky” nebo můžeme nakonfigurovat, jak často chceme stav kontrolovat pomocí Plynule počkejte. V těchto dnech při implementaci používáme Thread.Sleep() obecně se nedoporučuje používat

V níže uvedeném příkladu vytváříme referenční čekání na „WebDriverPočkejte“třída a vytváření instancí pomocí “webový ovladač“ a poskytujeme maximální časový rámec 20 sekund.

Explicitní syntaxe Wait:

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("http://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();
	}
	
}

Vysvětlení kódu

Zvažte následující kód:

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

V tomto příkladu čekání WebDriver počkejte dobu definovanou v „WebDriverPočkejte“třída nebo “Očekávané podmínky“, podle toho, co nastane dříve.

Výše Java kód uvádí, že čekáme na prvek po dobu 20 sekund, jak je definováno v „WebDriverPočkejte” třídy na webové stránce až do “Očekávané podmínky“ jsou splněny a podmínkou je “viditelnost prvku umístěného".

Níže jsou uvedeny očekávané podmínky, které lze použít Selenium Explicitně čekejte

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presentOfAllElementsLocatedBy()
  9. presentOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. viditelnost()
  16. viditelnostOfAllElements()
  17. viditelnostOfAllElementsLocatedBy()
  18. viditelnostOfElementLocated()

Plynule Počkejte dovnitř Selenium

Jedno Plynule Počkejte dovnitř Selenium se používá k definování maximální doby, po kterou webový ovladač čeká na podmínku, a také frekvence, s jakou chceme podmínku kontrolovat před vyvoláním výjimky „ElementNotVisibleException“. V pravidelných intervalech kontroluje webový prvek, dokud není objekt nalezen nebo dokud neuplyne časový limit.

Frekvence: Nastavení opakovacího cyklu s časovým rámcem pro ověření/kontrolu stavu v pravidelných časových intervalech

Uvažujme scénář, kdy je prvek načítán v různých časových intervalech. Prvek se může načíst během 10 sekund, 20 sekund nebo i déle, než když deklarujeme explicitní čekání 20 sekund. Počká do zadaného času, než vyvolá výjimku. V takových scénářích je ideální čekání použít plynulé čekání, protože se pokusí najít prvek na jiné frekvenci, dokud jej nenajde nebo dokud nevyprší konečný časovač.

Plynulá syntaxe čekání:

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

Výše uvedený kód je zastaralý v Selenium v3.11 a vyšší. Musíte použít

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("http://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() ;
	}
}

Vysvětlení kódu

Zvažte následující kód:

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

Ve výše uvedeném příkladu deklarujeme plynulé čekání s časovým limitem 30 sekund a frekvence je nastavena na 5 sekund ignorováním „NoSuchElementException"

Zvažte následující kód:

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"));

Vytvořili jsme novou funkci pro identifikaci webového prvku na stránce. (Příklad: Here Web Element není nic jiného než Selenium odkaz na webové stránce).

Frekvence je nastavena na 5 sekund a maximální čas je nastaven na 30 sekund. To znamená, že bude prvek na webové stránce kontrolovat každých 5 sekund po maximální dobu 30 sekund. Pokud je prvek umístěn v tomto časovém rámci, provede operace, jinak vyvolá „ElementNotVisibleException"

Zkontrolujte také: - Selenium Výukový program IDE pro začátečníky

Rozdíl mezi implicitním čekáním a explicitním čekáním

Následuje hlavní rozdíl mezi implicitním čekáním a explicitním čekáním Selenium:

Implicitní čekání Explicitně čekejte
Implicitní čekací doba se aplikuje na všechny prvky ve skriptu Explicitní čekací doba se vztahuje pouze na ty prvky, které jsme zamýšleli
V Implicitním čekání potřebujeme ne zadejte „ExpectedConditions“ na prvku, který má být umístěn V Explicit Wait musíme zadat „ExpectedConditions“ na prvku, který má být umístěn
Doporučuje se použít, když jsou prvky umístěny s časovým rámcem uvedeným v Selenium implicitní čekání Doporučuje se použít, když se prvky načítají dlouho a také pro ověření vlastnosti prvku like(visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Proč investovat do čističky vzduchu?

Implicitní, Explicitní a Plynulé čekání jsou různé čekání používané v Selenium. Použití těchto čekání je zcela založeno na prvcích, které se načítají v různých časových intervalech. Vždy se nedoporučuje používat Thread.Sleep() while Testování naši aplikaci nebo budování našeho rámce.

Zkontrolujte také: - Selenium Výukový program pro začátečníky: Naučte se WebDriver za 7 dní

Více Přečtěte si více