I Selen spelar "Waits" en viktig roll för att genomföra tester. I den här handledningen lär du dig olika aspekter av både "Implicit" och "Explicit" väntan i Selen.
I den här handledningen lär du dig:
- Varför behöver vi väntetider i selen?
- Implicit Vänta
- Explicit Wait
- Flytande vänta
Varför behöver vi väntetider i selen?
De flesta webbapplikationer är utvecklade med Ajax och Javascript. När en sida laddas av webbläsaren kan elementen som vi vill interagera med laddas med olika tidsintervall.
Inte bara gör det svårt att identifiera elementet utan också om elementet inte finns kommer det att kasta ett " ElementNotVisibleException " undantag. Med hjälp av Selen Waits kan vi lösa detta problem.
Låt oss överväga ett scenario där vi måste använda både implicita och uttryckliga väntan i vårt test. Antag att den implicita väntetiden är inställd på 20 sekunder och den uttryckliga väntetiden är inställd på 10 sekunder.
Antag att vi försöker hitta ett element som har vissa "ExpectedConditions " (Explicit Wait). Om elementet inte ligger inom den tidsram som definieras av Explicit wait (10 sekunder), kommer den att använda den tidsram som definieras av implicit wait ( 20 sekunder) innan du kastar ett " ElementNotVisibleException ".
Selen Web Driver väntar
- Implicit Vänta
- Explicit Wait
Implicit Vänta i Selen
Den Implicit Vänta i selen används för att tala om för webben föraren att vänta på en viss tid innan den kastar en "inget sådant Element Exception". Standardinställningen är 0. När vi har ställt in tiden väntar webbdrivrutinen på elementet för den tiden innan ett undantag kastas.
Selen Web Driver har lånat idén om implicit väntan från Watir.
I exemplet nedan har vi förklarat en implicit väntan med tidsramen på 10 sekunder. Det betyder att om elementet inte finns på webbsidan inom den tidsramen, kommer det att ge ett undantag.
För att förklara implicit väntan:
Syntax :
driver.manage (). timeouts (). implicitWait (TimeOut, TimeUnit.SECONDS);
paketet guru.test99;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.chrome.ChromeDriver;importera org.testng.annotations.Test;offentlig klass AppTest {skyddad WebDriver-drivrutin;@Testapublic void guru99tutorials () kastar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");drivrutin = ny ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);Sträng eTitle = "Demo Guru99-sida";String aTitle = "";// starta Chrome och omdirigera den till basadressendriver.get ("http://demo.guru99.com/test/guru99home/");// Maximerar webbläsarfönstretdriver.manage (). fönster (). maximera ();// få titelns faktiska värdeaTitle = driver.getTitle ();// jämför den faktiska titeln med den förväntade titelnif (aTitle.equals (eTitle)){System.out.println ("Test godkänt");}annat {System.out.println ("Test misslyckades");}// stäng webbläsarendriver.close ();}}
Förklaring av kod
I exemplet ovan,
Överväg följande kod:
driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);
Implicit väntan accepterar två parametrar, den första parametern accepterar tiden som ett heltal och den andra parametern accepterar tidsmätningen i termer av SEKONDER, MINUTER, MILISEKOND, MIKROSEKONDER, NANOSEKONDER, DAGAR, TIMMAR etc.
Explicit Wait in Selenium
Det explicita väntetiden i selen används för att berätta för webbdrivrutinen att vänta på vissa förhållanden (förväntade förhållanden) eller den maximala tiden som överskridits innan man kastar undantaget "ElementNotVisibleException". Det är en intelligent typ av väntan, men den kan endast användas för specifika element. Det ger bättre alternativ än implicit väntan eftersom det väntar på dynamiskt laddade Ajax-element.
När vi förklarar uttrycklig väntan måste vi använda " ExpectedConditions " eller så kan vi konfigurera hur ofta vi vill kontrollera tillståndet med hjälp av Fluent Wait . Dessa dagar under implementeringen använder vi Thread.Sleep () rekommenderas i allmänhet inte att använda
I exemplet nedan skapar vi referensväntan på " WebDriverWait " -klassen och startar med " WebDriver " -referensen , och vi ger en maximal tidsram på 20 sekunder.
Syntax:
WebDriverWait vänta = ny WebDriverWait (WebDriverRefrence, TimeOut);
paketet guru.test99;importera java.util.concurrent.TimeUnit;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.chrome.ChromeDriver;importera org.openqa.selenium.support.ui.ExpectedConditions;importera org.openqa.selenium.support.ui.WebDriverWait;importera org.testng.annotations.Test;offentlig klass AppTest2 {skyddad WebDriver-drivrutin;@Testapublic void guru99tutorials () kastar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");drivrutin = ny ChromeDriver ();WebDriverWait vänta = ny WebDriverWait (drivrutin, 20);Sträng eTitle = "Demo Guru99-sida";String aTitle = "";// starta Chrome och omdirigera den till basadressendriver.get ("http://demo.guru99.com/test/guru99home/");// Maximerar webbläsarfönstretdriver.manage (). fönster (). maximera ();// få titelns faktiska värdeaTitle = driver.getTitle ();// jämför den faktiska titeln med den förväntade titelnif (aTitle.contentEquals (eTitle)){System.out.println ("Test godkänt");}annat {System.out.println ("Test misslyckades");}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 ();}}
Förklaring av kod
Överväg följande kod:
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 detta exempel på WebDriver-väntan, vänta tills den tid som definierats i klassen " WebDriverWait " eller " ExpectedConditions " inträffar beroende på vad som inträffar först.
Ovanstående Java-kod anger att vi väntar på ett element för tidsramen på 20 sekunder som definierats i klassen " WebDriverWait " på webbsidan tills " ExpectedConditions " är uppfyllda och villkoret är " visibilityofElementLocated ".
Följande är de förväntade förhållandena som kan användas i Selen Explicit Wait
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- närvaroOfAllElementsLocatedBy ()
- närvaroOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- visibilityOfElementLocated ()
Flytande vänta i selen
Den Flytande Vänta i selen används för att definiera maximal tid för webb föraren att vänta på ett tillstånd, samt hur ofta vi vill kontrollera tillståndet innan kasta en "ElementNotVisibleException" undantag. Den söker efter webbelementet med jämna mellanrum tills objektet hittas eller timeout inträffar.
Frekvens: Ställa in en upprepningscykel med tidsramen för att verifiera / kontrollera tillståndet med det vanliga tidsintervallet
Låt oss överväga ett scenario där ett element laddas med olika tidsintervall. Elementet kan laddas inom 10 sekunder, 20 sekunder eller ännu mer än om vi förklarar en uttrycklig väntan på 20 sekunder. Det väntar tills den angivna tiden innan ett undantag kastas. I sådana scenarier är den flytande väntan den perfekta väntan att använda eftersom detta försöker hitta elementet med olika frekvens tills det hittar det eller den slutliga timern tar slut.
Syntax:
Vänta vänta = ny FluentWait (referens WebDriver).withTimeout (timeout, SECONDS).pollingEvery (timeout, SECONDS).ignoring (Exception.class);
Ovanstående kod är utfasad i Selenium v3.11 och senare. Du måste använda
Vänta vänta = ny FluentWait (referens WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Exception.class);
paketet guru.test99;importera org.testng.annotations.Test;importera java.util.NoSuchElementException;importera java.util.concurrent.TimeUnit;importera java.util.function.Function;importera org.openqa.selenium.By;importera org.openqa.selenium.WebDriver;importera org.openqa.selenium.WebElement;importera org.openqa.selenium.chrome.ChromeDriver;importera org.openqa.selenium.support.ui.ExpectedConditions;importera org.openqa.selenium.support.ui.FluentWait;importera org.openqa.selenium.support.ui.Wait;importera org.openqa.selenium.support.ui.WebDriverWait;importera org.testng.annotations.Test;offentlig klass AppTest3 {skyddad WebDriver-drivrutin;@Testapublic void guru99tutorials () kastar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");Sträng eTitle = "Demo Guru99-sida";String aTitle = "";drivrutin = ny ChromeDriver ();// starta Chrome och omdirigera den till basadressendriver.get ("http://demo.guru99.com/test/guru99home/");// Maximerar webbläsarfönstretdriver.manage (). fönster (). maximera ();// få titelns faktiska värdeaTitle = driver.getTitle ();// jämför den faktiska titeln med den förväntade titelnif (aTitle.contentEquals (eTitle)){System.out.println ("Test godkänt");}annat {System.out.println ("Test misslyckades");}Väntavänta = ny FluentWait (drivrutin).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement klickar på länken = wait.until (ny funktion () {offentlig WebElement gäller (WebDriver-drivrutin) {returnera 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 "));}});// klicka på selen-länkenclickseleniumlink.click ();// stäng ~ webbläsaredriver.close ();}}
Förklaring av kod
Överväg följande kod:
Väntavänta = ny FluentWait (drivrutin).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);
I exemplet ovan förklarar vi en flytande väntan med timeout på 30 sekunder och frekvensen är inställd på 5 sekunder genom att ignorera " NoSuchElementException "
Överväg följande kod:
offentlig WebElement gäller (WebDriver-drivrutin) {returnera 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 skapat en ny funktion för att identifiera webbelementet på sidan. (Ex: Här är Web Element bara Selenium-länken på webbsidan).
Frekvensen är inställd på 5 sekunder och den maximala tiden är 30 sekunder. Detta innebär alltså att det kommer att söka efter elementet på webbsidan var 5: e sekund under maximal tid på 30 sekunder. Om elementet ligger inom denna tidsram kommer det att utföra operationerna annars kommer det att kasta ett " ElementNotVisibleException "
Skillnad mellan Implicit Wait Vs Explicit Wait
Implicit Vänta | Explicit Wait |
---|---|
|
|
|
|
|
|
Slutsats:
Implicit, Explicit och Fluent Wait är de olika väntetiderna som används i Selen. Användningen av dessa väntetider är helt baserad på elementen som laddas med olika tidsintervall. Det rekommenderas alltid inte att använda Thread.Sleep () när vi testar vår applikation eller bygger vårt ramverk.
Denna artikel har bidragit av Chaitanya Pujari