Sobes.tech
Middle

Vorbește despre câteva tipuri de așteptare în Selenium.

sobes.tech AI

Răspuns de la AI

În Selenium Webdriver sunt utilizate diferite tipuri de așteptări pentru a sincroniza acțiunile scriptului cu încărcarea paginii web.

  1. Așteptare implicită (Implicit Wait): Setează timpul maxim în care Selenium va încerca să găsească un element pe pagină înainte de a arunca o excepție NoSuchElementException. Se aplică global pentru toate operațiunile de căutare după ce este setată.

    from selenium import webdriver
    
    # Crearea unei instanțe de driver
    driver = webdriver.Chrome()
    
    # Setarea așteptării implicite (10 secunde)
    driver.implicitly_wait(10)
    
    # Operațiuni ulterioare de căutare a elementelor vor folosi această așteptare
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Închiderea driver-ului
    # driver.quit()
    
  2. Așteptare explicită (Explicit Wait): Setează timpul maxim pentru executarea unei anumite condiții înainte de a arunca o excepție TimeoutException. Se aplică unui element sau condiție specifică. Pentru utilizare, este necesară clasa WebDriverWait și una dintre condițiile predefinite sau personalizate "așteptate" (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
    
    # Crearea unei instanțe de driver (nu este nevoie de așteptare implicită dacă se folosește explicit)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Setarea așteptării explicite (10 secunde) pentru prezența elementului
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Acțiuni ulterioare cu elementul
        # element.click()
    except:
        # Tratarea excepției dacă elementul nu a fost găsit în 10 secunde
        print("Elementul nu a fost găsit în 10 secunde")
    
    # Setarea așteptării explicite pentru a fi clicabil elementul
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Elementul nu a devenit clicabil în 15 secunde")
    
    # Închiderea driver-ului
    # driver.quit()
    
  3. Așteptare flexibilă (Fluent Wait): Similară cu așteptarea explicită, permite setarea timpului maxim de așteptare și condiției. În plus, permite specificarea intervalului (polling interval) pentru verificarea condiției și lista de excepții de ignorat în timpul așteptării.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Crearea unei instanțe de driver
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Setarea așteptării flexibile
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Acțiuni ulterioare cu elementul
        # element.click()
    except:
        print("Elementul nu a fost găsit folosind așteptarea flexibilă")
    
    # Închiderea driver-ului
    # driver.quit()
    

Comparare:

Tip de așteptare Aplicare Condiție Flexibilitate Utilizare
Implicită Globală Căutare element Scăzută (doar timp) Configurare simplă pentru toate elementele
Explicită Specifică Condiție definită Înaltă (timp, condiție) Așteptare pentru stări specifice ale elementelor
Flexibilă Specifică Condiție definită Maximă (timp, condiție, interval, ignorare excepții) Scenarii complexe de așteptare cu gestionare a erorilor