2014-12-22 8 views
9

Ich frage mich nur, wie der Browser warten muss, bevor Sie auf einen Link klicken? Mein Ziel ist, dass ich von einer dynamischen Webseite schabe, der Inhalt ist dynamisch, aber ich schaffe es, die Formular-ID zu bekommen. Das einzige Problem ist, dass der Submit-Button erst nach 2-3 Sekunden angezeigt wird. Mein Firefox-Treiber beginnt jedoch sofort mit dem Klicken auf den Link, wenn die Seite geladen wird (nicht der dynamische Teil).Python Selenium, wie man wartet, bevor man auf den Link klickt

Gibt es eine Möglichkeit, dass mein Browser 2-3 Sekunden warten kann, bis der Submit-Button erscheint? Ich habe versucht, time.sleep() zu verwenden, aber es pausiert alles, der Absenden-Button erscheint nicht während time.sleep, sondern erscheint nach 2-3 Sekunden, wenn time.sleep endet.

Antwort

13

können Sie einstellen, warten wie folgt vor:

Explicit Warte:

element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "myElement")) 

Implizite Warte:

driver.implicitly_wait(20) # seconds 
driver.get("Your-URL") 
myElement = driver.find_element_by_id("myElement") 

Sie bei allen oben verwenden können. Beide sind gültig.

+1

perfekt das, s was ich brauche, danke. Nur um zu verdeutlichen, wird explizites Warten nur für dieses Element angewendet, während implizite Wartezeit für die gesamte Sitzung gilt, bin ich richtig? – Kiddo

+0

Ja, Sie haben Recht, immer noch, wenn Sie Haupt diff wollen. zwischen ihnen dann bitte verweisen: http://stackoverflow.com/questions/22656615/what-is-difference-between-implicit-wait-vs-explicit-wait-in-selenium-webdriver –

+1

@HelpingHands: Beide der oben genannten wartet du hast verwendet infact [** 'Explicitwaits' **] (http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits), nicht [**' Implicit waits' **] (http: //docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits). Bitte überprüfen und bearbeiten Sie Ihren Code entsprechend. – Subh

1

Sie müssen Selenium Waits verwenden.

Insbesondere element_to_be_clickable erwartet Zustand ist, was besser als andere passt:

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

element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "myDynamicElement")) 
) 
element.click() 

wo driver Ihre WebDriver Instanz ist, 10 ist die Anzahl der Sekunden für ein Element zu warten. Mit dieser Konfiguration würde Selen versuchen, ein Element alle 500 Millisekunden für insgesamt 10 Sekunden zu lokalisieren. Es würde TimeoutException nach 10 Sekunden werfen, wenn das Element nicht gefunden würde.

+4

Ich habe etwas Neues am Tag gelernt, das ist das element_to_be_clickable, danke – Kiddo

Verwandte Themen