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")
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()
Vous pouvez trouver quelques discussions détaillées dans:
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()
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
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")