Sobes.tech
Middle

Pověz o několika druzích čekání v Selenium.

sobes.tech AI

Odpověď od AI

V Selenium Webdriver jsou používány různé typy čekání pro synchronizaci akcí skriptu s načítáním webové stránky.

  1. Implicitní čekání (Implicit Wait): Nastavuje maximální dobu, po kterou se Selenium pokusí najít prvek na stránce, než vyhodí výjimku NoSuchElementException. Je aplikováno globálně na všechny operace hledání prvků po jeho nastavení.

    from selenium import webdriver
    
    # Vytvoření instance ovladače
    driver = webdriver.Chrome()
    
    # Nastavení implicitního čekání (10 sekund)
    driver.implicitly_wait(10)
    
    # Další operace hledání prvků budou používat toto čekání
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Zavření ovladače
    # driver.quit()
    
  2. Explicitní čekání (Explicit Wait): Nastavuje maximální dobu pro provedení určité podmínky před tím, než vyhodí výjimku TimeoutException. Je aplikováno na konkrétní prvek nebo podmínku. Pro jeho použití je nutná třída WebDriverWait a jedna z předdefinovaných nebo přizpůsobených "čekacích podmínek" (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
    
    # Vytvoření instance ovladače (zde není potřeba implicitní čekání, pokud se používá explicitní)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Nastavení explicitního čekání (10 sekund) na přítomnost prvku
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Další akce s prvkem
        # element.click()
    except:
        # Zpracování výjimky, pokud prvek nebyl nalezen do 10 sekund
        print("Prvek nebyl nalezen do 10 sekund")
    
    # Nastavení explicitního čekání na kliknutelnost prvku
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Prvek se nestal kliknutelným do 15 sekund")
    
    # Zavření ovladače
    # driver.quit()
    
  3. Flexibilní čekání (Fluent Wait): Podobně jako explicitní čekání, umožňuje nastavit maximální dobu čekání a podmínku. Navíc umožňuje určit interval (polling interval) pro kontrolu podmínky a seznam výjimek, které je třeba ignorovat během čekání.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Vytvoření instance ovladače
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Nastavení flexibilního čekání
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Další akce s prvkem
        # element.click()
    except:
        print("Prvek nebyl nalezen pomocí flexibilního čekání")
    
    # Zavření ovladače
    # driver.quit()
    

Porovnání:

Typ čekání Použití Podmínka Flexibilita Použití
Implicitní Globální Vyhledávání prvku Nízká (pouze čas) Jednoduché nastavení pro všechny prvky
Explicitní Konkrétní Určená podmínka Vysoká (čas, podmínka) Čekání na konkrétní stavy prvků
Flexibilní Konkrétní Určená podmínka Nejvyšší (čas, podmínka, interval, ignorování výjimek) Složitější scénáře čekání s chybovou správou