Recherche…


Introduction

L'un des obstacles les plus courants pour les nouveaux utilisateurs de Selenium est d'attendre qu'une page soit complètement chargée. Les utilisateurs humains peuvent facilement savoir si une page est complètement chargée ou si elle est toujours en cours de chargement. Le sélénium, cependant, attend juste un certain temps. Par conséquent, il est souvent pratique d'avoir un bon moyen d'attendre des éléments dans une page. Bien qu'il soit possible de le faire avec une boucle et des fonctions sleep (), il existe déjà des moyens beaucoup plus propres à Selenium.

Attente explicite en Python

Lorsque le navigateur navigue sur une page dynamique (le plus souvent une application Web basée sur AJAX), le chargement des éléments sur la page peut prendre un temps différent, et de plus, certains éléments ne se chargent que pour répondre à certaines actions de l'utilisateur. Dans de tels cas, la récupération directe d'un élément peut échouer:

# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q') 

La solution la plus évidente semble introduire l’attente avant de récupérer des éléments:

# Don't do this: inefficient solution for ElementNotVisibleException 
time.sleep(5) # delays for 5 seconds  
element = driver.find_element_by_name('q') 

Mais une telle solution est inefficace, car elle fait que le test attend toujours 5 secondes, même si dans la plupart des cas, l'élément apparaît après 1 seconde (et ne nécessite parfois que 5 secondes). Cela ne semble pas grand-chose si c'est un seul endroit, mais généralement chaque test traite de plusieurs éléments, et il existe plusieurs tests, ce qui correspond à la durée totale du test.

Une meilleure solution consiste à attendre que l’élément apparaisse pendant 5 secondes au maximum, mais revenez de l’attente dès que l’élément est trouvé. WebDriverWait vous permet de faire exactement cela.

L'exemple suivant navigue sur www.google.com, attend (pendant 5 secondes) le chargement de la barre de recherche, puis recherche "sélénium".

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# Create a new chromedriver instance
driver = webdriver.Chrome()

# Go to www.google.com
driver.get("https://www.google.com")

try:
    # Wait as long as required, or maximum of 5 sec for element to appear
    # If successful, retrieves the element
    element = WebDriverWait(driver,5).until(
         EC.presence_of_element_located((By.NAME, "q")))

    # Type "selenium"
    element.send_keys("selenium")
    
    #Type Enter
    element.send_keys(Keys.ENTER)

except TimeoutException:
    print("Failed to load search bar at www.google.com")
finally:
    driver.quit()

Attendez à Java avec du sélénium

Attente explicite : attendez qu'une certaine condition se produise avant de continuer dans le code.

WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));

Attente implicite: attendez un certain temps lorsque vous tentez de trouver un élément ou des éléments s'ils ne sont pas immédiatement disponibles.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow