Numanomas, aiškus ir & Sklandus laukimas „Selenium WebDriver“

Turinys:

Anonim

Selene „Laukimas“ vaidina svarbų vaidmenį atliekant bandymus. Šioje pamokoje sužinosite įvairius „implicitinio“ ir „aiškaus“ ​​laukimo Selene aspektus.

Šioje pamokoje sužinosite:

  • Kodėl mums reikia laukti seleno?
  • Numanomas laukimas
  • Aiškus laukimas
  • Sklandus laukimas

Kodėl mums reikia laukti seleno?

Dauguma žiniatinklio programų yra sukurtos naudojant „Ajax“ ir „Javascript“. Kai naršyklė įkelia puslapį, elementai, su kuriais norime sąveikauti, gali būti įkeliami skirtingais laiko intervalais.

Tai ne tik apsunkina elemento atpažinimą, bet ir tuo atveju, jei elementas nėra, jis sukels „ ElementNotVisibleException “ išimtį. Naudodami „Selenium Waits“, mes galime išspręsti šią problemą.

Apsvarstykime scenarijų, kai savo bandyme turime naudoti tiek numanomą, tiek aiškų laukimą. Tarkime, kad numanomas laukimo laikas yra nustatytas 20 sekundžių, o aiškus - 10 sekundžių.

Tarkime, kad mes bandome rasti elementą, kuriame yra tam tikros „ExpectedConditions “ (aiškus laukimas). Jei elementas nėra per aiškų laukimą apibrėžtą laiko tarpą (10 sekundžių), jis naudos numanomo laukimo apibrėžtą laiko tarpą ( 20 sekundžių) prieš metant „ ElementNotVisibleException “.

„Selen“ žiniatinklio tvarkyklė laukia

  1. Numanomas laukimas
  2. Aiškus laukimas

Numanomas laukimas selene

Numanomas laukti Selenas yra naudojamas pasakyti interneto vairuotojas laukti tam tikrą laiką, kol ji meta "ne tokį elementą išimties tvarka". Numatytasis nustatymas yra 0. Kai nustatysime laiką, žiniatinklio tvarkyklė lauks to laiko elemento, prieš išmesdama išimtį.

„Selen Web“ tvarkyklė pasiskolino numanomo laukimo idėją iš „Watir“.

Žemiau pateiktame pavyzdyje mes paskelbėme numanomą laukimą, kurio laikas yra 10 sekundžių. Tai reiškia, kad jei elementas nebus pateiktas tinklalapyje per tą laiką, jis sukels išimtį.

Paskelbti numanomą laukimą:

Sintaksė :

