Implisiittinen ja eksplisiittinen odotus Selenium syntaksin kanssa

โšก ร„lykรคs yhteenveto

Selenium Wait-komennot synkronoivat automaatioskriptit dynaamisen sivutoiminnan kanssa estรคen asynkronisesti latautuvien elementtien aiheuttamat testivirheet. Tรคmรค referenssi selittรครค implisiittisen, eksplisiittisen ja sujuvan odotusstrategian WebDriver-syntaksin avulla. Java koodiesimerkkejรค ja kรคytรคnnรถn ohjeita sopivan odotusajan valitsemiseen vakaan ja luotettavan testisuorituksen varmistamiseksi.

  • โš™๏ธ Foundational-periaate: Kรคytรค implisiittistรค odotusaikaa globaalisti, jotta WebDriver pysรคhtyy mรครคritetyksi ajaksi ennen NoSuchElementException-poikkeuksen aiheuttamista.
  • ๐ŸŽฏ Toteutuksen painopiste: Kรคytรค Explicit Wait -ominaisuutta ExpectedConditions-ominaisuuden kanssa kohdistaaksesi elementteihin, jotka ovat riippuvaisia โ€‹โ€‹Ajax- tai dynaamisista nรคkyvyystiloista.
  • ๐Ÿ” Edistynyt tekniikka: Mรครคritรค Fluent Wait kyselyvรคleillรค kรคsittelemรครคn elementtejรค, jotka latautuvat arvaamattomina aikoina.
  • โšก Optimointistrategia: Korvaa Thread.sleep ehdollisilla odotusajoilla lyhentรครคksesi suoritusaikaa ja poistaaksesi hauraat viiveet.
  • โœ… Laadun vaikutus: Oikean odotusajan valitseminen vรคhentรครค suoraan epรคtasaisia โ€‹โ€‹โ€‹โ€‹virheitรค ja parantaa komentosarjojen vakautta eri ympรคristรถissรค.

Selenium Odota โ€“ implisiittinen ja eksplisiittinen syntaksilla

In Selenium"Odotuksilla" on tรคrkeรค rooli luotettavien testien suorittamisessa. Tรคssรค opetusohjelmassa opit implisiittisten ja eksplisiittisten odotuskomentojen keskeiset nรคkรถkohdat ja erot. Seleniumsekรค kรคytรคnnรถn Fluent Wait -kรคyttรถรค.

Miksi tarvitsemme odotuksia Selenium?

Useimmat nykyaikaiset verkkosovellukset on kehitetty kรคyttรคmรคllรค Ajax ja JavaKรคsikirjoitusKun selain lataa sivun, elementit, joiden kanssa haluamme olla vuorovaikutuksessa, voivat latautua eri aikavรคlein.

Tรคmรค ei ainoastaan โ€‹โ€‹vaikeuta elementin tunnistamista, vaan jos elementtiรค ei paikanneta ajoissa, Selenium heittรครค ElementNotVisibleException. Selenium Odotusajat ratkaisevat tรคmรคn synkronointiongelman antamalla WebDriverille mรครคritellyn ikkunan, jossa elementti voidaan etsiรค ennen epรคonnistumista.

Tarkastellaan tilannetta, jossa samassa testissรค kรคytetรครคn sekรค implisiittisiรค ettรค eksplisiittisiรค odotusaikoja. Oletetaan, ettรค implisiittinen odotus on asetettu 20 sekuntiin ja eksplisiittinen odotus on asetettu 10 sekuntiin.

Jos etsimme elementtiรค, jota hallitsee tietty Odotetut olosuhteet (Eksplisiittinen odotus) ja elementti ei sijaitse eksplisiittisen 10 sekunnin ikkunan sisรคllรค, WebDriver palaa implisiittiseen 20 sekunnin ikkunaan ennen virheen heittรคmistรค. ElementNotVisibleException.

Selenium WebDriver-odotukset

  1. Epรคsuora odota
  2. Selkeรค odota
  3. Sujuva odotus

Implisiittinen Odota sisรครคn Selenium

Implisiittinen Odota sisรครคn Selenium Ohjaa WebDriveria odottamaan mรครคritetyn ajan ennen NoSuchElementException-poikkeuksen heittรคmistรค. Oletusarvo on 0. Kun mรครคritys on tehty, WebDriver kyselee DOM:ia kyseisen ajan ennen epรคonnistumista. Selenium WebDriver peri implisiittisten odotusaikojen kรคsitteen Watir.

Alla olevassa esimerkissรค mรครคrittelemme implisiittisen odotuksen, jonka kesto on 10 sekuntia. Jos elementti ei sijaitse kyseisessรค ikkunassa, syntyy poikkeus.

