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")
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()
Eine ausführliche Diskussion finden Sie in:
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()
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
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")