vairuotojas.tvarkyti (). skirtasis laikas (). implicitlyWait (TimeOut, TimeUnit.SECONDS); 
paketas guru.test99;importuoti java.util.concurrent.TimeUnit;importuoti org.openqa.selenium.By;importuoti org.openqa.selenium.WebDriver;importuoti org.openqa.selenium.chrome.ChromeDriver;importuoti org.testng.annotations.Test;viešosios klasės „AppTest“ {saugoma „WebDriver“ tvarkyklė;@Testpublic void guru99tutorials () meta InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");tvarkyklė = naujas „ChromeDriver“ ();vairuotojas.tvarkyti (). skirtasis laikas (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Demo Guru99 puslapis";String aTitle = "";// paleiskite „Chrome“ ir peradresuokite jį į pagrindinį URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Padidina naršyklės langąvairuotojas.tvarkyti (). langas (). padidinti ();// gauti tikrąją pavadinimo vertęaTitle = tvarkyklė.getTitle ();// palyginkite tikrąjį pavadinimą su laukiamu pavadinimujei (aTitle.equals (eTitle)){System.out.println („Išlaikytas testas“);}Kitas {System.out.println („Bandymas nepavyko“);}// uždaryti naršyklęvairuotojas.uždaryti ();}}

Kodo paaiškinimas

Ankstesniame pavyzdyje

Apsvarstykite šį kodą:

vairuotojas.tvarkyti (). skirtasis laikas (). implicitlyWait (10, TimeUnit.SECONDS);

Netiesioginis laukimas priims 2 parametrus, pirmasis parametras priims laiką kaip sveikojo skaičiaus vertę, o antrasis parametras priims laiko matavimą SEKUNDŲ, MINUTŲ, MIILISEKONDŲ, MIKROSEKUNDŲ, NANOSEKUNDŲ, DIENŲ, VALANDŲ ir kt.

Aiškus laukimas selene

Aiškus laukti Selenas yra naudojamas pasakyti interneto tvarkyklės laukti tam tikromis sąlygomis (numatomomis sąlygomis) arba didžiausią kartą viršijo prieš mesti "ElementNotVisibleException" išimtis. Tai protinga laukimo rūšis, tačiau ją galima pritaikyti tik nurodytiems elementams. Tai suteikia geresnes galimybes nei numanomas laukimas, kai laukia dinamiškai įkeltų „Ajax“ elementų.

Paskelbę aiškų laukimą, turime naudoti „ ExpectedConditions “ arba galime sukonfigūruoti, kaip dažnai norime patikrinti būklę naudodami „ Fluent Wait“ . Šiomis dienomis diegdami mes naudojame „ Thread.Sleep“ (), paprastai to naudoti nerekomenduojama

Toliau pateiktame pavyzdyje mes kuriame „ WebDriverWait “ klasės atskaitos laukimą ir greitiname naudodami „ WebDriver “ nuorodą, o maksimalus laiko tarpas yra 20 sekundžių.

Sintaksė:

„WebDriverWait wait“ = naujas „WebDriverWait“ („WebDriverRefrence“, „TimeOut“);
paketas guru.test99;importuoti java.util.concurrent.TimeUnit;importuoti org.openqa.selenium.By;importuoti org.openqa.selenium.WebDriver;importuoti org.openqa.selenium.WebElement;importuoti org.openqa.selenium.chrome.ChromeDriver;importuoti org.openqa.selenium.support.ui.ExpectedConditions;importuoti org.openqa.selenium.support.ui.WebDriverWait;importuoti org.testng.annotations.Test;viešosios klasės „AppTest2“ {saugoma „WebDriver“ tvarkyklė;@Testpublic void guru99tutorials () meta InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");tvarkyklė = naujas „ChromeDriver“ ();„WebDriverWait wait“ = naujas „WebDriverWait“ (tvarkyklė, 20);String eTitle = "Demo Guru99 puslapis";String aTitle = "";// paleiskite „Chrome“ ir peradresuokite jį į pagrindinį URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Padidina naršyklės langąvairuotojas.tvarkyti (). langas (). padidinti ();// gauti tikrąją pavadinimo vertęaTitle = tvarkyklė.getTitle ();// palyginkite tikrąjį pavadinimą su laukiamu pavadinimujei (aTitle.contentEquals (eTitle)){System.out.println („Išlaikytas testas“);}Kitas {System.out.println („Bandymas nepavyko“);}„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 ();}}

Kodo paaiškinimas

Apsvarstykite šį 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 ();

Šiame „WebDriver“ laukimo pavyzdyje palaukite, kol įvykstaWebDriverWait “ klasėje arba „ ExpectedConditions “ apibrėžtas laikas, atsižvelgiant į tai, kas įvyks anksčiau.

Aukščiau pateiktas „Java“ kodas nurodo, kad laukiame elemento 20 sekundžių laikotarpiui, kaip apibrėžta tinklalapio „ WebDriverWait “ klasėje, kol bus įvykdytos „ ExpectedConditions “ ir sąlyga bus „ visibilityofElementLocated “.

Toliau pateikiamos laukiamos sąlygos, kurias galima naudoti „Selenium Explicit Wait“

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

Sklandus laukimas selene

Fluent laukti Selenas yra naudojamas apibrėžti maksimalų laiką interneto vairuotojas laukti būklės, taip pat dažnio, su kuria mes norime patikrinti sąlygą prieš mėtymas "ElementNotVisibleException" išimtis. Jis reguliariai tikrina, ar nėra žiniatinklio elemento, kol objektas bus rastas arba pasibaigs skirtasis laikas.

Dažnis: nustatykite pakartotinį ciklą su laiko tarpu, kad reguliariai patikrintumėte / patikrintumėte būklę

Apsvarstykime scenarijų, kai elementas įkeliamas skirtingais laiko intervalais. Elementas gali būti įkeltas per 10 sekundžių, 20 sekundžių ar net daugiau nei tada, jei mes paskelbsime aiškų 20 sekundžių laukimą. Prieš išmesdamas išimtį, jis lauks nurodyto laiko. Tokiais atvejais sklandus laukimas yra idealiausias laukimo laikas, kai bandysite elementą rasti skirtingu dažniu, kol jis suras arba baigsis galutinis laikmatis.

Sintaksė:

Palaukite palaukite = nauja „FluentWait“ (nuoroda į „WebDriver“).withTimeout (skirtasis laikas, SECONDS).pollingEvery (skirtasis laikas, SECONDS).ignoring (Išimtis.klasė);

Aukščiau nurodytas kodas nebenaudojamas „Selenium v3.11“ ir naujesnėse versijose. Jums reikia naudoti

Palaukite palaukite = nauja „FluentWait“ (nuoroda į „WebDriver“).withTimeout (sekundžių trukmė (SECONDS)).pollingEvery (sekundžių trukmė (SECONDS)).ignoring (Išimtis.klasė);
paketas guru.test99;importuoti org.testng.annotations.Test;importuoti java.util.NoSuchElementException;importuoti java.util.concurrent.TimeUnit;importuoti java.util.function.Function;importuoti org.openqa.selenium.By;importuoti org.openqa.selenium.WebDriver;importuoti org.openqa.selenium.WebElement;importuoti org.openqa.selenium.chrome.ChromeDriver;importuoti org.openqa.selenium.support.ui.ExpectedConditions;importuoti org.openqa.selenium.support.ui.FluentWait;importuoti org.openqa.selenium.support.ui.Palaukite;importuoti org.openqa.selenium.support.ui.WebDriverWait;importuoti org.testng.annotations.Test;viešosios klasės „AppTest3“ {saugoma „WebDriver“ tvarkyklė;@Testpublic void guru99tutorials () meta InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Demo Guru99 puslapis";String aTitle = "";tvarkyklė = naujas „ChromeDriver“ ();// paleiskite „Chrome“ ir peradresuokite jį į pagrindinį URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Padidina naršyklės langąvairuotojas.tvarkyti (). langas (). padidinti ();// gauti tikrąją pavadinimo vertęaTitle = tvarkyklė.getTitle ();// palyginkite tikrąjį pavadinimą su laukiamu pavadinimujei (aTitle.contentEquals (eTitle)){System.out.println („Išlaikytas testas“);}Kitas {System.out.println („Bandymas nepavyko“);}Palaukite  palaukite = new FluentWait  (tvarkyklė).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);„WebElement“ clickeleniumlink = wait.until (nauja funkcija  () {taikyti viešą „WebElement“ („WebDriver“ tvarkyklė) {grąžinti tvarkyklę.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 "));}});// spustelėkite nuorodą selenasclickeleniumlink.click ();// uždaryti ~ naršyklęvairuotojas.uždaryti ();}}

