Selenium Čekaj – Implicitno i eksplicitno sa sintaksom


In Selenium, "Čekanja" igraju važnu ulogu u izvršavanju testova. U ovom vodiču naučit ćete različite aspekte i razliku između implicitnog i eksplicitnog čekanja Selenium.

Zašto trebamo čekati Selenium?

Većina web aplikacija razvijena je korištenjem Ajax i Javascript. Kada preglednik učita stranicu, elementi s kojima želimo komunicirati mogu se učitavati u različitim vremenskim intervalima.

Ne samo da to otežava identifikaciju elementa, nego i ako element nije lociran, izbacit će "ElementNotVisibleException” iznimka. Korištenje Selenium Čekaj, možemo riješiti ovaj problem.

Razmotrimo scenarij u kojem moramo koristiti i implicitna i eksplicitna čekanja u našem testu. Pretpostavimo da je implicitno vrijeme čekanja postavljeno na 20 sekundi, a eksplicitno vrijeme čekanja na 10 sekundi.

Pretpostavimo da pokušavamo pronaći element koji ima nešto “Očekivani uvjeti “(Eksplicitno čekanje), ako se element ne nalazi unutar vremenskog okvira definiranog eksplicitnim čekanjem (10 sekundi), koristit će vremenski okvir definiran implicitnim čekanjem (20 sekundi) prije nego što izbaci “ElementNotVisibleException".

Selenium Web upravljački program čeka

  1. Implicitno čekanje
  2. Eksplicitno čekanje

U ovom vodiču naučit ćete o različitim vrstama čekanja Selenium:

Implicitno čekanje Selenium

The Implicitno čekanje Selenium koristi se da se web upravljačkom programu kaže da pričeka određeno vrijeme prije nego što izbaci "No Such Element Exception". Zadana postavka je 0. Nakon što postavimo vrijeme, web upravljački program čekat će element to vrijeme prije nego što izbaci iznimku.

Selenium Web Driver je posudio ideju implicitnih čekanja od Watir.

U donjem primjeru proglasili smo implicitno čekanje s vremenskim okvirom od 10 sekundi. To znači da ako se element ne nalazi na web stranici unutar tog vremenskog okvira, izbacit će iznimku.

Proglasiti implicitno čekanje Selenium Web Driver:

Implicitna sintaksa čekanja:

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

Objašnjenje koda

U gornjem primjeru,

Razmotrite sljedeći kod:

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

Implicitno čekanje će prihvatiti 2 parametra, prvi parametar će prihvatiti vrijeme kao cjelobrojnu vrijednost, a drugi parametar će prihvatiti mjerenje vremena u smislu SEKUNDA, MINUTA, MILISEKUNDA, MIKROSEKUNDA, NANOSEKUNDA, DANA, SATA itd.

Eksplicitno čekanje Selenium

The Eksplicitno čekanje Selenium koristi se da se Web Driveru kaže da pričeka određene uvjete (očekivani uvjeti) ili maksimalno vrijeme koje se prekorači prije izbacivanja iznimke "ElementNotVisibleException". To je inteligentna vrsta čekanja, ali se može primijeniti samo za određene elemente. Daje bolje opcije od implicitnog čekanja jer čeka dinamički učitane Ajax elemente.

Jednom kada deklariramo eksplicitno čekanje, moramo koristiti "ExpectedConditions” ili možemo konfigurirati koliko često želimo provjeravati stanje pomoću Tečno pričekajte. Ovih dana tijekom implementacije koristimo se Thread.Sleep() općenito se ne preporučuje uporaba

U donjem primjeru stvaramo referentno čekanje za "WebDriverWait" klasa i instanciranje pomoću "webdriver” referenca, a dajemo maksimalan vremenski okvir od 20 sekundi.

Eksplicitna sintaksa čekanja:

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

Objašnjenje koda

Razmotrite sljedeći kod:

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

U ovom primjeru čekanja WebDrivera, pričekajte vrijeme definirano u "WebDriverWait" klasa ili "ExpectedConditions” da se dogodi što god se prvo dogodi.

