Implicitno, eksplicitno i & Tekuće pričekajte u Selenium WebDriver-u

Sadržaj:

Anonim

U selenu, "Čekanja" igraju važnu ulogu u izvršavanju testova. U ovom vodiču naučit ćete razne aspekte „Implicitnog“ i „Eksplicitnog“ čekanja u Seleniju.

U ovom vodiču naučit ćete:

  • Zašto nam trebaju čekanja na selen?
  • Implicitno čekanje
  • Eksplicitno pričekajte
  • Tečno pričekajte

Zašto nam trebaju čekanja na selen?

Većina web aplikacija razvijena je pomoću Ajaxa i Javascripta. Kada se stranica učita putem preglednika, elementi s kojima želimo komunicirati mogu se učitati u različitim vremenskim intervalima.

Ne samo da to otežava identificiranje elementa, već će i ako element nije lociran izbaciti " ElementNotVisibleException " iznimku. Korištenjem Selenium Waits možemo riješiti ovaj problem.

Razmotrimo scenarij u kojem u svom testu moramo koristiti i implicitna i eksplicitna čekanja. 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 neke "očekivane uvjete " (eksplicitno čekanje), ako se element ne nalazi u vremenskom okviru definiranom eksplicitnim čekanjem (10 sekundi), koristit će vremenski okvir definiran implicitnim čekanjem ( 20 sekundi) prije bacanja " ElementNotVisibleException ".

Čeka upravljački program selena

  1. Implicitno čekanje
  2. Eksplicitno pričekajte

Implicitno čekanje u selenu

Implicitno čekati u selena se koristi za reći web vozač čekati određeno vrijeme prije nego što ga baca „No takav element iznimke”. Zadana je postavka 0. Jednom kada postavimo vrijeme, web upravljački program će pričekati element za to vrijeme prije nego što izbaci iznimku.

Selenium web vozač je posudio ideju implicitnih čekanja od Watira.

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

Da biste proglasili implicitno čekanje:

Sintaksa :

driver.manage (). timeouts (). implicitnoWait (TimeOut, TimeUnit.SECONDS); 
paket guru.test99;import 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štićeni upravljački program WebDriver;@Testpublic void guru99tutorials () baca InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");upravljački program = novi ChromeDriver ();driver.manage (). timeouts (). implicitnoWait (10, TimeUnit.SECONDS);String eTitle = "Demo Guru99 stranica";Niz aTitle = "";// pokrenimo Chrome i preusmjerimo ga na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimizira prozor preglednikadriver.manage (). window (). maximize ();// dobivanje stvarne vrijednosti naslovaaTitle = driver.getTitle ();// usporedi stvarni naslov s očekivanim naslovomako (aTitle.equals (eTitle)){System.out.println ("Test je položen");}inače {System.out.println ("Test nije uspio");}// zatvori preglednikdriver.close ();}}

Objašnjenje koda

U gornjem primjeru,

Razmislite o sljedećem kodu:

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

Implicitno čekanje prihvaća 2 parametra, prvi parametar prihvaća vrijeme kao cjelobrojnu vrijednost, a drugi parametar prihvaća mjerenje vremena u SEKUNDAMA, MINUTAMA, MILISEKONDU, MIKROSEKUNDAMA, NANOSEKUNDAMA, DANIMA, SATIMA itd.

Eksplicitno čekanje u selenu

Eksplicitno čekati u selena se koristi za reći web Driver čekati određenim uvjetima (očekivanim uvjetima) ili maksimalno vrijeme prekoračili prije bacanja „ElementNotVisibleException” iznimku. To je inteligentna vrsta čekanja, ali se može primijeniti samo za određene elemente. Pruža bolje mogućnosti od implicitnog čekanja jer čeka dinamički učitane Ajax elemente.

Jednom kada proglasimo izričito čekanje, moramo koristiti " ExpectedConditions " ili možemo konfigurirati koliko često želimo provjeravati stanje pomoću Fluent Wait . Ovih dana dok implementiramo koristimo Thread.Sleep () uglavnom se ne preporučuje korištenje

U donjem primjeru stvaramo referentno čekanje za klasu " WebDriverWait " i instanciramo pomoću reference " WebDriver ", a dajemo maksimalni vremenski okvir od 20 sekundi.

Sintaksa:

