I Selen spiller "Waits" en viktig rolle i utførelsen av tester. I denne opplæringen lærer du ulike aspekter av både "Implisitte" og "Eksplisitte" venter i Selen.
I denne opplæringen lærer du:
- Hvorfor trenger vi ventetid i selen?
- Implisitt Vent
- Eksplisitt Vent
- Flytende vent
Hvorfor trenger vi ventetid i selen?
De fleste nettapplikasjonene er utviklet ved hjelp av Ajax og Javascript. Når en side lastes inn av nettleseren, kan elementene vi vil samhandle med lastes inn med forskjellige tidsintervaller.
Ikke bare det gjør dette vanskelig å identifisere elementet, men også hvis elementet ikke er lokalisert, vil det kaste et unntak for " ElementNotVisibleException ". Ved å bruke Selen Waits kan vi løse dette problemet.
La oss vurdere et scenario der vi må bruke både implisitte og eksplisitte ventetider i testen. Anta at implisitt ventetid er satt til 20 sekunder og eksplisitt ventetid er satt til 10 sekunder.
Anta at vi prøver å finne et element som har noen "ExpectedConditions " (Eksplisitt ventetid). Hvis elementet ikke ligger innenfor tidsrammen definert av den eksplisitte ventetiden (10 sekunder), vil den bruke tidsrammen definert av implisitt ventetid ( 20 sekunder) før du kaster et " ElementNotVisibleException ".
Selen Web Driver venter
- Implisitt Vent
- Eksplisitt Vent
Implisitt Vent i Selen
Den implisitte ventetiden i selen brukes til å fortelle nettdriveren å vente en viss tid før den kaster et "No Such Element Exception". Standardinnstillingen er 0. Når vi har stilt inn tiden, vil nettdriveren vente på elementet for den tiden før han kaster et unntak.
Selen Web Driver har lånt ideen om implisitt ventetid fra Watir.
I eksemplet nedenfor har vi erklært en implisitt ventetid med tidsrammen på 10 sekunder. Det betyr at hvis elementet ikke er plassert på websiden innen den tidsrammen, vil det kaste et unntak.
For å erklære implisitt ventetid:
Syntaks :
driver.manage (). timeouts (). implicitWait (TimeOut, TimeUnit.SECONDS);
pakke guru.test99;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.chrome.ChromeDriver;importer org.testng.annotations.Test;offentlig klasse AppTest {beskyttet WebDriver-driver;@Testpublic void guru99tutorials () kaster InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = ny ChromeDriver ();driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);String eTitle = "Demo Guru99 Side";String aTitle = "";// start Chrome og omdiriger det til basis-URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer nettleservinduetdriver.manage (). vindu (). maksimere ();// få den faktiske verdien av tittelenaTitle = driver.getTitle ();// sammenligne den faktiske tittelen med den forventede tittelenhvis (aTitle.equals (eTitle)){System.out.println ("Test bestått");}annet {System.out.println ("Test mislyktes");}// lukk nettleserendriver.close ();}}
Forklaring av kode
I eksemplet ovenfor,
Vurder følgende kode:
driver.manage (). timeouts (). implicitly Waait (10, TimeUnit.SECONDS);
Implisitt venting aksepterer to parametere, den første parameteren aksepterer tiden som et heltall, og den andre parameteren aksepterer tidsmåling i form av SEKUNDER, MINUTTER, MILISEKUND, MIKROSEKONDER, NANOSEKONDER, DAGER, TIMER osv.
Eksplisitt Vent i Selen
Den eksplisitte ventetiden i selen brukes til å fortelle nettdriveren om å vente på visse forhold (forventede forhold) eller maksimum tid som overskrides før du kaster unntak for "ElementNotVisibleException". Det er en intelligent slags ventetid, men den kan bare brukes på spesifiserte elementer. Det gir bedre alternativer enn implisitt ventetid, da det venter på dynamisk belastede Ajax-elementer.
Når vi erklærer eksplisitt ventetid, må vi bruke " ExpectedConditions " eller vi kan konfigurere hvor ofte vi vil sjekke tilstanden ved hjelp av flytende ventetid . I disse dager bruker vi Thread.Sleep () mens vi implementerer, det anbefales generelt ikke å bruke
I eksemplet nedenfor lager vi referanse-venting til " WebDriverWait " -klassen og instanterer ved hjelp av " WebDriver " -referanse, og vi gir en maksimal tidsramme på 20 sekunder.
Syntaks:
WebDriverWait vent = ny WebDriverWait (WebDriverRefrence, TimeOut);
pakke guru.test99;importere java.util.concurrent.TimeUnit;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.chrome.ChromeDriver;importer org.openqa.selenium.support.ui.ExpectedConditions;importer org.openqa.selenium.support.ui.WebDriverWait;importer org.testng.annotations.Test;offentlig klasse AppTest2 {beskyttet WebDriver-driver;@Testpublic void 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 basis-URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer nettleservinduetdriver.manage (). vindu (). maksimere ();// få den faktiske verdien av tittelenaTitle = driver.getTitle ();// sammenligne den faktiske tittelen med den forventede tittelenhvis (aTitle.contentEquals (eTitle)){System.out.println ("Test bestått");}annet {System.out.println ("Test mislyktes");}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 ();}}
Forklaring av kode
Vurder følgende kode:
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 ();
I dette WebDriver-venteeksemplet, vent til den tiden som er definert i klassen " WebDriverWait " eller " ExpectedConditions ", avhengig av hva som skjer først.
Ovennevnte Java-kode sier at vi venter på et element i tidsrammen på 20 sekunder som definert i " WebDriverWait " -klassen på websiden til " ExpectedConditions " er oppfylt og vilkåret er " visibilityofElementLocated ".
Følgende er de forventede forholdene som kan brukes i Selen Explicit Wait
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- presenceOfAllElementsLocatedBy ()
- tilstedeværelseOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- visibilityOfElementLocated ()
Flytende vent i selen
Den Flytende Vent i selen brukes til å definere maksimal tid for web driver å vente på en tilstand, samt hvor ofte vi ønsker å sjekke tilstanden før du kaster en "ElementNotVisibleException" unntak. Den sjekker for webelementet med jevne mellomrom til objektet blir funnet eller tidsavbrudd skjer.
Frekvens: Sette opp en repetisjonssyklus med tidsrammen for å verifisere / kontrollere tilstanden med jevne mellomrom
La oss vurdere et scenario der et element er lastet med forskjellige tidsintervaller. Elementet kan lastes innen 10 sekunder, 20 sekunder eller enda mer enn hvis vi erklærer en eksplisitt ventetid på 20 sekunder. Det vil vente til den angitte tiden før du kaster et unntak. I slike scenarier er flytende ventetid den ideelle ventetiden til å bruke, da dette vil prøve å finne elementet med forskjellig frekvens til det finner det eller den endelige tidtakeren går tom.
Syntaks:
Vent vent = ny FluentWait (referanse til WebDriver).withTimeout (timeout, SECONDS).pollingEvery (timeout, SECONDS).ignoring (Unntak.klasse);
Ovenstående kode avvikles i Selenium v3.11 og nyere. Du må bruke
Vent vent = ny FluentWait (referanse til WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Unntak.klasse);
pakke guru.test99;importer org.testng.annotations.Test;importere java.util.NoSuchElementException;importere java.util.concurrent.TimeUnit;importere java.util.function.Function;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.WebElement;importer org.openqa.selenium.chrome.ChromeDriver;importer org.openqa.selenium.support.ui.ExpectedConditions;importer org.openqa.selenium.support.ui.FluentWait;importer org.openqa.selenium.support.ui.Wait;importer org.openqa.selenium.support.ui.WebDriverWait;importer org.testng.annotations.Test;offentlig klasse AppTest3 {beskyttet WebDriver-driver;@Testpublic void 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 basis-URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Maksimerer nettleservinduetdriver.manage (). vindu (). maksimere ();// få den faktiske verdien av tittelenaTitle = driver.getTitle ();// sammenligne den faktiske tittelen med den forventede tittelenhvis (aTitle.contentEquals (eTitle)){System.out.println ("Test bestått");}annet {System.out.println ("Test mislyktes");}Ventvent = ny FluentWait (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement klikker påeleniumlink = wait.until (ny funksjon () {offentlig WebElement gjelder (WebDriver-driver) {return driver.findElement (By.xpath ("/ html / body / div [1] / seksjon / 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 "));}});// klikk på selen-lenkenclickseleniumlink.click ();// lukk ~ nettleserdriver.close ();}}
Forklaring av kode
Vurder følgende kode:
Ventvent = ny FluentWait (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);
I eksemplet ovenfor erklærer vi en flytende ventetid med tidsavbrudd på 30 sekunder, og frekvensen er satt til 5 sekunder ved å ignorere " NoSuchElementException "
Vurder følgende kode:
offentlig WebElement gjelder (WebDriver-driver) {return driver.findElement (By.xpath ("/ html / body / div [1] / seksjon / 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 opprettet en ny funksjon for å identifisere webelementet på siden. (Eks: Her er Web Element ikke annet enn Selenium-lenken på websiden).
Frekvensen er satt til 5 sekunder og den maksimale tiden er satt til 30 sekunder. Dermed betyr dette at den vil se etter elementet på websiden hvert 5. sekund i den maksimale tiden på 30 sekunder. Hvis elementet ligger innenfor denne tidsrammen, vil det utføre operasjonene ellers vil det kaste et " ElementNotVisibleException "
Forskjellen mellom Implisitt Vent Vs Eksplisitt Vent
Implisitt Vent | Eksplisitt Vent |
---|---|
|
|
|
|
|
|
Konklusjon:
Implisitt, eksplisitt og flytende ventetid er de forskjellige ventene som brukes i selen. Bruk av disse ventingene er helt basert på elementene som er lastet med forskjellige tidsintervaller. Det anbefales alltid ikke å bruke Thread.Sleep () mens vi tester applikasjonen vår eller bygger rammeverket vårt.
Denne artikkelen er bidratt av Chaitanya Pujari