Epäsuora, eksplisiittinen ja & Sujuva odotus Selenium WebDriver -sovelluksessa

Sisällysluettelo:

Anonim

Seleenissä "Waits" on tärkeä rooli testien suorittamisessa. Tässä opetusohjelmassa opit erilaisia ​​"implisiittisten" ja "eksplisiittisten" odotusten seleeniä.

Tässä opetusohjelmassa opit:

  • Miksi tarvitsemme odotuksia seleenissä?
  • Epäsuora odota
  • Selkeä odota
  • Sujuva odotus

Miksi tarvitsemme odotuksia seleenissä?

Suurin osa verkkosovelluksista on kehitetty Ajaxin ja Javascriptin avulla. Kun selain lataa sivun, elementit, joihin haluamme olla vuorovaikutuksessa, voivat latautua eri aikaväleillä.

Sen lisäksi, että elementin tunnistaminen on vaikeaa, se aiheuttaa myös ElementNotVisibleException- poikkeuksen, jos elementtiä ei löydy . Selenium Waitsia käyttämällä voimme ratkaista tämän ongelman.

Tarkastellaan skenaariota, jossa meidän on käytettävä sekä implisiittisiä että eksplisiittisiä odotuksia testissämme. Oletetaan, että implisiittiseksi odotusaikaksi on asetettu 20 sekuntia ja eksplisiittiseksi odotusaikaksi 10 sekuntia.

Oletetaan, että yritämme löytää elementin, jolla on joitain "ExpectedConditions " (eksplisiittinen odotus) .Jos elementti ei sijaitse eksplisiittisen odotuksen määrittelemässä ajassa (10 sekuntia), se käyttää implisiittisen odotuksen määrittelemää aikakehystä ( 20 sekuntia) ennen kuin heität " ElementNotVisibleException ".

Seleeni-web-ohjain odottaa

  1. Epäsuora odota
  2. Selkeä odota

Epäsuora odotus seleenissä

Epäsuorasti Odota seleeniä käytetään kertomaan web kuljettaja odottaa tietyn ajan, ennen kuin heittää "No Such Element Poikkeus". Oletusasetus on 0. Kun aika on asetettu, verkkoajuri odottaa elementtiä tuolloin ennen kuin heittää poikkeuksen.

Seleeni-Web-ohjain on lainannut implisiittisten odotusten ajatuksen Watirilta.

Alla olevassa esimerkissä olemme ilmoittaneet epäsuoran odottamisen, jonka aikaväli on 10 sekuntia. Se tarkoittaa, että jos elementti ei ole verkkosivulla kyseisen ajanjakson aikana, se aiheuttaa poikkeuksen.

Epäsuoran odottamisen julistaminen:

Syntaksi :

