Sobes.tech
Middle

Parla di alcuni tipi di attesa in Selenium.

sobes.tech AI

Risposta dell'AI

In Selenium Webdriver vengono utilizzati diversi tipi di attese per sincronizzare le azioni dello script con il caricamento della pagina web.

  1. Attesa implicita (Implicit Wait): Imposta il tempo massimo durante il quale Selenium tenterà di trovare un elemento sulla pagina prima di lanciare un'eccezione NoSuchElementException. Si applica globalmente a tutte le operazioni di ricerca degli elementi dopo la sua configurazione.

    from selenium import webdriver
    
    # Creare un'istanza del driver
    driver = webdriver.Chrome()
    
    # Impostare l'attesa implicita (10 secondi)
    driver.implicitly_wait(10)
    
    # Le operazioni di ricerca degli elementi successive utilizzeranno questa attesa
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Chiudere il driver
    # driver.quit()
    
  2. Attesa esplicita (Explicit Wait): Definisce il tempo massimo per soddisfare una condizione specifica prima di lanciare un'eccezione TimeoutException. Si applica a un elemento o condizione specifica. Per usarla, è necessaria la classe WebDriverWait e una delle "condizioni attese" predefinite o personalizzate.

    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
    
    # Creare un'istanza del driver (non è necessaria attesa implicita qui, 
    # se si usa esplicita per elementi specifici)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Impostare l'attesa esplicita (10 secondi) per la presenza dell'elemento
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Azioni successive con l'elemento
        # element.click()
    except:
        # Gestire l'eccezione se l'elemento non viene trovato in 10 secondi
        print("Elemento non trovato in 10 secondi")
    
    # Impostare l'attesa esplicita per la cliccabilità dell'elemento
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Elemento non diventato cliccabile in 15 secondi")
    
    # Chiudere il driver
    # driver.quit()
    
  3. Attesa fluida (Fluent Wait): Simile all'attesa esplicita, permette di impostare il tempo massimo di attesa e la condizione. Inoltre, permette di specificare l'intervallo di polling per verificare la condizione e una lista di eccezioni da ignorare durante l'attesa.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Creare un'istanza del driver
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Impostare l'attesa fluida
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Azioni successive con l'elemento
        # element.click()
    except:
        print("Elemento non trovato con l'attesa fluida")
    
    # Chiudere il driver
    # driver.quit()
    

Confronto:

Tipo di attesa Applicazione Condizione Flessibilità Utilizzo
Implicita Globale Ricerca elemento Bassa (solo tempo) Configurazione semplice per tutti gli elementi
Esplicita Specifica Condizione definita Alta (tempo, condizione) Attesa di stati specifici degli elementi
Fluida Specifica Condizione definita Massima (tempo, condizione, intervallo, eccezioni da ignorare) Scenari di attesa complessi con gestione degli errori