Sobes.tech
Middle

Parlez de quelques types d'attente dans Selenium.

sobes.tech IA

Réponse de l'IA

Dans Selenium Webdriver, différentes types d'attentes sont utilisées pour synchroniser les actions du script avec le chargement de la page web.

  1. Attente implicite (Implicit Wait) : Définit le temps maximum pendant lequel Selenium tentera de trouver un élément sur la page avant de lancer une exception NoSuchElementException. Elle s'applique globalement à toutes les opérations de recherche d'éléments après sa configuration.

    from selenium import webdriver
    
    # Création d'une instance du driver
    driver = webdriver.Chrome()
    
    # Définir l'attente implicite (10 secondes)
    driver.implicitly_wait(10)
    
    # Les opérations de recherche d'éléments suivantes utiliseront cette attente
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Fermer le driver
    # driver.quit()
    
  2. Attente explicite (Explicit Wait) : Définit le temps maximum pour remplir une condition spécifique avant de lancer une exception TimeoutException. Elle s'applique à un élément ou une condition précise. Pour l'utiliser, la classe WebDriverWait et une des "conditions attendues" prédéfinies ou personnalisées sont nécessaires.

    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
    
    # Création d'une instance du driver (l'attente implicite n'est pas nécessaire ici, 
    # si une attente explicite est utilisée pour des éléments spécifiques)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Définir l'attente explicite (10 secondes) pour la présence de l'élément
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Actions ultérieures avec l'élément
        # element.click()
    except:
        # Gérer l'exception si l'élément n'a pas été trouvé en 10 secondes
        print("Élément non trouvé en 10 secondes")
    
    # Définir l'attente explicite pour que l'élément soit cliquable
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("L'élément n'est pas devenu cliquable en 15 secondes")
    
    # Fermer le driver
    # driver.quit()
    
  3. Attente fluide (Fluent Wait) : Semblable à l'attente explicite, elle permet de définir le temps d'attente maximal et la condition. Elle permet également de spécifier l'intervalle de sondage (polling interval) pour vérifier la condition et une liste d'exceptions à ignorer pendant l'attente.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Création d'une instance du driver
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Définir l'attente fluide
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Actions ultérieures avec l'élément
        # element.click()
    except:
        print("Élément non trouvé avec l'attente fluide")
    
    # Fermer le driver
    # driver.quit()
    

Comparaison:

Type d'attente Application Condition Flexibilité Utilisation
Implicite Globale Recherche d'élément Faible (seulement temps) Configuration simple pour tous les éléments
Explicite Spécifique Condition définie Élevée (temps, condition) Attente pour des états spécifiques d'éléments
Flexible Spécifique Condition définie La plus haute (temps, condition, intervalle, exceptions à ignorer) Scénarios d'attente complexes avec gestion des erreurs