Implisiittinen odotussyntaksi (Selenium 4):

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
package guru.test99;
import java.time.Duration;
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 {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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();
    }
}

Selitys Code

Tarkastellaan yllรค olevassa esimerkissรค seuraavaa lausetta:

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

Selenium Versiossa 4 vanha kaksiargumenttinen allekirjoitus (kokonaisluku plus aikayksikkรถ) korvattiin yhdellรค Duration-argumentilla. Duration-luokka tukee sekunteja, minuutteja, millisekunteja ja muita aikayksikรถitรค staattisten apufunktioiden, kuten Duration.ofSeconds, Duration.ofMillis ja Duration.ofMinutes, avulla.

Selkeรค Odota sisรครคn Selenium

Selkeรค Odota sisรครคn Selenium Ohjaa WebDriveria odottamaan tiettyjรค ehtoja (odotetut ehdot) tai enimmรคiskeston ennen ElementNotVisibleException-poikkeuksen heittรคmistรค. Se on รคlykkรครคmpi odotustapa, koska se koskee vain mรครคritettyรค elementtiรค. Eksplisiittinen odotus on parempi kuin implisiittinen odotus aina, kun testin on kรคsiteltรคvรค dynaamisesti ladattua Ajax-sisรคltรถรค.

Kun eksplisiittinen odotus on ilmoitettu, sinun on kรคytettรคvรค Odotetut olosuhteettai voit mรครคrittรครค kyselytiheyden kรคyttรคmรคllรค Sujuva odotus. Vรคltรค kรคyttรถรค Thread.sleep(), koska se keskeyttรครค suorituksen ehdoitta ja sitรค pidetรครคn yleisesti huonona kรคytรคntรถnรค.

Alla olevassa esimerkissรค luomme viittauksen kohteeseen WebDriverOdota luokka, luo siitรค instanssi web-ajuri viittaus ja mรครคritรค enimmรคisikkunaksi 20 sekuntia.

Eksplisiittinen odotussyntaksi (Selenium 4):

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
package guru.test99;

import java.time.Duration;
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 {
        driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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();
    }
}

Selitys Code

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();

Tรคssรค WebDriverWait-esimerkissรค komentosarja odottaa jopa 20 sekuntia, kuten on mรครคritelty WebDriverOdota luokka, kunnes Odotetut olosuhteet tรคyttyvรคt โ€“ sen mukaan, kumpi tapahtuu ensin.

Ylempi Java koodi odottaa ehtoa jopa 20 sekuntia nรคkyvyysElementtiSijaittu olla totta.

Seuraavia odotettuja ehtoja voidaan kรคyttรครค Selenium Eksplisiittinen odotus:

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeavailableJa SwitchToIt()
  6. InvisibilityOfThe ElementLocated()
  7. invisibilityOf ElementWithText()
  8. lรคsnรคoloAllElementsLocatedBy()
  9. lรคsnรคoloOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. nรคkyvyys()
  16. VisibilityOfAll Elements()
  17. VisibilityOfAll ElementsLocatedBy()
  18. visibilityOfElementLocated()

Sujuva Odota Selenium

Sujuva Odota Selenium Mรครคrittรครค WebDriverin enimmรคisajan, jonka se odottaa ehtoa, sekรค kyselytiheyden ehdon varmentamiseksi ennen ElementNotVisibleException-poikkeuksen heittรคmistรค. Fluent Wait tarkistaa elementin sรครคnnรถllisin vรคliajoin, kunnes objekti lรถytyy tai aikakatkaisuaika umpeutuu.

Taajuus: Toistosykli tilan arvioimiseksi sรครคnnรถllisin vรคliajoin.

Tarkastellaan tilannetta, jossa elementti latautuu ennalta arvaamattomin vรคliajoin. Elementti voi latautua 10 sekunnissa, 20 sekunnissa tai pidempรครคn. Jos mรครคritรคmme eksplisiittisen 20 sekunnin odotusajan, skripti odottaa koko latauksen keston ennen epรคonnistumista. Tรคllaisissa tapauksissa Fluent Wait on ihanteellinen valinta, koska se suorittaa kyselyn mรครคritetyllรค taajuudella, kunnes elementti lรถytyy tai viimeinen ajastin umpeutuu.

Sujuvan odotuksen syntaksi (Selenium 4):

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

Vanhempi allekirjoitus, joka hyvรคksyi kokonaislukuarvot ja aikayksikรถn, vanhentui vuonna Selenium 3.11 ja poistettu kohdassa Selenium 4. Yllรค esitetty kestoon perustuva API on tรคllรค hetkellรค suositeltu lรคhestymistapa.

