web-dev-qa-db-de.com

Selen - Warten Sie, bis das Element vorhanden, sichtbar und interaktiv ist

Ich habe ein Selenium-Skript (Python), das auf eine Antwortschaltfläche klickt, damit die Klassen-Anonemail angezeigt wird. Die Zeit, die benötigt wird, um die Klassen-Anonemail anzuzeigen, ist unterschiedlich. Aus diesem Grund muss ich den Schlaf verwenden, bis das Element erschienen ist. Ich möchte warten, bis die Klasse erschienen ist, anstatt Schlaf zu verwenden. Ich habe von Wartebefehlen gehört, weiß aber nicht, wie ich sie verwenden soll.

Das habe ich bisher:

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

Gemäß den Best Practices:

  • Wenn Ihr Anwendungsfall das Vorhandensein eines Elements überprüfen soll, das Sie induzieren müssen WebDriverWait Setzen Sie expected_conditions = as presence_of_element_located() Dies ist die Erwartung, um zu überprüfen, ob ein Element im DOM einer Seite vorhanden ist. Dies bedeutet nicht unbedingt, dass das Element sichtbar ist. Die effektive Codezeile lautet also:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • Wenn Ihr Anwendungsfall darin besteht, ein Attribut eines Elements zu extrahieren, das Sie induzieren müssen WebDriverWait Setzen Sie expected_conditions = as visibility_of_element_located(locator) Dies ist eine Erwartung, um zu überprüfen, ob ein Element im DOM einer Seite vorhanden und sichtbar ist. Sichtbarkeit bedeutet, dass das Element nicht nur angezeigt wird, sondern auch eine Höhe und Breite von mehr als 0 hat. In Ihrem Anwendungsfall lautet die Codezeile also effektiv:

    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value")
    
  • Wenn Ihr Anwendungsfall click() für ein Element aufrufen soll, das Sie induzieren müssen WebDriverWait Setzen Sie das - expected_conditions as element_to_be_clickable() Dies ist eine Erwartung zum Überprüfen, ob ein Element sichtbar und aktiviert ist, sodass Sie darauf klicken können. In Ihrem Anwendungsfall lautet die Codezeile also effektiv:

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

Verweise

Eine ausführliche Diskussion finden Sie in:

5
DebanjanB

Sie können Wartezeiten verwenden. Weitere Informationen finden Sie unter diesem Link: Selenium watis

Im folgenden Beispiel warten wir 10 Sekunden, bis das Element mit der Funktion sichtbarkeit_von_element_lokiert sichtbar ist.

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

Nachdem Sie auf die Schaltfläche reply geklickt haben, verwenden Sie .visibility_of_element_located wie unten:

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)

Nach dem Import:

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

Wartet auf Dokumente

0
frianH

Sie können implicit_wait verwenden

from Selenium import webdriver

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

Es wartet, bis das Element geladen ist.

In Ihrem Fall wäre die Implementierung,

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