V selenu hraje „Waits“ důležitou roli při provádění testů. V tomto tutoriálu se naučíte různé aspekty „implicitních“ a „explicitních“ čekání v selenu.
V tomto výukovém programu se naučíte:
- Proč potřebujeme čekat na selen?
- Implicitní počkat
- Explicitní čekání
- Plynule počkejte
Proč potřebujeme čekat na selen?
Většina webových aplikací je vyvíjena pomocí Ajaxu a Javascriptu. Když je stránka načtena prohlížečem, prvky, se kterými chceme komunikovat, se mohou načítat v různých časových intervalech.
Nejen, že je obtížné identifikovat prvek, ale také v případě, že se prvek nenachází, vyvolá výjimku " ElementNotVisibleException ". Tento problém můžeme vyřešit pomocí Selenium Waits.
Uvažujme o scénáři, 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ý má nějaké „ExpectedConditions “ (Explicit Wait). Pokud se prvek nenachází v časovém rámci definovaném Explicitním čekáním (10 sekund), použije časový rámec definovaný implicitním čekáním ( 20 sekund) před vyvoláním „ ElementNotVisibleException “.
Selénový webový ovladač čeká
- Implicitní počkat
- Explicitní čekání
Implicitní Wait in Selenium
Implicitní Wait v Selen je používán oznámit webovému řidič čekat na určitou dobu, než se hodí „No takový prvek výjimka“. Výchozí nastavení je 0. Jakmile nastavíme čas, webový ovladač počká na prvek pro tuto dobu, než vyvolá výjimku.
Selenium Web Driver si vypůjčil myšlenku implicitního čekání od Watira.
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 v daném časovém rámci nenachází na webové stránce, vyvolá výjimku.
Chcete-li deklarovat implicitní čekání:
Syntaxe :
driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS);
balíček 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;veřejná třída AppTest {chráněný ovladač WebDriver;@Testpublic void guru99tutorials () vyvolá InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);Řetězec eTitle = "Ukázková stránka Guru99";Řetězec aTitle = "";// spusťte Chrome a přesměrujte jej na základní adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prohlížečedriver.manage (). window (). maximize ();// získá skutečnou hodnotu tituluaTitle = driver.getTitle ();// porovnat skutečný název s očekávanýmif (aTitle.equals (eTitle)){System.out.println ("Test úspěšně proveden");}else {System.out.println ("Test selhal");}// zavřít prohlížeč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í přijme 2 parametry, první parametr přijme čas jako celočíselnou hodnotu a druhý parametr přijme měření času z hlediska SEKUND, MINUT, MILISECOND, MIKROSEKOND, NANOSEKOND, DNŮ, HODIN atd.
Explicitní čekání na selenu
Explicit Wait v Selen je používán oznámit webovému ovladač čekat na určitých podmínek (předpokládaných podmínek) nebo maximální čas překročen před házení „ElementNotVisibleException“ výjimku. Jedná se o inteligentní druh čekání, ale lze jej použít pouze pro určené prvky. Poskytuje lepší možnosti než implicitní čekání, protože čeká na dynamicky načtené prvky Ajaxu.
Jakmile deklarujeme výslovné čekání, musíme použít „ ExpectedConditions “ nebo můžeme nakonfigurovat, jak často chceme podmínku zkontrolovat pomocí funkce Fluent Wait . V dnešní době při implementaci používáme Thread.Sleep () obecně se nedoporučuje používat
V následujícím příkladu, vytváříme referenční čekání na „ WebDriverWait “ třídy a spouštění pomocí „ WebDriver “ odkaz, a dáváme maximální časový rámec 20 sekund.
Syntax:
WebDriverWait wait = nový WebDriverWait (WebDriverRefrence, TimeOut);
balíček 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;importovat org.openqa.selenium.support.ui.ExectedConditions;importovat org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;veřejná třída AppTest2 {chráněný ovladač WebDriver;@Testpublic void guru99tutorials () vyvolá InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();WebDriverWait wait = nový WebDriverWait (ovladač, 20);Řetězec eTitle = "Ukázková stránka Guru99";Řetězec aTitle = "";// spusťte Chrome a přesměrujte jej na základní adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prohlížečedriver.manage (). window (). maximize ();// získá skutečnou hodnotu tituluaTitle = driver.getTitle ();// porovnat skutečný název s očekávanýmif (aTitle.contentEquals (eTitle)){System.out.println ("Test úspěšně proveden");}else {System.out.println ("Test selhal");}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / sekce / 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] / sekce / 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 na dobu definovanou ve třídě „ WebDriverWait “ nebo „ ExpectedConditions “, podle toho, co nastane dříve.
Výše uvedený kód Java uvádí, že čekáme na prvek po dobu 20 sekund, jak je definováno ve třídě „ WebDriverWait “ na webové stránce, dokud nebudou splněny podmínky „ ExpectedConditions “ a podmínkou bude „ visibilityofElementLocated “.
Následuje seznam očekávaných podmínek, které lze použít v Selenium Explicit Wait
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- presentOfAllElementsLocatedBy ()
- presentOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- visibilityOfElementLocated ()
Plynule počkejte v selenu
Funkce Fluent Wait in Selenium se používá k definování maximální doby čekání webového ovladače na podmínku, stejně jako frekvence, s jakou chceme podmínku zkontrolovat, než vyvoláme výjimku „ElementNotVisibleException“. Kontroluje webový prvek v pravidelných intervalech, dokud není nalezen objekt nebo dojde k vypršení časového limitu.
Frekvence: Nastavení opakovacího cyklu s časovým rámcem pro ověření / kontrolu stavu v pravidelném časovém intervalu
Zvažme scénář, kdy je prvek načten v různých časových intervalech. Prvek se může načíst do 10 sekund, 20 sekund nebo i více, než když deklarujeme explicitní čekání 20 sekund. Před vyvoláním výjimky počká do zadaného času. V takových scénářích je ideální čekání na použití plynulého čekání, protože se pokusí najít prvek na jiné frekvenci, dokud jej nenajde nebo nedojde poslední časovač.
Syntax:
Wait wait = nový FluentWait (odkaz na WebDriver).withTimeout (časový limit, SECONDS).pollingEvery (časový limit, SECONDS).ignoring (Exception.class);
Výše uvedený kód je ve verzi Selen v3.11 a vyšší zastaralý. Musíte použít
Wait wait = nový FluentWait (odkaz na WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Exception.class);
balíček 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;importovat org.openqa.selenium.support.ui.ExectedConditions;importovat org.openqa.selenium.support.ui.FluentWait;import org.openqa.selenium.support.ui.Wait;importovat org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;veřejná třída AppTest3 {chráněný ovladač WebDriver;@Testpublic void guru99tutorials () vyvolá InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");Řetězec eTitle = "Ukázková stránka Guru99";Řetězec aTitle = "";driver = new ChromeDriver ();// spusťte Chrome a přesměrujte jej na základní adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prohlížečedriver.manage (). window (). maximize ();// získá skutečnou hodnotu tituluaTitle = driver.getTitle ();// porovnat skutečný název s očekávanýmif (aTitle.contentEquals (eTitle)){System.out.println ("Test úspěšně proveden");}else {System.out.println ("Test selhal");}Waitwait = new FluentWait (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (nová funkce () {veřejné WebElement platí (ovladač WebDriver) {návrat driver.findElement (By.xpath ("/ html / body / div [1] / sekce / 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 "));}});// klikněte na odkaz na selenclickseleniumlink.click ();// zavřít ~ prohlížečdriver.close ();}}
Vysvětlení kódu
Zvažte následující kód:
Waitwait = new FluentWait (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:
veřejné WebElement platí (ovladač WebDriver) {návrat driver.findElement (By.xpath ("/ html / body / div [1] / sekce / 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 k identifikaci webového prvku na stránce. (Příklad: Webový prvek zde není nic jiného než odkaz selen na webové stránce).
Frekvence je nastavena na 5 sekund a maximální čas je nastaven na 30 sekund. To znamená, že každých 5 sekund bude kontrolovat prvek na webové stránce po maximální dobu 30 sekund. Pokud je prvek umístěn v tomto časovém rámci, provede operace, jinak vyvolá „ ElementNotVisibleException “
Rozdíl mezi Implicit Wait Vs Explicit Wait
Implicitní počkat | Explicitní čekání |
---|---|
|
|
|
|
|
|
Závěr:
Implicitní, explicitní a plynulé čekání jsou různé čekání používané v selenu. Využití těchto čekání je zcela založeno na prvcích, které jsou načítány v různých časových intervalech. Vždy se nedoporučuje používat Thread.Sleep () při testování naší aplikace nebo budování našeho rámce.
Do tohoto článku přispívá Chaitanya Pujari