package guru.test99;

import java.time.Duration;
import java.util.NoSuchElementException;
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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.testng.annotations.Test;

public class AppTest3 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        driver = new ChromeDriver();
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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<>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofSeconds(5))
            .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();
    }
}

Selitys Code

Harkitse seuraavaa koodia:

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

Yllรค olevassa esimerkissรค mรครคrittelemme Fluent Waitin, jonka aikakatkaisu on 30 sekuntia, kyselytaajuus on 5 sekuntia ja jรคtรคmme huomiotta 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"));
}

Tรคmรค funktio tunnistaa sivun WebElementin (tรคssรค tapauksessa Selenium linkki kotisivulla). Viiden sekunnin kyselyvรคlillรค ja 30 sekunnin aikakatkaisulla odotustoiminto tarkistaa elementin 5 sekunnin vรคlein enintรครคn 30 sekunnin ajan. Jos elementti sijaitsee kyseisessรค ikkunassa, komentosarja jatkaa. Muussa tapauksessa ElementNotVisibleException heitetรครคn.

Tarkista myรถs: Selenium IDE-opastus aloittelijoille

Ero implisiittisen odotuksen ja eksplisiittisen odotuksen vรคlillรค

Alla oleva taulukko korostaa implisiittisen odotuksen ja eksplisiittisen odotuksen keskeisiรค eroja Selenium.

Epรคsuora odota Selkeรค odota
Implisiittinen odotusaika sovelletaan kaikkiin skriptin elementteihin. Eksplisiittistรค odotusaikaa kรคytetรครคn vain erityisesti kohdennettuihin elementteihin.
Implisiittisessรค odotustilassa elementille ei ole mรครคritetty odotettuja ehtoja. Eksplisiittisessรค odotustilassa elementille on mรครคriteltรคvรค ExpectedConditions.
Suositellaan, kun elementit latautuvat mรครคritetyn implisiittisen odotusikkunan sisรคllรค. Suositellaan, kun elementtien lataaminen kestรครค kauemmin ja kun elementtien tiloja, kuten visibilityOfElementLocated, elementToBeClickable tai elementToBeSelected, validoidaan.
Asetettu kerran ja otettu kรคyttรถรถn WebDriver-instanssin elinkaaren ajan. Aseta elementtikohtaisesti tai tarkistuskohtaisesti, mikรค tarjoaa tarkemman hallinnan.

Kuinka valita oikea odotusstrategia

Oikean odotuskomennon valitseminen vaikuttaa suoraan skriptin vakauteen ja suoritusaikaan. Kรคytรค tรคtรค pรครคtรถksentekokehystรค valitaksesi sopivan vaihtoehdon kullekin skenaariolle.

  1. Tunnista kuormituskuvio: Tarkista, ilmestyykรถ elementti kiinteรครคn aikaan, Ajax-vastauksen jรคlkeen vai ennalta-arvaamattomin vรคliajoin. Kiinteรคt kuormat sopivat implisiittiseen odotukseen, kun taas ennalta-arvaamattomat kuormat vaativat sujuvaa odotusta.
  2. Vรคltรค implisiittisten ja eksplisiittisten odotusaikojen sekoittamista: Nรคiden kahden yhdistรคminen voi aiheuttaa odottamattomia viivรคstyksiรค, koska pidempi odotusaika voi olla hallitseva. Selenium dokumentaatio suosittelee vain yhden strategian kรคyttรถรค WebDriver-istuntoa kohden.
  3. Oletusarvoisesti odota dynaamista sisรคltรถรค eksplisiittisen sisรคllรถn kohdalla: Kun sivut ovat riippuvaisia โ€‹โ€‹Ajaxista, ehdollisesta renderรถinnistรค tai animaatioista, Explicit Wait with ExpectedConditions kohdistuu juuri siihen elementtiin, jolla on merkitystรค.
  4. Kรคytรค Fluent Waitia muuttuvalle ajoitukselle: Kun elementtien latausaika vaihtelee ajojen vรคlillรค, mรครคritรค Fluent Wait -toimintoon kyselyvรคli. Kysely lyhentรครค kokonaisodotusaikaa verrattuna yhteen pitkรครคn aikakatkaisuun.
  5. Korvaa Thread.sleep: Kovakoodatut nukkumistoiminnot hidastavat testisarjoja ja piilottavat reaaliaikaisia โ€‹โ€‹ajoitusongelmia. Korvaa ne ehdollisilla odotustoiminnoilla pitรครคksesi suorituksen nopeana ja deterministisenรค.
  6. Virityksen aikakatkaisuarvot: Aloita lyhyillรค aikakatkaisuilla (5โ€“10 sekuntia) ja lisรครค niitรค vain, jos virheet osoittavat aitoa hidasta latausta. Pitkรคt oletusaikakatkaisut peittรคvรคt suorituskyvyn regressiot.
  7. Pidรค odotusajat apuohjelmissa: Keskitรค odotuslogiikka apuluokkaan, jotta aikakatkaisukรคytรคntรถjen muutokset koskevat koko testipakettia.