Gore Java kod navodi da čekamo element za vremenski okvir od 20 sekundi kako je definirano u "WebDriverWait” na web stranici dok se ne pojavi “ExpectedConditions” su ispunjeni i uvjet je „visibilityofElementLocated".

Sljedeći su očekivani uvjeti u kojima se mogu koristiti Selenium Eksplicitno čekanje

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. nevidljivostLociranogElementa()
  7. nevidljivostElementa s tekstom()
  8. prisutnostSvihElemenataLocatedBy()
  9. prisutnostOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. naslovJe()
  14. naslovSadrži()
  15. vidljivost()
  16. vidljivostSvihElemenata()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

Tečno Pričekaj Selenium

The Tečno Pričekaj Selenium koristi se za definiranje maksimalnog vremena koje web upravljački program čeka na uvjet, kao i učestalost kojom želimo provjeriti uvjet prije izbacivanja iznimke "ElementNotVisibleException". Provjerava web element u redovitim intervalima dok se objekt ne pronađe ili dok ne istekne vrijeme.

Frekvencija: Postavljanje ciklusa ponavljanja s vremenskim okvirom za provjeru/provjeru stanja u redovitim vremenskim intervalima

Razmotrimo scenarij u kojem se element učitava u različitim vremenskim intervalima. Element bi se mogao učitati unutar 10 sekundi, 20 sekundi ili čak i više od toga ako proglasimo eksplicitno čekanje od 20 sekundi. Prije izbacivanja iznimke čekat će određeno vrijeme. U takvim scenarijima, fluentno čekanje idealno je čekanje za upotrebu jer će se time pokušati pronaći element na različitoj frekvenciji dok ga ne pronađe ili dok ne istekne konačni mjerač vremena.

Fluent Wait sintaksa:

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

Gornji kôd je zastario u Selenium v3.11 i novije. Trebate koristiti

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

Objašnjenje koda

Razmotrite sljedeći kod:

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

U gornjem primjeru deklariramo tečno čekanje s vremenskim ograničenjem od 30 sekundi i učestalost je postavljena na 5 sekundi ignoriranjem "NoSuchElementException"

Razmotrite sljedeći kod:

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

Stvorili smo novu funkciju za prepoznavanje Web elementa na stranici. (Primjer: ovdje web element nije ništa drugo nego Selenium poveznica na web stranici).

Učestalost je postavljena na 5 sekundi, a maksimalno vrijeme je postavljeno na 30 sekundi. Dakle, to znači da će provjeravati element na web stranici svakih 5 sekundi tijekom maksimalnog vremena od 30 sekundi. Ako se element nalazi unutar tog vremenskog okvira, izvršit će operacije, inače će izbaciti "ElementNotVisibleException"

Također provjerite: - Selenium IDE vodič za početnike

Razlika između implicitnog čekanja i eksplicitnog čekanja

Slijedi glavna razlika između implicitnog čekanja i eksplicitnog čekanja Selenium:

Implicitno čekanje Eksplicitno čekanje
Implicitno vrijeme čekanja primjenjuje se na sve elemente u skripti Eksplicitno vrijeme čekanja primjenjuje se samo na one elemente koje smo mi namijenili
U Implicitnom čekanju, trebamo ne navedite “ExpectedConditions” na elementu koji treba locirati U Explicit Wait, moramo navesti "ExpectedConditions" na elementu koji treba locirati
Preporuča se koristiti kada se elementi nalaze u vremenskom okviru navedenom u Selenium implicitno čekanje Preporuča se koristiti kada je elementima potrebno dugo da se učitaju i također za provjeru svojstva elementa kao što je (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Zaključak

Implicitno, eksplicitno i tečno čekanje različita su čekanja koja se koriste u Selenium. Korištenje ovih čekanja u potpunosti se temelji na elementima koji se učitavaju u različitim vremenskim intervalima. Uvijek se ne preporučuje korištenje Thread.Sleep() dok Ispitivanje našu aplikaciju ili izgradnju našeg okvira.

Također provjerite: - Selenium Vodič za početnike: Naučite WebDriver u 7 dana

Opširnije Čitaj više