Implicit, eksplicit og amp; Flydende ventetid i Selen WebDriver

Indholdsfortegnelse:

Anonim

I Selen spiller "Vent" en vigtig rolle i udførelsen af ​​test. I denne vejledning lærer du forskellige aspekter af både "Implicit" og "Eksplicit" ventetid i Selen.

I denne vejledning lærer du:

  • Hvorfor har vi brug for ventetid i selen?
  • Implicit Vent
  • Eksplicit Vent
  • Flydende Vent

Hvorfor har vi brug for ventetid i selen?

De fleste af webapplikationerne er udviklet ved hjælp af Ajax og Javascript. Når en side indlæses af browseren, kan de elementer, som vi vil interagere med, indlæses med forskellige tidsintervaller.

Ikke alene gør det vanskeligt at identificere elementet, men også hvis elementet ikke er placeret, vil det kaste en undtagelse " ElementNotVisibleException ". Ved hjælp af Selen Waits kan vi løse dette problem.

Lad os overveje et scenario, hvor vi skal bruge både implicit og eksplicit ventetid i vores test. Antag, at den implicitte ventetid er indstillet til 20 sekunder, og eksplicit ventetid er indstillet til 10 sekunder.

Antag, at vi forsøger at finde et element, der har nogle "ExpectedConditions " (Eksplicit Vent). Hvis elementet ikke er placeret inden for den tidsramme, der er defineret af Eksplicit Vent (10 Sekunder), vil det bruge den tidsramme, der er defineret af implicit ventetid ( 20 sekunder) inden du kaster en " ElementNotVisibleException ".

Selen Web Driver venter

  1. Implicit Vent
  2. Eksplicit Vent

Implicit Vent i Selen

Den implicitte ventetid i selen bruges til at fortælle webdriveren at vente i en vis tid, før den kaster en "Ingen sådan elementundtagelse". Standardindstillingen er 0. Når vi har indstillet klokkeslættet, venter webdriveren på elementet i den tid, inden han kaster en undtagelse.

Selen Web Driver har lånt ideen om implicit ventetid fra Watir.

I nedenstående eksempel har vi erklæret en implicit ventetid med tidsrammen på 10 sekunder. Det betyder, at hvis elementet ikke er placeret på websiden inden for den tidsramme, kaster det en undtagelse.

For at erklære implicit ventetid:

Syntaks :

driver.manage (). timeouts (). implicitWait (TimeOut, TimeUnit.SECONDS); 
pakke guru.test99;import java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;offentlig klasse AppTest {beskyttet WebDriver-driver;@Prøveoffentlige ugyldige guru99tutorials () kaster InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = ny ChromeDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);String eTitle = "Demo Guru99 Side";String aTitle = "";// start Chrome og omdiriger det til Base URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer browservinduetdriver.manage (). vindue (). maksimere ();// få den aktuelle værdi af titlenaTitle = driver.getTitle ();// sammenligne den aktuelle titel med den forventede titelhvis (aTitle.equals (eTitle)){System.out.println ("Test bestået");}andet {System.out.println ("Test mislykkedes");}// luk browserdriver.close ();}}

Forklaring af kode

I ovenstående eksempel

Overvej følgende kode:

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

Implicit ventetid accepterer 2 parametre, den første parameter accepterer tiden som et heltal, og den anden parameter accepterer tidsmålingen i form af SEKUNDER, MINUTTER, MILISEKUND, MIKROSEKONDER, NANOSEKONDER, DAGE, TIMER osv.

Eksplicit Vent i Selen

Den eksplicitte ventetid i selen bruges til at fortælle webdriveren at vente på visse betingelser (forventede forhold) eller den maksimale tid, der overskrides, før man kaster undtagelsen "ElementNotVisibleException". Det er en intelligent form for ventetid, men det kan kun anvendes til bestemte elementer. Det giver bedre muligheder end implicit ventetid, da det venter på dynamisk belastede Ajax-elementer.

Når vi erklærer eksplicit ventetid, skal vi bruge " ExpectedConditions ", eller vi kan konfigurere, hvor ofte vi vil kontrollere tilstanden ved hjælp af Flydende Vent . I disse dage under implementering bruger vi Thread.Sleep () anbefales det generelt ikke at bruge

I nedenstående eksempel opretter vi referencevent til " WebDriverWait " -klassen og instanterer ved hjælp af " WebDriver " -reference, og vi giver en maksimal tidsramme på 20 sekunder.

Syntaks:

WebDriverWait vent = ny WebDriverWait (WebDriverRefrence, TimeOut);
pakke guru.test99;import java.util.concurrent.TimeUnit;importer 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;offentlig klasse AppTest2 {beskyttet WebDriver-driver;@Prøveoffentlige ugyldige guru99tutorials () kaster InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = ny ChromeDriver ();WebDriverWait vent = ny WebDriverWait (driver, 20);String eTitle = "Demo Guru99 Side";String aTitle = "";// start Chrome og omdiriger det til Base URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer browservinduetdriver.manage (). vindue (). maksimere ();// få den aktuelle værdi af titlenaTitle = driver.getTitle ();// sammenligne den aktuelle titel med den forventede titelhvis (aTitle.contentEquals (eTitle)){System.out.println ("Test bestået");}andet {System.out.println ("Test mislykkedes");}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / sektion / 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 ();}}

Forklaring af kode

Overvej følgende kode:

WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / sektion / 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 ();

I dette WebDriver-ventende eksempel skal du vente på, at den tid, der er defineret i klassen " WebDriverWait " eller " ExpectedConditions ", finder sted, alt efter hvad der sker først.

Ovenstående Java-kode angiver, at vi venter på et element i tidsrammen på 20 sekunder som defineret i klassen " WebDriverWait " på websiden, indtil " ExpectedConditions " er opfyldt, og betingelsen er " visibilityofElementLocated ".

Følgende er de forventede forhold, der kan bruges i selent eksplicit ventetid

  1. alarmIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. presenceOfAllElementsLocatedBy ()
  9. tilstedeværelseOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. titleIs ()
  14. titleContains ()
  15. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Flydende vent i selen

Den flydende ventetid i selen bruges til at definere den maksimale tid for webdriveren til at vente på en tilstand samt den hyppighed, hvormed vi vil kontrollere tilstanden, inden vi kaster en undtagelse "ElementNotVisibleException". Det kontrollerer for webelementet med jævne mellemrum, indtil objektet findes eller timeout sker.

Frekvens: Opsætning af en gentagelsescyklus med tidsrammen for at kontrollere / kontrollere tilstanden med det regelmæssige tidsinterval

Lad os overveje et scenarie, hvor et element indlæses med forskellige tidsintervaller. Elementet kan indlæses inden for 10 sekunder, 20 sekunder eller endnu mere, end hvis vi erklærer en eksplicit ventetid på 20 sekunder. Det venter til det angivne tidspunkt, inden der kaster en undtagelse. I sådanne scenarier er den flydende ventetid den ideelle ventetid til brug, da dette vil forsøge at finde elementet med forskellige frekvenser, indtil det finder det, eller den endelige timer løber ud.

Syntaks:

Vent vent = nyt FluentWait (WebDriver-reference).withTimeout (timeout, SECONDS).pollingEvery (timeout, SECONDS).ignoring (Exception.class);

Ovenstående kode udfases i Selenium v3.11 og derover. Du skal bruge

Vent vent = nyt FluentWait (WebDriver-reference).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Exception.class);
pakke guru.test99;import org.testng.annotations.Test;import java.util.NoSuchElementException;import java.util.concurrent.TimeUnit;import java.util.function.Function;importer 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;offentlig klasse AppTest3 {beskyttet WebDriver-driver;@Prøveoffentlige ugyldige guru99tutorials () kaster InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Demo Guru99 Side";String aTitle = "";driver = ny ChromeDriver ();// start Chrome og omdiriger det til Base URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer browservinduetdriver.manage (). vindue (). maksimere ();// få den aktuelle værdi af titlenaTitle = driver.getTitle ();// sammenligne den aktuelle titel med den forventede titelhvis (aTitle.contentEquals (eTitle)){System.out.println ("Test bestået");}andet {System.out.println ("Test mislykkedes");}Vent  vent = nyt FluentWait  (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement klikker påeleniumlink = wait.until (ny funktion  () {offentlig WebElement gælder (WebDriver-driver) {return driver.findElement (By.xpath ("/ html / body / div [1] / sektion / 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 på selen-linketklikeleniumlink.click ();// luk ~ browserdriver.close ();}}

Forklaring af kode

Overvej følgende kode:

Vent  vent = nyt FluentWait  (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);

I ovenstående eksempel erklærer vi en flydende ventetid med timeout på 30 sekunder, og frekvensen er indstillet til 5 sekunder ved at ignorere " NoSuchElementException "

Overvej følgende kode:

offentlig WebElement gælder (WebDriver-driver) {return driver.findElement (By.xpath ("/ html / body / div [1] / sektion / 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 ")); 

Vi har oprettet en ny funktion til at identificere webelementet på siden. (Eks: Her er Webelement kun Selenium-linket på websiden).

Frekvensen er indstillet til 5 sekunder, og den maksimale tid er indstillet til 30 sekunder. Dette betyder således, at det vil kontrollere elementet på websiden hvert 5. sekund i den maksimale tid på 30 sekunder. Hvis elementet er placeret inden for denne tidsramme, udfører det operationerne, ellers kaster det et " ElementNotVisibleException "

Forskel mellem Implicit Vent Vs Eksplicit Vent

Implicit Vent Eksplicit Vent
  • Implicit ventetid anvendes på alle elementerne i scriptet
  • Eksplicit ventetid anvendes kun på de elementer, som er beregnet af os
  • I Implicit Vent behøver vi ikke angive "ExpectedConditions" på det element, der skal placeres
  • I Eksplicit Vent skal vi specificere "ExpectedConditions" på det element, der skal placeres
  • Det anbefales at bruge, når elementerne er placeret med den tidsramme, der er angivet i implicit ventetid på Selen
  • Det anbefales at bruge, når elementerne tager lang tid at indlæse, og også til at verificere elementets egenskab som (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Konklusion:

Implicit, eksplicit og flydende ventetid er de forskellige ventetider, der bruges i selen. Brug af disse ventetider er totalt baseret på de elementer, der er indlæst med forskellige tidsintervaller. Det anbefales altid ikke at bruge Thread.Sleep (), mens vi tester vores applikation eller bygger vores ramme.

Denne artikel er bidraget af Chaitanya Pujari