Implicitno, eksplicitno in & Tekoče počakajte v programu Selenium WebDriver

Kazalo:

Anonim

V selenu imajo "čakanja" pomembno vlogo pri izvajanju testov. V tej vadnici boste izvedeli različne vidike čakanja "implicitno" in "eksplicitno" v seleniju.

V tej vadnici boste izvedeli:

  • Zakaj potrebujemo čakanja v selenu?
  • Implicitno počakajte
  • Izrecno počakajte
  • Tekoče počakajte

Zakaj potrebujemo čakanja v selenu?

Večina spletnih aplikacij je razvitih z uporabo Ajaxa in Javascripta. Ko brskalnik naloži stran, se lahko elementi, s katerimi želimo sodelovati, naložijo v različnih časovnih intervalih.

To ne samo otežuje prepoznavanje elementa, ampak tudi, če element ni lociran, bo vrgel izjemo " ElementNotVisibleException ". Z uporabo selena Waits lahko to težavo rešimo.

Razmislimo o scenariju, v katerem moramo v svojem testu uporabiti tako implicitna kot eksplicitna čakanja. Predpostavimo, da je implicitni čas čakanja nastavljen na 20 sekund, eksplicitni čas čakanja pa na 10 sekund.

Recimo, da poskušamo najti element, ki ima nekaj "pričakovanih pogojev " (eksplicitno čakanje). Če se element ne nahaja v časovnem okviru, ki ga določa eksplicitno čakanje (10 sekund), bo uporabil časovni okvir, določen z implicitnim čakanjem ( 20 sekund), preden vržete " ElementNotVisibleException ".

Čaka spletni gonilnik selena

  1. Implicitno počakajte
  2. Izrecno počakajte

Implicitno čakanje v selenu

Implicitno Počakajte na Selen se uporablja za povedati spletno voznik počakati za določen čas, preden se vrže "Ni takšnega elementa izjema". Privzeta nastavitev je 0. Ko nastavimo čas, bo spletni gonilnik počakal na element za ta čas, preden bo vrgel izjemo.

Selen Web Driver si je idejo o implicitnih čakanjih sposodil pri Watirju.

V spodnjem primeru smo razglasili implicitno čakanje s časovnim okvirom 10 sekund. To pomeni, da če element v tem časovnem okviru ni na spletni strani, bo vrgel izjemo.

Če želite razglasiti implicitno čakanje:

Sintaksa :

