Selenium Odota – implisiittinen ja eksplisiittinen syntaksilla
In Selenium, "Odotukset" ovat tärkeässä roolissa testien suorittamisessa. Tässä opetusohjelmassa opit erilaisia näkökohtia ja eroja implisiittisen ja eksplisiittisen odotusajan välillä Selenium.
Miksi tarvitsemme odotuksia Selenium?
Suurin osa verkkosovelluksista on kehitetty käyttämällä Ajax ja Javascript. Kun selain lataa sivun, elementit, joiden kanssa haluamme olla vuorovaikutuksessa, voivat latautua eri aikavälein.
Se ei ainoastaan vaikeuta elementin tunnistamista, vaan myös jos elementtiä ei löydy, se heittää "ElementNotVisibleException”poikkeus. Käyttämällä Selenium Odota, voimme ratkaista tämän ongelman.
Tarkastellaan skenaariota, jossa meidän on käytettävä sekä implisiittisiä että eksplisiittisiä odotuksia testissämme. Oletetaan, että implisiittinen odotusaika on asetettu 20 sekuntiin ja eksplisiittinen odotusaika on asetettu 10 sekuntiin.
Oletetaan, että yritämme löytää elementin, jolla on jonkin verran "Odotetut olosuhteet "(Explicit Wait), jos elementti ei sijaitse nimenomaisen odotusajan (10 sekuntia) määrittämässä aikakehyksessä, se käyttää implisiittisen odotuksen (20 sekuntia) määrittelemää aikakehystä ennen kuin heittää "ElementNotVisibleException".
Selenium Web-ajuri odottaa
- Epäsuora odota
- Selkeä odota
Tässä opetusohjelmassa opit erilaisista odotustyypeistä Selenium:
Implisiittinen Odota sisään Selenium
- Implisiittinen Odota sisään Selenium käytetään käskemään web-ajuria odottamaan tietty aika, ennen kuin se lähettää "Ei tällaista poikkeusta". Oletusasetus on 0. Kun aika on asetettu, web-ajuri odottaa elementtiä sen ajan ennen poikkeuksen tekemistä.
Selenium Web Driver on lainannut ajatuksen implisiittisistä odotuksista Watir.
Alla olevassa esimerkissä olemme ilmoittaneet implisiittisen odotuksen, jonka aikakehys on 10 sekuntia. Se tarkoittaa, että jos elementti ei sijaitse verkkosivulla tuon ajan kuluessa, se tekee poikkeuksen.
Ilmoittaa implisiittistä odotusta Selenium WebDriver:
Implisiittinen odotussyntaksi:
driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package guru.test99; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; public class AppTest { protected WebDriver driver; @Test public void guru99tutorials() throws InterruptedException { System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" ); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ; String eTitle = "Demo Guru99 Page"; String aTitle = "" ; // launch Chrome and redirect it to the Base URL driver.get("http://demo.guru99.com/test/guru99home/" ); //Maximizes the browser window driver.manage().window().maximize() ; //get the actual value of the title aTitle = driver.getTitle(); //compare the actual title with the expected title if (aTitle.equals(eTitle)) { System.out.println( "Test Passed") ; } else { System.out.println( "Test Failed" ); } //close browser driver.close(); } }
Koodin selitys
Yllä olevassa esimerkissä
Harkitse seuraavaa koodia:
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
Implisittinen odotus hyväksyy 2 parametria, ensimmäinen parametri hyväksyy ajan kokonaislukuarvona ja toinen parametri hyväksyy aikamittauksen SEKUNTEISSA, MINUUTEISSA, MILISEKUNNISSA, MIKROSEKUNNISSA, NANOSEKUNNISSA, PÄIVEISSÄ, TUNNISSA jne.
Selkeä Odota sisään Selenium
- Selkeä Odota sisään Selenium käytetään käskemään Web-ajuria odottamaan tiettyjä ehtoja (odotettuja ehtoja) tai enimmäisajan ylittymistä ennen kuin ElementNotVisibleException-poikkeus heitetään. Se on älykäs odotus, mutta sitä voidaan soveltaa vain tiettyihin elementteihin. Se tarjoaa parempia vaihtoehtoja kuin implisiittinen odotus, kun se odottaa dynaamisesti ladattuja Ajax-elementtejä.
Kun julistamme nimenomaisen odotuksen, meidän on käytettävä "Odotetut olosuhteet" tai voimme määrittää, kuinka usein haluamme tarkistaa kunnon käyttämällä Sujuva odotus. Näinä päivinä toteutuksen aikana käytämme Thread.Sleep() sen käyttöä ei yleensä suositella
Alla olevassa esimerkissä luomme viite-odotuksen "WebDriverOdota" luokka ja instantointi käyttämällä "web-ajuri”-viittaus, ja annamme enimmäisaikakehyksen 20 sekuntia.
Eksplisiittinen odotussyntaksi:
WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package guru.test99; import java.util.concurrent.TimeUnit; import 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; public class AppTest2 { protected WebDriver driver; @Test public void guru99tutorials() throws InterruptedException { System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" ); driver = new ChromeDriver(); WebDriverWait wait=new WebDriverWait(driver, 20); String eTitle = "Demo Guru99 Page"; String aTitle = "" ; // launch Chrome and redirect it to the Base URL driver.get("http://demo.guru99.com/test/guru99home/" ); //Maximizes the browser window driver.manage().window().maximize() ; //get the actual value of the title aTitle = driver.getTitle(); //compare the actual title with the expected title if (aTitle.contentEquals(eTitle)) { System.out.println( "Test Passed") ; } else { System.out.println( "Test Failed" ); } 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(); } }
Koodin selitys
Harkitse seuraavaa koodia:
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();
Odota tässä WebDriver-odotusesimerkissä kohdassa "WebDriverOdota”luokka tai ”Odotetut olosuhteet" tapahtuu sen mukaan, kumpi tapahtuu ensin.
Ylempi Java koodi ilmoittaa, että odotamme elementtiä 20 sekunnin aikakehykselle kohdassa "WebDriverOdota” luokka verkkosivulla, kunnes ”Odotetut olosuhteet" täyttyvät ja ehto on "ElementLocatedin näkyvyys".
Seuraavat ovat odotettavissa olevat olosuhteet, joissa voidaan käyttää Selenium Selkeä odota
- alertIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- frameToOllaKäytettävissäJaSwitchToIt()
- InvisibilityOfThe ElementLocated()
- invisibilityOf ElementWithText()
- läsnäoloAllElementsLocatedBy()
- läsnäoloOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- titleIs()
- titleContains()
- näkyvyys()
- VisibilityOfAll Elements()
- VisibilityOfAll ElementsLocatedBy()
- visibilityOfElementLocated()
Sujuva Odota Selenium
- Sujuva Odota Selenium käytetään määrittämään enimmäisaika, jonka verkkoajuri odottaa ehtoa, sekä kuinka usein haluamme tarkistaa ehdon ennen "ElementNotVisibleException" -poikkeuksen antamista. Se tarkistaa verkkoelementin säännöllisin väliajoin, kunnes objekti löytyy tai aikakatkaisu tapahtuu.
Taajuus: Toistojakson asettaminen aikakehyksellä kunnon tarkistamiseksi/tarkistamiseksi säännöllisin väliajoin
Tarkastellaan skenaariota, jossa elementti ladataan eri aikavälein. Elementti voi latautua 10 sekunnissa, 20 sekunnissa tai jopa enemmän kuin jos ilmoitamme nimenomaisen 20 sekunnin odotuksen. Se odottaa määritettyyn aikaan ennen poikkeuksen tekemistä. Tällaisissa skenaarioissa sujuva odotus on ihanteellinen odotus, koska se yrittää löytää elementin eri taajuudella, kunnes se löytää sen tai lopullinen ajastin loppuu.
Sujuva odotussyntaksi:
Wait wait = new FluentWait(WebDriver reference) .withTimeout(timeout, SECONDS) .pollingEvery(timeout, SECONDS) .ignoring(Exception.class);
Yllä oleva koodi on poistettu käytöstä Selenium v3.11 ja uudemmat. Sinun täytyy käyttää
Wait wait = new FluentWait(WebDriver reference) .withTimeout(Duration.ofSeconds(SECONDS)) .pollingEvery(Duration.ofSeconds(SECONDS)) .ignoring(Exception.class);
package guru.test99; import org.testng.annotations.Test; import java.util.NoSuchElementException; import java.util.concurrent.TimeUnit; import java.util.function.Function; import 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; public class AppTest3 { protected WebDriver driver; @Test public void guru99tutorials() throws InterruptedException { System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" ); String eTitle = "Demo Guru99 Page"; String aTitle = "" ; driver = new ChromeDriver(); // launch Chrome and redirect it to the Base URL driver.get("http://demo.guru99.com/test/guru99home/" ); //Maximizes the browser window driver.manage().window().maximize() ; //get the actual value of the title aTitle = driver.getTitle(); //compare the actual title with the expected title if (aTitle.contentEquals(eTitle)) { System.out.println( "Test Passed") ; } else { System.out.println( "Test Failed" ); } Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){ public WebElement apply(WebDriver driver ) { 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")); } }); //click on the selenium link clickseleniumlink.click(); //close~ browser driver.close() ; } }
Koodin selitys
Harkitse seuraavaa koodia:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class);
Yllä olevassa esimerkissä julistamme sujuvan odotuksen 30 sekunnin aikakatkaisulla ja taajuudeksi asetetaan 5 sekuntia jättämällä huomioimatta "NoSuchElementException"
Harkitse seuraavaa koodia:
public WebElement apply(WebDriver driver) { 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 sivun Web-elementin tunnistamiseen. (Esi.: Tässä Web Element ei ole muuta kuin Selenium linkki verkkosivulla).
Taajuus on asetettu 5 sekuntiin ja enimmäisaika on 30 sekuntia. Tämä tarkoittaa siis, että se tarkistaa elementin verkkosivulta 5 sekunnin välein enintään 30 sekunnin ajan. Jos elementti sijaitsee tässä aikakehyksessä, se suorittaa toiminnot muuten se heittää "ElementNotVisibleException"
Tarkista myös: - Selenium IDE-opastus aloittelijoille
Ero implisiittisen odotuksen ja eksplisiittisen odotuksen välillä
Seuraavassa on tärkein ero implisiittisen odotuksen ja eksplisiittisen odotuksen välillä Selenium:
Epäsuora odota | Selkeä odota |
---|---|
Implisiittistä odotusaikaa sovelletaan kaikkiin skriptin elementteihin | Eksplisiittistä odotusaikaa sovelletaan vain niihin elementteihin, jotka olemme tarkoittaneet |
Implicit Waitissa tarvitsemme emme määritä "Odotetut olosuhteet" sijoitettavalle elementille | Explicit Wait -kohdassa meidän on määritettävä "Odotetut olosuhteet" etsittävälle elementille |
On suositeltavaa käyttää, kun elementit sijaitsevat kohdassa määritetyllä aikakehyksellä Selenium epäsuora odotus | Sitä suositellaan käytettäväksi, kun elementtien lataaminen kestää kauan, ja myös elementin ominaisuuden tarkistamiseen, kuten (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected) |
Yhteenveto
Implisiittinen, Eksplicit ja Fluent Wait ovat erilaisia odotuksia, joita käytetään Selenium. Näiden odotusten käyttö perustuu täysin eri aikavälein ladattaviin elementteihin. Ei ole aina suositeltavaa käyttää Thread.Sleep():tä while Testaus sovelluksemme tai puitteemme rakentaminen.
Tarkista myös: - Selenium Opetusohjelma aloittelijoille: Opi WebDriver 7 päivässä