Sobes.tech
Middle

Porozprávaj o niekoľkých druhoch čakania v Selenium.

sobes.tech AI

Odpoveď od AI

V Selenium Webdriver sa používajú rôzne typy očakávaní na synchronizáciu akcií skriptu s načítaním webovej stránky.

  1. Nepriame očakávanie (Implicit Wait): Určuje maximálny čas, počas ktorého sa Selenium pokúsi nájsť prvok na stránke, predtým než vyhodí výnimku NoSuchElementException. Je aplikované globálne na všetky operácie hľadania prvkov po jeho nastavení.

    from selenium import webdriver
    
    # Vytvorenie inštancie ovládača
    driver = webdriver.Chrome()
    
    # Nastavenie nepriameho očakávania (10 sekúnd)
    driver.implicitly_wait(10)
    
    # Ďalšie operácie hľadania prvkov budú používať toto očakávanie
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Zatvorenie ovládača
    # driver.quit()
    
  2. Priame očakávanie (Explicit Wait): Určuje maximálny čas na splnenie určitého podmienky pred vyhodením výnimky TimeoutException. Je aplikované na konkrétny prvok alebo podmienku. Na jeho použitie je potrebná trieda WebDriverWait a jeden z preddefinovaných alebo prispôsobených "očakávaných podmienok" (expected conditions).

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # Vytvorenie inštancie ovládača (nepriame očakávanie nie je potrebné, 
    # ak sa používa priame pre konkrétne prvky)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Nastavenie priameho očakávania (10 sekúnd) pre prítomnosť prvku
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Ďalšie akcie s prvkom
        # element.click()
    except:
        # Spracovanie výnimky, ak prvok nebol nájdený do 10 sekúnd
        print("Prvok nebol nájdený do 10 sekúnd")
    
    # Nastavenie priameho očakávania pre kliknuteľnosť prvku
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Prvok sa nestal kliknuteľným do 15 sekúnd")
    
    # Zatvorenie ovládača
    # driver.quit()
    
  3. Flexibilné očakávanie (Fluent Wait): Podobne ako priame očakávanie, umožňuje nastaviť maximálny čas očakávania a podmienku. Navyše umožňuje určiť interval (polling interval) pre kontrolu podmienky a zoznam výnimiek, ktoré je potrebné ignorovať počas očakávania.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Vytvorenie inštancie ovládača
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Nastavenie flexibilného očakávania
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Ďalšie akcie s prvkom
        # element.click()
    except:
        print("Prvok nebol nájdený pomocou flexibilného očakávania")
    
    # Zatvorenie ovládača
    # driver.quit()
    

Porovnanie:

Typ očakávania Použitie Podmienka Flexibilita Použitie
Nepriame Globálne Hľadanie prvku Nízka (len čas) Jednoduché nastavenie pre všetky prvky
Priame Konkrétne Určená podmienka Vysoká (čas, podmienka) Čakanie na špecifické stavy prvkov
Flexibilné Konkrétne Určená podmienka Najvyššia (čas, podmienka, interval, ignorovanie výnimiek) Zložité scenáre čakania s chybovou manipuláciou