kuljettaja.hallitse (). aikakatkaisut (). implisiittisesti Odota (TimeOut, TimeUnit.SECONDS); 
paketti guru.test99;tuo java.util.concurrent.TimeUnit;tuo org.openqa.selenium.By;tuo org.openqa.selenium.WebDriver;tuo org.openqa.selenium.chrome.ChromeDriver;tuo org.testng.annotations.Test;julkisen luokan AppTest {suojattu WebDriver-ohjain;@Testatapublic void guru99tutorials () heittää keskeytetyn poikkeuksen{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");ohjain = uusi ChromeDriver ();driver.manage (). timeout (). implisiittisesti Odota (10, TimeUnit.SECONDS);String eTitle = "Esittelyguru99-sivu";Merkkijono aTitle = "";// käynnistää Chrome ja ohjaa sen perus-URL-osoitteeseendriver.get ("http://demo.guru99.com/test/guru99home/");// Suurentaa selainikkunanohjain.hallinta (). ikkuna (). maksimoi ();// hanki otsikon todellinen arvoaTitle = ohjain.getTitle ();// vertaa todellista otsikkoa odotettuun otsikkoonif (aTitle.equals (eTitle)){System.out.println ("Testi hyväksytty");}muu {System.out.println ("Testi epäonnistui");}// sulje selainkuljettaja.sulje ();}}

Koodin selitys

Yllä olevassa esimerkissä

Harkitse seuraavaa koodia:

driver.manage (). timeout (). implisiittisesti Odota (10, TimeUnit.SECONDS);

Epäsuora odotus hyväksyy kaksi parametria, ensimmäinen parametri hyväksyy ajan kokonaislukuna ja toinen parametri hyväksyy ajanmittauksen sekunneina, minuutteina, milisekunteina, mikrosekunteina, nanosekunteina, päivinä, tunteina jne.

Selkeä odotus seleenissä

Nimenomaista Odota seleeniä käytetään kertomaan Web Ajuri odottamaan tietyin edellytyksin (ennakoitavissa) tai maksimiaika ylittyy ennen heitto "ElementNotVisibleException" poikkeus. Se on älykäs odotus, mutta sitä voidaan soveltaa vain tiettyihin elementteihin. Se antaa parempia vaihtoehtoja kuin epäsuora odotus odottaessaan dynaamisesti ladattuja Ajax-elementtejä.

Kun ilmoitamme nimenomaisesta odotuksesta, meidän on käytettävä " ExpectedConditions " -vaihtoehtoa tai voimme määrittää, kuinka usein haluamme tarkistaa ehdon Fluent Wait -toiminnon avulla . Nykyään ja panna käytämme Thread.sleep () yleensä se ei ole suositeltavaa käyttää

Seuraavassa esimerkissä luodaan viittaus odotus " WebDriverWait " -luokalle ja instantiointi " WebDriver " -viitteellä , ja annamme enintään 20 sekunnin ajanjakson.

Syntaksi:

WebDriverWait wait = uusi WebDriverWait (WebDriverRefrence, TimeOut);
paketti guru.test99;tuo java.util.concurrent.TimeUnit;tuo org.openqa.selenium.By;tuo org.openqa.selenium.WebDriver;tuonti org.openqa.selenium.WebElement;tuo org.openqa.selenium.chrome.ChromeDriver;tuo org.openqa.selenium.support.ui.ExpectedConditions;tuo org.openqa.selenium.support.ui.WebDriverWait;tuo org.testng.annotations.Test;julkisen luokan AppTest2 {suojattu WebDriver-ohjain;@Testatapublic void guru99tutorials () heittää keskeytetyn poikkeuksen{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");ohjain = uusi ChromeDriver ();WebDriverWait wait = uusi WebDriverWait (ohjain, 20);String eTitle = "Esittelyguru99-sivu";Merkkijono aTitle = "";// käynnistää Chrome ja ohjaa sen perus-URL-osoitteeseendriver.get ("http://demo.guru99.com/test/guru99home/");// Suurentaa selainikkunanohjain.hallinta (). ikkuna (). maksimoi ();// hanki otsikon todellinen arvoaTitle = ohjain.getTitle ();// vertaa todellista otsikkoa odotettuun otsikkoonif (aTitle.contentEquals (eTitle)){System.out.println ("Testi hyväksytty");}muu {System.out.println ("Testi epäonnistui");}WebElement guru99seleniumlink;guru99seleniumlink = odota. asti (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 ();}}

Koodin selitys

Harkitse seuraavaa koodia:

WebElement guru99seleniumlink;guru99seleniumlink = odota. asti (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 ();

Odota tässä WebDriver-odotusesimerkissä, että " WebDriverWait " -luokassa tai " ExpectedConditions " määritelty aika tapahtuu sen mukaan, kumpi tapahtuu ensin.

Yllä olevassa Java-koodissa todetaan, että odotamme 20 sekunnin ajanjaksoa, joka on määritelty verkkosivun " WebDriverWait " -luokassa, kunnes " ExpectedConditions " täyttyvät ja ehto on " visibilityofElementLocated ".

Seuraavat ovat odotetut olosuhteet, joita voidaan käyttää Selenium Explicit Wait -ohjelmassa

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

Sujuva odotus seleenissä

Sujuva Odota seleeniä käytetään määrittelemään mahdollisimman paljon aikaa internetissä kuljettaja odottaa kunnon sekä siitä, kuinka usein haluamme tarkistaa kunnon ennen heittämällä "ElementNotVisibleException" poikkeus. Se tarkistaa verkkoelementin säännöllisin väliajoin, kunnes objekti löytyy tai aikakatkaisu tapahtuu.

Taajuus: Asetetaan toistosykli ajanjaksolla kunnon tarkistamiseksi / tarkistamiseksi säännöllisin väliajoin

Tarkastellaan skenaariota, jossa elementti ladataan eri aikaväleillä. Elementti saattaa latautua 10 sekunnissa, 20 sekunnissa tai jopa enemmän, kuin jos ilmoitamme 20 sekunnin nimenomaisen odottamisen. Se odottaa määritettyä aikaa ennen kuin heittää poikkeuksen. Tällaisissa tilanteissa sujuva odotus on ihanteellinen odotusaika, koska se yrittää löytää elementin eri taajuudella, kunnes se löytää sen tai viimeinen ajastin loppuu.

Syntaksi:

Odota odota = uusi FluentWait (WebDriver-viite).withTimeout (aikakatkaisu, SECONDS).pollingEvery (aikakatkaisu, SECONDS).kirjoittaminen (Exception.class);

Yllä oleva koodi on vanhentunut Selenium v3.11: ssä ja uudemmissa. Sinun täytyy käyttää

Odota odota = uusi FluentWait (WebDriver-viite).withTimeout (sekuntien kesto (SECONDS)).pollingEvery (sekuntien kesto (SECONDS)).kirjoittaminen (Exception.class);
paketti guru.test99;tuo org.testng.annotations.Test;tuo java.util.NoSuchElementException;tuo java.util.concurrent.TimeUnit;tuo java.util.function.Function;tuo org.openqa.selenium.By;tuo org.openqa.selenium.WebDriver;tuonti org.openqa.selenium.WebElement;tuo org.openqa.selenium.chrome.ChromeDriver;tuo org.openqa.selenium.support.ui.ExpectedConditions;tuo org.openqa.selenium.support.ui.FluentWait;tuo org.openqa.selenium.support.ui.Odota;tuo org.openqa.selenium.support.ui.WebDriverWait;tuo org.testng.annotations.Test;julkisen luokan AppTest3 {suojattu WebDriver-ohjain;@Testatapublic void guru99tutorials () heittää keskeytetyn poikkeuksen{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Esittelyguru99-sivu";Merkkijono aTitle = "";ohjain = uusi ChromeDriver ();// käynnistää Chrome ja ohjaa sen perus-URL-osoitteeseendriver.get ("http://demo.guru99.com/test/guru99home/");// Suurentaa selainikkunanohjain.hallinta (). ikkuna (). maksimoi ();// hanki otsikon todellinen arvoaTitle = ohjain.getTitle ();// vertaa todellista otsikkoa odotettuun otsikkoonif (aTitle.contentEquals (eTitle)){System.out.println ("Testi hyväksytty");}muu {System.out.println ("Testi epäonnistui");}Odota  odota = uusi FluentWait  (ohjain).WithTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).kirjoittaminen (NoSuchElementException.class);WebElement clickeleniumlink = wait.until (uusi toiminto  () {julkinen WebElement-sovellus (WebDriver-ohjain) {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 "));}});// napsauta seleeni-linkkiäclickeleniumlink.click ();// sulje ~ selainkuljettaja.sulje ();}}

Koodin selitys

Harkitse seuraavaa koodia:

Odota  odota = uusi FluentWait  (ohjain).WithTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).kirjoittaminen (NoSuchElementException.class);

Yllä olevassa esimerkissä julistamme sujuvan odottamisen 30 sekunnin aikakatkaisulla ja taajuudeksi asetetaan 5 sekuntia ohittamatta " NoSuchElementException "

Harkitse seuraavaa koodia:

julkinen WebElement-sovellus (WebDriver-ohjain) {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 ")); 

Olemme luoneet uuden toiminnon Web-elementin tunnistamiseksi sivulla. (Esim .: Tässä Web-elementti on vain Selenium-linkki verkkosivulla).

Taajuudeksi on asetettu 5 sekuntia ja enimmäisaikaksi 30 sekuntia. Siten tämä tarkoittaa, että se tarkistaa verkkosivun elementin 5 sekunnin välein enintään 30 sekunnin ajan. Jos elementti sijaitsee tässä ajassa, se suorittaa toiminnot, muuten se heittää " ElementNotVisibleException "

Ero implisiittisen odotuksen ja eksplisiittisen odotuksen välillä

Epäsuora odota Selkeä odota
  • Implisiittistä odotusaikaa käytetään kaikkiin komentosarjan elementteihin
  • Selkeä odotusaika koskee vain niitä osia, jotka olemme tarkoituksemme mukaan
  • Implicit Wait -ohjelmassa meidän ei tarvitse määrittää "ExpectedConditions" -kohtaa löydettävälle elementille
  • Explicit Wait -kohdassa meidän on määritettävä "ExpectedConditions" löydettävälle elementille
  • On suositeltavaa käyttää, kun elementit sijaitsevat seleenin implisiittisessä odottelussa määritetyssä aikataulussa
  • On suositeltavaa käyttää, kun elementtien lataaminen kestää kauan, ja myös elementin ominaisuuksien, kuten (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected), tarkistamiseen.

Päätelmä:

Epäsuora, eksplisiittinen ja sujuva odotus ovat seleenissä käytettyjä erilaisia ​​odotuksia. Näiden odotusten käyttö perustuu täysin elementteihin, jotka ladataan eri aikaväleillä. Aina ei ole suositeltavaa käyttää Thread.Sleep () -sovellusta testattaessa sovellustamme tai rakennettaessa kehystä.

Tämän artikkelin on kirjoittanut Chaitanya Pujari