driver.manage (). timeouts (). implicitnoWait (TimeOut, TimeUnit.SECONDS); 
paket guru.test99;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;javni razred AppTest {zaščiten gonilnik WebDriver;@Testpublic void guru99tutorials () vrže InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");gonilnik = nov ChromeDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);String eTitle = "Predstavitvena stran Guru99";Niz aTitle = "";// zaženimo Chrome in ga preusmerimo na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Poveča okno brskalnikadriver.manage (). window (). maximize ();// dobimo dejansko vrednost naslovaaTitle = driver.getTitle ();// primerjamo dejanski naslov s pričakovanim naslovomče (aTitle.equals (eTitle)){System.out.println ("Test uspešno opravljen");}sicer {System.out.println ("Test ni uspel");}// zapremo brskalnikdriver.close ();}}

Pojasnilo kode

V zgornjem primeru je

Upoštevajte naslednjo kodo:

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

Implicitno čakanje bo sprejelo 2 parametra, prvi bo sprejel čas kot celoštevilčno vrednost, drugi pa bo sprejel merjenje časa v SEKUNDIH, MINUTAH, MILISEKONDIH, MIKROSEKONDAH, NANOSEKONDAH, DNIH, URAH itd.

Izrecno čakanje v selenu

Explicit Počakajte na Selen se uporablja, da spletnemu Driver čakati določenimi pogoji (pričakovanimi pogoji) ali maksimalni čas presegli pred metanje "ElementNotVisibleException" izjema. To je inteligentna vrsta čakanja, vendar jo je mogoče uporabiti samo za določene elemente. Omogoča boljše možnosti kot implicitno čakanje, saj čaka na dinamično naložene elemente Ajax.

Ko razglasimo eksplicitno čakanje, moramo uporabiti " ExpectedConditions " ali pa lahko nastavimo, kako pogosto želimo preverjati stanje s pomočjo Fluent Wait . Danes med izvajanjem uporabljamo Thread.Sleep (), ki ga na splošno ni priporočljivo uporabljati

V spodnji primer, smo ustvarili referenčno čakati na " WebDriverWait razreda" in instantiating uporabo " WebDriver " referenco, in dajemo največjo časovni okvir 20 sekund.

Sintaksa:

WebDriverWait wait = novo WebDriverWait (WebDriverRefrence, TimeOut);
paket guru.test99;uvoz java.util.concurrent.TimeUnit;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;javni razred AppTest2 {zaščiten gonilnik WebDriver;@Testpublic void guru99tutorials () vrže InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");gonilnik = nov ChromeDriver ();WebDriverWait wait = nov WebDriverWait (gonilnik, 20);String eTitle = "Predstavitvena stran Guru99";Niz aTitle = "";// zaženimo Chrome in ga preusmerimo na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Poveča okno brskalnikadriver.manage (). window (). maximize ();// dobimo dejansko vrednost naslovaaTitle = driver.getTitle ();// primerjamo dejanski naslov s pričakovanim naslovomče (aTitle.contentEquals (eTitle)){System.out.println ("Test uspešno opravljen");}sicer {System.out.println ("Test ni uspel");}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 ();}}

Pojasnilo kode

Upoštevajte naslednjo kodo:

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 tem primeru čakanja WebDriver počakajte, koliko časa se določi v razredu " WebDriverWait " ali " ExpectedConditions ", kar nastopi prej.

Zgornja Java koda navaja, da čakamo na element v časovnem okviru 20 sekund, kot je določeno v razredu " WebDriverWait " na spletni strani, dokler niso izpolnjeni " ExpectedConditions " in je pogoj " visibilityofElementLocated ".

Sledijo pričakovani pogoji, ki jih je mogoče uporabiti v eksplicitnem čakanju selena

  1. alertIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. присутствиеOfAllElementsLocatedBy ()
  9. prisotnostOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. titleIs ()
  14. titleContains ()
  15. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Tekoče počakajte v selenu

Fluent Počakajte na Selen se uporablja za opredelitev najdaljši čas za spletno voznik čakati na pogoj, kot tudi frekvenco, s katero želimo preveriti stanje pred metanje "ElementNotVisibleException" izjema. V rednih presledkih preverja spletni element, dokler predmeta ne najdejo ali ne pride do časovne omejitve.

Pogostost: nastavitev ponovitvenega cikla s časovnim okvirom za preverjanje / preverjanje stanja v rednem časovnem intervalu

Razmislimo o scenariju, ko se element naloži v različnih časovnih intervalih. Element se lahko naloži v 10 sekundah, 20 sekundah ali celo več, kot če razglasimo izrecno čakanje 20 sekund. Počakalo bo do določenega časa, preden bo vrglo izjemo. V takih scenarijih je idealno čakanje tekoče čakanje, saj bo to skušalo najti element z različno frekvenco, dokler ga ne najde ali končni časovnik ne zmanjka.

Sintaksa:

Počakajte počakajte = novo FluentWait (referenca WebDriver).withTimeout (timeout, SECONDS).pollingEvery (časovna omejitev, SECONDS).pripis (izjema.razred);

Zgornja koda je zastarela v programu Selenium v3.11 in novejših. Morate uporabiti

Počakajte počakajte = novo FluentWait (referenca WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (trajanje sekund (SECONDS)).pripis (izjema.razred);
paket guru.test99;import org.testng.annotations.Test;uvoz java.util.NoSuchElementException;uvoz java.util.concurrent.TimeUnit;uvoz java.util.function.Function;uvoz org.openqa.selenium.By;uvoz org.openqa.selenium.WebDriver;uvoz org.openqa.selenium.WebElement;uvoz 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;javni razred AppTest3 {zaščiten gonilnik WebDriver;@Testpublic void guru99tutorials () vrže InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Predstavitvena stran Guru99";Niz aTitle = "";gonilnik = nov ChromeDriver ();// zaženimo Chrome in ga preusmerimo na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Poveča okno brskalnikadriver.manage (). window (). maximize ();// dobimo dejansko vrednost naslovaaTitle = driver.getTitle ();// primerjamo dejanski naslov s pričakovanim naslovomče (aTitle.contentEquals (eTitle)){System.out.println ("Test uspešno opravljen");}sicer {System.out.println ("Test ni uspel");}Počakajte  počakajte = novo FluentWait  (gonilnik).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).pripis (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (nova funkcija  () {velja javni javni WebElement (gonilnik WebDriver) {vrni 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 "));}});// kliknemo na povezavo selenaclickseleniumlink.click ();// zapremo ~ brskalnikdriver.close ();}}

Pojasnilo kode

Upoštevajte naslednjo kodo:

Počakajte  počakajte = novo FluentWait  (gonilnik).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).pripis (NoSuchElementException.class);

V zgornjem primeru razglašamo tekoče čakanje s časovno omejitvijo 30 sekund, frekvenca pa je nastavljena na 5 sekund z ignoriranjem " NoSuchElementException "

Upoštevajte naslednjo kodo:

velja javni javni WebElement (gonilnik WebDriver) {vrni 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 ")); 

Ustvarili smo novo funkcijo za prepoznavanje spletnega elementa na strani. (Npr .: Spletni element tukaj ni nič drugega kot povezava Selenium na spletni strani).

Frekvenca je nastavljena na 5 sekund, najdaljši čas pa na 30 sekund. To pomeni, da bo element na spletni strani preverjal vsakih 5 sekund za največ 30 sekund. Če se element nahaja v tem časovnem okviru, bo izvajal operacije, sicer pa bo vrgel " ElementNotVisibleException "

Razlika med implicitnim čakanjem in eksplicitnim čakanjem

Implicitno počakajte Izrecno počakajte
  • Implicitni čas čakanja se uporabi za vse elemente v skriptu
  • Izrecna čakalna doba velja samo za tiste elemente, ki smo jih predvideli
  • V implicitnem čakanju na elementu, ki ga najdemo, ni treba določiti "pričakovanih pogojev"
  • V eksplicitnem čakanju moramo na elementu, ki naj se nahaja, podati "ExpectedConditions"
  • Priporočljivo je, da se elementi uporabljajo s časovnim okvirom, določenim v implicitnem čakanju Selenium
  • Priporočljivo je, da se elementi nalagajo dolgo časa in tudi za preverjanje lastnosti elementa, kot je (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Zaključek:

Implicitno, eksplicitno in tekoče čakanje so različna čakanja, ki se uporabljajo v selenu. Uporaba teh čakanj v celoti temelji na elementih, ki so naloženi v različnih časovnih intervalih. Vedno ni priporočljivo uporabljati Thread.Sleep () med preskušanjem naše aplikacije ali gradnjo našega ogrodja.

Ta članek prispeva Chaitanya Pujari