Implicitné a explicitné čakanie v Selenium

Implicitné a explicitné čakanie v Selenium
3 MIN
24 nov 2023

Obsah

Prečo sa v Selenium vyžaduje čakanie (waits)?

V automatizácii používateľského rozhrania sú waity potrebné, pretože niektoré prvky sa na stránke načítavajú asynchrónne, takže po spustení udalosti sa stránka môže úspešne načítať, ale niektoré jej prvky môžu byť stále nenačítané.

To spôsobuje výnimku elementNotFound pri vyhľadávaní prvku. V takýchto prípadoch nám zostáva použiť Thread.sleep(), t. j. statické čakanie, ktoré zastaví vykonávanie testu na určitý stanovený čas a potom vykoná ďalší krok.

Keďže Thread.sleep() bude čakať na zadaný čas bez ohľadu na to, či sa prvky zobrazia pred týmto časom. Použitie funkcie Thread.sleep() sa teda pri automatizácii používateľského rozhrania nikdy neodporúča.

Aby sa tomu Selenium vyhlo, poskytuje rôzne typy čakania, z ktorých sa najčastejšie používajú Implicitné a Explicitné čakanie.

Implicitné čakanie

Implicitné čakanie sa pri použití nastaví na inštanciu WebDriver a použije sa na všetky webové prvky. Pri implicitnom čakaní sa webdriver pýta DOM, aby skontroloval dostupnosť webového prvku, a čaká do maximálneho určeného času, než vyhodí výnimku NoSuchElementException.

WebDriver driver = new FirefoxDriver();

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

Vo vyššie uvedenom úryvku kódu je hodnota 20 zadaná v implicitnej metóde wait maximálnym časom v sekundách, do ktorého bude WebDriver čakať pred vyhodením výnimky NoSuchElementException pri vyhľadávaní WebElementu.

Explicitné čakanie

Na rozdiel od implicitného čakania sa explicitné čakanie uplatňuje na každý webový prvok. V explicitnom čakaní sú definované určité podmienky, za ktorých inštancia WebDriver čaká pred vyhľadaním webových prvkov alebo vykonaním akcií na nich. Niektoré z najbežnejších podmienok špecifikovaných v explicitnom čakaní sú: elementToBeClickable, presenceOfElementLocated atď.

WebDriverWait wait = new WebDriverWait(driver, 15);

wait.until(ExpectedConditions.presenceOfElementLocated(ElementLocator));

Tu bude inštancia WebDriveru čakať, kým nebude splnená zadaná podmienka, t. j. prítomnosť prvku lokalizovaného pomocou ElementLocator s maximálnym časom čakania 15 sekúnd, po ktorom, ak podmienka stále nie je splnená, vyhodí výnimku.