Kodo paaiškinimas

Apsvarstykite šį kodą:

Palaukite  palaukite = new FluentWait  (tvarkyklė).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);

Ankstesniame pavyzdyje skelbiame sklandų laukimą, kurio skirtasis laikas yra 30 sekundžių, o dažnis nustatomas į 5 sekundes, ignoruojant „ NoSuchElementException

Apsvarstykite šį kodą:

taikyti viešą „WebElement“ („WebDriver“ tvarkyklė) {grąžinti tvarkyklę.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 ")); 

Sukūrėme naują funkciją žiniatinklio elementui identifikuoti puslapyje. (Pvz .: Čia žiniatinklio elementas yra ne kas kita, o „Selenium“ nuoroda tinklalapyje).

Dažnis nustatytas į 5 sekundes, o maksimalus laikas - 30 sekundžių. Taigi tai reiškia, kad jis kas 5 sekundes tikrins, ar nėra elemento tinklalapyje, maksimalų 30 sekundžių laiką. Jei elementas yra per šį laiko tarpą, jis atliks operacijas, kitaip jis užmesElementNotVisibleException

Skirtumas tarp numanomo laukimo, palyginti su aiškiu laukimu

Numanomas laukimas Aiškus laukimas
  • Numanomas laukimo laikas taikomas visiems scenarijaus elementams
  • Aiškus laukimo laikas taikomas tik tiems elementams, kuriuos mes numatėme
  • Netiesioginio laukimo atveju mes neturime nurodyti elemento „ExpectedConditions“
  • Skiltyje „Aiškus laukimas“ mes turime nurodyti elemente „ExpectedConditions“, kurį norite rasti
  • Rekomenduojama naudoti, kai elementai yra su laiko tarpu, nurodytu „Selenium implicit wait“
  • Rekomenduojama naudoti, kai elementai ilgai įkeliami, taip pat norint patikrinti tokio elemento savybes kaip (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Išvada:

Netiesioginis, aiškus ir laisvas laukimas yra skirtingi laukimai, naudojami Selene. Šių laukimų naudojimas visiškai pagrįstas elementais, kurie yra įkeliami skirtingais laiko intervalais. Visada nerekomenduojama naudoti „Thread.Sleep“ () bandant programą arba kuriant sistemą.

Prie šio straipsnio prisidėjo Chaitanya Pujari