web-dev-qa-db-fra.com

Sélénium - attendez que l'élément soit présent, visible et interactif

J'ai un script Selenium (python) qui clique sur un bouton de réponse pour faire apparaître la messagerie anonyme de la classe. Le temps nécessaire pour que l'e-mail de la classe apparaisse varie. Pour cette raison, je dois utiliser le sommeil jusqu'à ce que l'élément apparaisse. Je veux attendre que la classe soit apparue au lieu d'utiliser le sommeil. J'ai entendu parler des commandes d'attente, mais je ne sais pas comment les utiliser.

Voici ce que j'ai jusqu'à présent:

browser.find_element_by_css_selector(".reply-button").click()
sleep(5)
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")
2
Benjamin Arvola

Selon les meilleures pratiques:

  • Si votre cas d'utilisation est de valider la présence de tout élément dont vous avez besoin pour induire WebDriverWait définir les conditions_attendues = as presence_of_element_located() qui est l'attente pour vérifier qu'un élément est présent sur le DOM d'une page. Cela ne signifie pas nécessairement que l'élément est visible. La ligne de code efficace sera donc:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • Si votre cas d'utilisation consiste à extraire tout attribut de tout élément que vous devez induire WebDriverWait définir les conditions_attendues = as visibility_of_element_located(locator) qui est une attente pour vérifier qu'un élément est présent sur le DOM d'une page et visible. La visibilité signifie que l'élément n'est pas seulement affiché, mais a également une hauteur et une largeur supérieures à 0. Ainsi, dans votre cas d'utilisation, la ligne de code sera:

    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value")
    
  • Si votre cas d'utilisation est d'invoquer click() sur n'importe quel élément que vous devez induire WebDriverWait définissant le - expect_conditions as element_to_be_clickable() qui est une attente pour la vérification d'un élément est visible et activé de sorte que vous pouvez cliquer dessus. Ainsi, dans votre cas d'utilisation, la ligne de code sera:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    

Références

Vous pouvez trouver quelques discussions détaillées dans:

5
DebanjanB

Vous pouvez utiliser des temps d'attente. Vérifiez pour plus d'informations sur ce lien: Selenium watis

Sur l'exemple ci-dessous, nous attendons 10 secondes pour que l'élément soit visible, en utilisant la fonction visibilité_de_élément_localisé.

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
0
daniboy000

Après avoir cliqué sur le bouton reply, utilisez .visibility_of_element_located comme ci-dessous:

browser.find_element_by_css_selector(".reply-button").click()

#wait initialize, in seconds
wait = WebDriverWait(browser, 10)

email = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.anonemail'))).get_attribute("value")
print(email)

Après l'importation:

from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC

Attend les documents

0
frianH

Vous pouvez utiliser implicitly_wait

from Selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(15)
driver.get("http://url")
driver.find_element_by_id("id_of_element").click()

Il attend que l'élément soit chargé.

Dans votre cas, la mise en œuvre serait,

browser.implicitly_wait(10)
browser.find_element_by_css_selector(".reply-button").click()
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")
0
Marceline