WebDriverWait wait = novi WebDriverWait (WebDriverRefrence, TimeOut);
paket guru.test99;import 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;javna klasa AppTest2 {zaštićeni upravljački program WebDriver;@Testpublic void guru99tutorials () baca InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");upravljački program = novi ChromeDriver ();WebDriverWait wait = novi WebDriverWait (upravljački program, 20);String eTitle = "Demo Guru99 stranica";Niz aTitle = "";// pokrenimo Chrome i preusmjerimo ga na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimizira prozor preglednikadriver.manage (). window (). maximize ();// dobivanje stvarne vrijednosti naslovaaTitle = driver.getTitle ();// usporedi stvarni naslov s očekivanim naslovomif (aTitle.contentEquals (eTitle)){System.out.println ("Test je položen");}inače {System.out.println ("Test nije uspio");}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

Razmislite o sljedećem kodu:

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 za WebDriver, pričekajte da se dogodi koliko vremena se definira u klasi " WebDriverWait " ili " ExpectedConditions " ovisno o tome što se prvo dogodi.

Gornji Java kôd navodi da čekamo element za vremenski okvir od 20 sekundi kako je definirano u klasi " WebDriverWait " na web stranici dok se ne ispune " Očekivani uvjeti" i uvjet je " visibilityofElementLocated ".

Slijede očekivani uvjeti koji se mogu koristiti u Selenium Explicit Wait

  1. alertIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. prisotnostOfAllElementsLocatedBy ()
  9. prisotnostOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. naslovIs ()
  14. titleContains ()
  15. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Tečno čekanje u selenu

Fluent čekati u selena se koristi za definiranje maksimalnog vremena za web vozač čekati stanju, kao i učestalost kojom želimo provjeriti stanje prije bacanje „ElementNotVisibleException” iznimku. Provjerava web element u redovitim intervalima dok se objekt ne pronađe ili se dogodi vremensko ograničenje.

Učestalost: postavljanje ciklusa ponavljanja s vremenskim okvirom za provjeru / provjeru stanja u redovnom vremenskom intervalu

Razmotrimo scenarij u kojem se element učitava u različitim vremenskim intervalima. Element se može učitati u roku od 10 sekundi, 20 sekundi ili čak više od toga ako proglasimo izričito čekanje od 20 sekundi. Pričekat će određeno vrijeme prije nego što izbaci iznimku. U takvim scenarijima idealno je čekanje za fluentno čekanje jer će se pokušati pronaći element na različitoj frekvenciji dok ga ne pronađe ili ne istekne konačni tajmer.

Sintaksa:

Čekaj pričekaj = novo FluentWait (referenca za WebDriver).withTimeout (timeout, SECONDS).pollingEvery (timeout, SECONDS).prikazivanje (iznimka.razred);

Gore navedeni kôd zastario je u programu Selenium v3.11 i novijim. Trebate koristiti

Čekaj pričekaj = novo FluentWait (referenca za WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).prikazivanje (iznimka.razred);
paket guru.test99;import org.testng.annotations.Test;import java.util.NoSuchElementException;import 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štićeni upravljački program WebDriver;@Testpublic void guru99tutorials () baca InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Demo Guru99 stranica";Niz aTitle = "";upravljački program = novi ChromeDriver ();// pokrenimo Chrome i preusmjerimo ga na osnovni URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimizira prozor preglednikadriver.manage (). window (). maximize ();// dobivanje stvarne vrijednosti naslovaaTitle = driver.getTitle ();// usporedi stvarni naslov s očekivanim naslovomif (aTitle.contentEquals (eTitle)){System.out.println ("Test je položen");}inače {System.out.println ("Test nije uspio");}Pričekajte  pričekajte = novo FluentWait  (upravljački program).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).pripisivanje (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (nova funkcija  () {primjenjuje se javni WebElement (pokretački program WebDriver) {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 "));}});// kliknite vezu selenaclickseleniumlink.click ();// zatvori ~ preglednikdriver.close ();}}

Objašnjenje koda

Razmislite o sljedećem kodu:

Pričekajte  pričekajte = novo FluentWait  (upravljački program).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).pripisivanje (NoSuchElementException.class);

U gornjem primjeru proglašavamo tečno čekanje s vremenskim ograničenjem od 30 sekundi, a frekvencija se postavlja na 5 sekundi ignoriranjem " NoSuchElementException "

Razmislite o sljedećem kodu:

primjenjuje se javni WebElement (pokretački program WebDriver) {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 do veza Selenium na web stranici).

Frekvencija je postavljena na 5 sekundi, a maksimalno vrijeme na 30 sekundi. Stoga to znači da će provjeravati element na web stranici svakih 5 sekundi tijekom maksimalnog vremena od 30 sekundi. Ako se element nalazi u tom vremenskom okviru, on će izvesti operacije, u suprotnom će izbaciti " ElementNotVisibleException "

Razlika između implicitnog čekanja i eksplicitnog čekanja

Implicitno čekanje Eksplicitno pričekajte
  • Implicitno vrijeme čekanja primjenjuje se na sve elemente u skripti
  • Eksplicitno vrijeme čekanja primjenjuje se samo na one elemente koje smo namijenili
  • U Implicitna Čekaj, moramo ne navesti „ExpectedConditions” na element koji se nalazi
  • U eksplicitnom čekanju moramo navesti "Očekivani uvjeti" na elementu koji će se nalaziti
  • Preporučuje se koristiti kada se elementi nalaze s vremenskim okvirom navedenim u Selenium implicitnom čekanju
  • Preporučuje se koristiti kada se elementima treba puno vremena za učitavanje, a također i za provjeru svojstva elementa poput (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Zaključak:

Implicitno, eksplicitno i tečno čekanje različita su čekanja koja se koriste u selenu. Korištenje ovih čekanja u potpunosti se temelji na elementima koji se učitavaju u različitim intervalima vremena. Uvijek se ne preporučuje upotreba Thread.Sleep () tijekom testiranja naše aplikacije ili izgradnje našeg okvira.

Ovaj članak je napisao Chaitanya Pujari