Implicitné, Explicitné a Plynulé čakanie v selenovom WebDriveri

Obsah:

Anonim

Na seléne hrá „Waits“ dôležitú úlohu pri vykonávaní testov. V tomto tutoriáli sa dozviete rôzne aspekty čakania „Implicit“ aj „Explicit“ v seléne.

V tomto návode sa dozviete:

  • Prečo potrebujeme čakanie na selén?
  • Implicitné čakanie
  • Explicitné čakanie
  • Plynule počkajte

Prečo potrebujeme čakanie na selén?

Väčšina webových aplikácií je vyvinutá pomocou technológií Ajax a Javascript. Po načítaní stránky prehliadačom sa prvky, s ktorými chceme interagovať, môžu načítať v rôznych časových intervaloch.

Nielenže to sťažuje identifikáciu prvku, ale aj v prípade, že sa prvok nenachádza, vyvolá výnimku „ ElementNotVisibleException “. Tento problém môžeme vyriešiť pomocou Selenium Waits.

Uvažujme o scenári, keď v našom teste musíme použiť implicitné aj explicitné čakania. Predpokladajme, že implicitný čas čakania je nastavený na 20 sekúnd a explicitný čas čakania je nastavený na 10 sekúnd.

Predpokladajme, že sa pokúšame nájsť prvok, ktorý má nejaké „ExpectedConditions “ (Explicit Wait). Ak sa element nenachádza v časovom rámci definovanom Explicitným čakaním (10 sekúnd), použije sa časový rámec definovaný implicitným čakaním ( 20 sekúnd) pred vyhodením „ ElementNotVisibleException “.

Selénový webový ovládač čaká

  1. Implicitné čakanie
  2. Explicitné čakanie

Implicitné čakanie na seléne

Implicitné Wait v Selén je používaný oznámiť webovému vodič čakať na určitú dobu, než sa hodí "No taký prvok výnimka". Predvolené nastavenie je 0. Po nastavení času bude webový ovládač čakať na prvok v danom čase a potom vyvolá výnimku.

Selenium Web Driver si vypožičal myšlienku implicitného čakania od Watira.

V nasledujúcom príklade sme deklarovali implicitné čakanie s časovým rámcom 10 sekúnd. Znamená to, že ak sa prvok v danom časovom rámci nenachádza na webovej stránke, spôsobí výnimku.

Deklarovanie implicitného čakania:

Syntax :

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;verejná trieda AppTest {chránený ovládač WebDriver;@Testpublic void guru99tutorials () hodí InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");ovládač = nový ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);Reťazec eTitle = "Demo Guru99 stránka";Reťazec aTitle = "";// spustite Chrome a presmerujte ho na základnú adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prehliadačadriver.manage (). window (). maximize ();// získa skutočnú hodnotu tituluaTitle = driver.getTitle ();// porovnanie skutočného názvu s očakávanýmif (aTitle.equals (eTitle)){System.out.println ("Test prešiel");}else {System.out.println ("Test zlyhal");}// zavrieť prehliadačdriver.close ();}}

Vysvetlenie kódu

Vo vyššie uvedenom príklade

Zvážte nasledujúci kód:

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

Implicitné čakanie prijme 2 parametre, prvý parameter prijme čas ako celočíselnú hodnotu a druhý parameter prijme meranie času z hľadiska SEKUND, MINÚT, MILISECOND, MIKROSEKOND, NANOSEKONDY, DNI, HODINY atď.

Explicitné čakanie na seléne

Explicit Wait v Selén je používaný oznámiť webovému ovládač čakať na určitých podmienok (predpokladaných podmienok) alebo maximálny čas prekročený pred hádzanie "ElementNotVisibleException" výnimku. Je to inteligentný druh čakania, ale dá sa použiť iba na určené prvky. Poskytuje lepšie možnosti ako implicitné čakanie, pretože čaká na dynamicky načítané prvky Ajaxu.

Keď deklarujeme výslovné čakanie, musíme použiť „ ExpectedConditions “ alebo môžeme nakonfigurovať, ako často chceme skontrolovať stav pomocou funkcie Fluent Wait . V dnešnej dobe pri implementácii používame program Thread.Sleep (), ktorý sa všeobecne neodporúča používať

V nasledujúcom príklade vytvárame referenčné čakanie na triedu „ WebDriverWait “ a vytváranie inštancií pomocou referencie „ WebDriver “ a dávame maximálny časový rámec 20 sekúnd.

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;importovať org.openqa.selenium.support.ui.ExectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;verejná trieda AppTest2 {chránený ovládač WebDriver;@Testpublic void guru99tutorials () hodí InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");ovládač = nový ChromeDriver ();WebDriverWait wait = nový WebDriverWait (ovládač, 20);Reťazec eTitle = "Demo Guru99 stránka";Reťazec aTitle = "";// spustite Chrome a presmerujte ho na základnú adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prehliadačadriver.manage (). window (). maximize ();// získa skutočnú hodnotu tituluaTitle = driver.getTitle ();// porovnanie skutočného názvu s očakávanýmif (aTitle.contentEquals (eTitle)){System.out.println ("Test prešiel");}else {System.out.println ("Test zlyhal");}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / oddiel / 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 ();}}

Vysvetlenie kódu

Zvážte nasledujúci kód:

WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / oddiel / 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 príklade čakania na WebDriver počkajte, kým sa vyskytne čas definovaný v triede „ WebDriverWait “ alebo „ ExpectedConditions “, podľa toho, čo nastane skôr.

Vyššie uvedený kód Java uvádza, že čakáme na prvok v časovom rámci 20 sekúnd, ako je definované v triede „ WebDriverWait “ na webovej stránke, kým nebudú splnené podmienky „ ExpectedConditions “ a podmienkou bude „ visibilityofElementLocated “.

Nasledujú očakávané podmienky, ktoré je možné použiť v seléne Explicit Wait

  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. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Plynulé čakanie v seléne

Funkcia Fluent Wait in Selenium sa používa na definovanie maximálneho času, počas ktorého musí webový ovládač čakať na stav, ako aj frekvencie, s akou chceme tento stav skontrolovať, pred vyvolaním výnimky „ElementNotVisibleException“. V pravidelných intervaloch kontroluje webový prvok, kým sa nenájde objekt alebo nevyprší časový limit.

Frekvencia: Nastavenie opakovacieho cyklu s časovým rámcom na overenie / kontrolu stavu v pravidelnom časovom intervale

Uvažujme o scenári, keď je prvok načítaný v rôznych časových intervaloch. Element by sa mohol načítať do 10 sekúnd, 20 sekúnd alebo dokonca viac, ako keby sme deklarovali výslovné čakanie 20 sekúnd. Pred udelením výnimky počká do stanoveného času. V takýchto scenároch je ideálne čakanie na použitie plynulého čakania, pretože sa pokúsi nájsť prvok s rôznou frekvenciou, kým ho nenájde alebo kým nedôjde konečný časovač.

Syntax:

Čakať čakať = nový FluentWait (referencia WebDriver).withTimeout (časový limit, SECONDS).pollingEvery (časový limit, SECONDS).ignoring (Exception.class);

Vyššie uvedený kód je vo verzii Selen v3.11 a vyššej zastaraný. Musíte použiť

Čakať čakať = nový FluentWait (referencia 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;importovať org.openqa.selenium.support.ui.ExectedConditions;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;verejná trieda AppTest3 {chránený ovládač WebDriver;@Testpublic void guru99tutorials () hodí InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");Reťazec eTitle = "Demo Guru99 stránka";Reťazec aTitle = "";ovládač = nový ChromeDriver ();// spustite Chrome a presmerujte ho na základnú adresu URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maximalizuje okno prehliadačadriver.manage (). window (). maximize ();// získa skutočnú hodnotu tituluaTitle = driver.getTitle ();// porovnanie skutočného názvu s očakávanýmif (aTitle.contentEquals (eTitle)){System.out.println ("Test prešiel");}else {System.out.println ("Test zlyhal");}Wait  wait = new FluentWait  (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (nová funkcia  () {verejné WebElement (ovládač WebDriver) {návrat driver.findElement (By.xpath ("/ html / body / div [1] / oddiel / 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 "));}});// klik na odkaz na selénclickseleniumlink.click ();// zavrieť ~ prehliadačdriver.close ();}}

Vysvetlenie kódu

Zvážte nasledujúci kód:

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

V uvedenom príklade deklarujeme plynulé čakanie s časovým limitom 30 sekúnd a frekvencia je nastavená na 5 sekúnd ignorovaním „ NoSuchElementException “.

Zvážte nasledujúci kód:

verejné WebElement (ovládač WebDriver) {návrat driver.findElement (By.xpath ("/ html / body / div [1] / oddiel / 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 ")); 

Vytvorili sme novú funkciu na identifikáciu webového prvku na stránke. (Príklad: Webový prvok tu nie je nič iné ako odkaz na selén na webovej stránke).

Frekvencia je nastavená na 5 sekúnd a maximálny čas je nastavený na 30 sekúnd. To znamená, že bude kontrolovať prvok na webovej stránke každých 5 sekúnd po maximálnu dobu 30 sekúnd. Ak sa prvok nachádza v tomto časovom rámci, bude vykonávať operácie, inak vyvolá „ ElementNotVisibleException

Rozdiel medzi implicitným čakaním a explicitným čakaním

Implicitné čakanie Explicitné čakanie
  • Implicitná doba čakania sa použije na všetky prvky v skripte
  • Explicitná doba čakania sa vzťahuje iba na tie prvky, ktoré sú nami určené
  • V implicitné Počkajte, nemusí nám to špecifikovať "ExpectedConditions" na prvku, ktorý má byť umiestnený
  • V poli Explicit Wait musíme na prvku, ktorý sa má nachádzať, určiť „ExpectedConditions“
  • Odporúča sa použiť, keď sú prvky umiestnené s časovým rámcom špecifikovaným v implicitnom čakaní na selén
  • Odporúča sa používať, keď sa načítanie prvkov trvá dlho, a tiež na overenie vlastnosti prvku, ako je napríklad (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Záver:

Implicitné, explicitné a plynulé čakanie sú rôzne čakania používané v seléne. Využitie týchto čakaní je úplne založené na prvkoch, ktoré sú načítané v rôznych časových intervaloch. Počas testovania našej aplikácie alebo budovania nášho rámca sa vždy neodporúča používať Thread.Sleep ().

Do tohto článku prispieva Chaitanya Pujari