Tรคtรค viitekehystรค noudattamalla automaatioinsinรถรถrit voivat rakentaa kestรคviรค skriptejรค, jotka mukautuvat todelliseen sovellusajoitukseen hidastumatta tai haurastumatta.

Yleisiรค virheitรค, joita kannattaa vรคlttรครค Selenium Odottaa

Jopa kokeneet testaajat lankeavat muutamaan toistuvaan ansoihin tyรถskennellessรครคn Selenium odotusajat. Nรคiden ongelmien vรคlttรคminen pitรครค skriptit nopeina, deterministisinรค ja helposti yllรคpidettรคvinรค eri tiimeissรค ja ympรคristรถissรค.

Ensimmรคinen yleinen virhe on Thread.sleep-funktion liikakรคyttรถ. Kovakoodattu tauko pakottaa komentosarjan odottamaan koko keston riippumatta elementin todellisesta saatavuudesta, mikรค pidentรครค kokonaissuoritusaikaa. Korvaa tรคllaiset tauot Explicit- tai Fluent Wait -taukoilla, jotta komentosarja jatkaa suoritusta heti, kun ehto tรคyttyy.

Toinen virhe on implisiittisten ja eksplisiittisten odotusaikojen yhdistรคminen samaan testiin. Nรคmรค kaksi mekanismia voivat kasaantua ja luoda arvaamattomia aikakatkaisuja, joita on vaikea korjata. Valitse yksi strategia WebDriver-istuntoa kohden ja kรคytรค sitรค johdonmukaisesti.

Kolmas virhe on asettaa liian pitkรคt aikakatkaisut "varmuuden vuoksi". Pitkรคt oletusikkunat peittรคvรคt aitoja suorituskykyongelmia ja hidastavat palautetta jatkuvissa integraatioputkissa. Aloita lyhyillรค aikakatkaisuilla ja pidennรค niitรค vain, jos virhelokit osoittavat todellisen ajoitusongelman olemassaolon.

Tarkista myรถs: Selenium Opetusohjelma aloittelijoille: Opi WebDriver 7 pรคivรคssรค

UKK

Oletusarvoinen implisiittinen odotusaika Selenium WebDriver on 0 sekuntia. Ajuri ei pysรคhdy puuttuvien elementtien vuoksi, ennen kuin implicitlyWait-metodia kutsutaan mukautetulla Duration-arvolla.

Thread.sleep keskeyttรครค suorituksen ehdoitta kiinteรคksi ajaksi elementin valmiustilasta riippumatta. Se pidentรครค kokonaisajoaikaa, peittรครค suorituskykyongelmia ja tuottaa hauraita testejรค. Eksplisiittiset ja sujuvat odotusajat jatkuvat, kun ehto tรคyttyy.

Sitรค ei suositella. Selenium dokumentaatio varoittaa, ettรค molempien yhdistรคminen voi aiheuttaa arvaamattomia odotusaikoja. Valitse yksi strategia WebDriver-istuntoa kohden, tyypillisesti Explicit tai Fluent Wait, selkeรคmmรคn toiminnan ja helpomman virheenkorjauksen saavuttamiseksi.

Kyllรค. Tekoรคlypohjaiset testialustat, kuten Testim, Mabl ja Functionize analysoivat sovellusten vasteaikoja ja suosittelevat Explicit- tai Fluent Wait -arvoja. Ne vรคhentรคvรคt kokeilu- ja erehdysmenetelmรครคn perustuvaa sรครคtรถรค ja mukauttavat aikakatkaisuja dynaamisesti havaitun sivukรคyttรคytymisen perusteella.

Tekoรคlymoottorit oppivat historiallisia kuormitusmalleja ja sรครคtรคvรคt kyselyvรคlejรค tai aikakatkaisuikkunoita automaattisesti. Kun testi epรคonnistuu toistuvasti lรคhellรค aikarajaa, malli pidentรครค odotusaikaa tai vaihtaa รคlykkรครคmpรครคn tilaan, mikรค vรคhentรครค epรคtasaisia โ€‹โ€‹โ€‹โ€‹virheitรค eri testiajojen vรคlillรค.

Tiivistรค tรคmรค viesti seuraavasti: