2012-05-25 4 views
7
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 

browser = webdriver.Firefox() 

browser.get("http://testsite.com") 

element = WebDriverWait(browser, 10).until(lambda browser : browser.find_element_by_id("element")) 

element.click() # it actually goes to page http://testsite.com/test-page.html 

print "Just clicked! And I'm expecting timeout error!" 

new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) 

print "Too bad there's no timeout error, why?!" 

OK, wie Sie sehen können sogar ich Wartezeit auf 0,1 Sekunden setzen, es gibt immer noch keine Timeout-Ausnahme geworfen. Wenn element.click() ausgeführt wird, blockiert es nicht, bis die ganze Seite geladen ist und deshalb Just clicked! And I'm expecting timeout error! aufgetaucht ist, und zu meiner Überraschung new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) warten Sie, bis die ganze Seite geladen wird. Und wenn Sie implicit waits verwenden, erhalten Sie das gleiche Ergebnis.Sag mir, warum dies nicht mit einem Timeout-Fehler endet (selen 2 webdriver)?

Mein Punkt ist, manchmal, nachdem Sie ein Element klicken, um es nehmen könnte für eine Seite noch Stunden wegen eines schlechten Proxy zu laden, und Sie offensichtlich DO nicht so lange warten möchten, was Sie wollen, ist eine Zeitüberschreitungsausnahme In diesem Fall, wie würdest du es funktionieren lassen?

Antwort

4

Auf Klicks wird implizit gewartet, bis die Seite geladen ist. Es gibt Arbeit, derzeit nur in FirefoxDriver, mit der Sie festlegen können, wie lange Selenium auf das Laden einer Seite warten soll.

Dies ist wahrscheinlich in Selen 2.22 für Python sein wird, und dann wird Ihr Testfall wahrscheinlich einmal ausfallen, dass gesetzt

+0

Ich verstehe nicht ganz, was du meinst. Wären Sie bitte genauer und wie kann ich das tun? – Shane

+0

... und nach der Aktualisierung auf 2.22 erkannte ich all die Stellen, an denen ich mich unwissentlich auf dieses implizite Warten verließ. XD – Isaac

+0

Ich glaube nicht, dass das recht ist. Sie sprechen über driver.set_page_load_timeout() Ich glaube aber, dass das nicht mit Klicks zu tun hat. Nicht alle Klicks lösen eine Seitenladung aus. Das Zeitlimit für das Laden der Seite gilt nur für das Laden der Seite. Der Fragesteller hat auch Probleme mit der Zeitüberschreitung beim Suchen des Elements (es müssen keine Klicks beteiligt sein). – Purrell

0

Das Bis-Methode auf WebDriver Warte ignoriert das Element nicht Ausnahme und andere Ausnahmen gefunden, die im Zustand occures Sie Geben Sie für den von Ihnen angegebenen Zeitraum an. Nach der angegebenen Zeit erhalten Sie zunächst eine solche Ausnahme, wenn das Element nicht vorhanden ist, und dann eine Zeitüberschreitungsausnahme, wenn Sie die Ausnahme "Kein Element" behandeln (vorzugsweise in einem try catch).

für Ihren Bedarf könnten Sie eine Arbeit um diese versuchen Weg-

-> Bringen Sie den Fokus auf die Schaltfläche nach dem es eine Seite zu laden ist -> Starten Sie den Klick mit Java-Code (nicht WebDriver seit Klicks. wird warten, bis die nächste Seite geladen wird.) -> Legen Sie für eine oder zwei Sekunden eine thread.sleep -> Überprüfen Sie für die Elementvorgabe.

+0

nicht sicher, wie es mit Python funktioniert. aber das ist, wie es in Java geht. – QVSJ

+0

Ich verstehe deine Arbeit völlig, danke Kumpel! Aber von dem, was ich sehe, das Problem lebt irgendwie mit browser.find_element_by_id ("idstuff") auch, was bedeutet, dass es nicht wirklich beginnt, nach dem Vorhandensein dieses Elements zu suchen, bis diese Seite vollständig geladen ist, ich weiß nicht, welchen Punkt ist in diesem Mechanismus, aber das nervt mich sehr, da Sie keine Kontrolle darüber haben. – Shane

+0

Wenn Sie dies noch nicht versucht haben, können Sie sehen, ob Sie hier etwas finden (esp Kommentar 4 klang vielversprechend) von diesem Link http://code.google.com/p/selenium/issues/detail?id=687 . Kam nach einer zufälligen Suche auf. Keine gauranties :) - – QVSJ