2013-07-24 10 views
5

Ich benutze Python + Selen Webdriver für meine Automatisierung. Ich habe ImplicitlyWait zusammen mit WebDriverWait verwendet.Überschreibt WebDriverWait ImplicitlyWait, wenn beide verwendet werden?

Fragen:

  1. Ist es eine gute Praxis sowohl ImplicitlyWait und WebDriverWait in einem einzigen Skript zu benutzen?

  2. Angenommen, mein ImplicitlyWait-Wert ist 20 und der WebDriverWait-Wert ist 10 Sekunden. Wird WebDriverWait 20 überschreiben, wenn auf ein bestimmtes Element gewartet wird? Was passiert, wenn der ImplicitlyWait-Wert kleiner ist als der von WebDriverWait?

Bitte vorschlagen. Ich habe versucht, diese Antwort im Internet zu finden, habe aber keinen vollständigen Beweis oder eine überzeugende Antwort bekommen.

+4

Vielleicht möchten Sie JimEvans Gedanken [hier] (http://stackoverflow.com/a/15174978/1177636) ansehen. –

+0

Ich habe mir diese Antwort angesehen, aber sie beantwortet nur den ersten Teil meiner Frage. Was ist mit dem 2. Teil? –

+0

Diese Antwort beantwortet auch den zweiten Teil Ihrer Frage. Die Antwort (wie in diesem anderen Post angegeben) ist "es ist undefiniertes Verhalten". – JimEvans

Antwort

4

Für den ersten Punkt ist es wahrscheinlich eine persönliche Entscheidung. Ich verwende implicit waiting überhaupt nicht, weil ich die Kontrolle darüber haben möchte, wo Selenium wartet und wo nicht. Die Einstellung implicit wait bedeutet blind Selenium zu sagen, wenn du mein Element nicht findest, dann warte eine gewisse Zeit, bis du es kannst. Egal was es ist, egal welche Folge, egal welche Seite, du wartest bis du es entweder findest oder 20 Sekunden vergangen sind.

Das ist in Ordnung, wenn Sie wollen, aber für mich kommt das Problem von, wenn mein Element 30 Sekunden dauert, um auf der Seite zu erscheinen, dann ist das ein Problem an sich. Selen verbirgt es einfach, es kann das Problem überdecken.

Allerdings gibt es einige Male das Element eine Weile dauert, zu erscheinen und ‚bereit‘ zu sein, und das ist, wenn explicit waiting kommt in. Wenn Sie es tun erwarten.

Was beim Warten passiert, ist zunächst, wenn Ihr WebDriverWait getroffen wird, wird es laufen und versuchen, das Element zu finden. Selen wird sehen, dass Sie implicit wait eingestellt haben, so dass es ständig versuchen wird, dieses Element für bis zu 20 Sekunden zu finden.

Es wird dies "kostenlos", hinter den Kulissen.

Sobald das abgelaufen ist, Ihre WebDriverWait eine Antwort erhalten wird, und da Ihr implicit wait Timeout größer als Ihr WebDriverWait Timeout, wird es mit einer Ausnahme (Timeout Ausnahme) umfallen.

In Bezug auf, wenn der WebDriverWait Wert höher ist als der implicit wait Wert (Ihr Beispiel in den Kommentaren), dann würde der Prozess sein:

  1. die WebDriverWait startet zunächst
  2. Es trifft den .FindElement Anruf
  3. Selenium führt dies, intern, für 10 Sekunden
  4. Nach den ersten 10 Sekunden, Ihre würde eine Antwort erhalten.
  5. Wenn das Element nicht gefunden wird, wird es ab Schritt 1 erneut ausgeführt.
  6. Sobald es zu Schritt 4 kommt, wenn das Element nicht gefunden wird, wird es jetzt eine Zeitüberschreitung auslösen.

Zum weiteren (pseudo code C#) zu erklären:

driver.Manage().Timeouts().SetImplicitWait(TimeSpan.FromSeconds(10)); 
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); 
wait.Until(w => 
{ 
    return w.FindElement(By.Id("something")).Displayed; 
} 

Wir haben eine WebDriverWait von 20 Sekunden und eine implicit wait von 10 Sekunden.

Es wird getroffen:

return w.FindElement(By.Id("something")).Displayed; 

zum ersten Mal. Selen intern wird die .FindElement für 10 Sekunden laufen. Nachdem diese 10 Sekunden vergangen sind, überprüft mein WebDriverWait seinen Zustand (.Displayed). Wenn dies nicht erfüllt ist, wird die WebDriverWait die gleiche Codezeile erneut ausführen. Selenium wird wieder wie vorher tun und 10 Sekunden lang laufen. Wenn diese Bedingung erfüllt ist, bedeutet dies, dass die Zeit, die WebDriverWait gewartet hat, insgesamt 20 Sekunden beträgt und dann einen Fehler auslöst.

+0

Also meinst du, wenn wir beide Wartezeiten haben und wenn WebDriverWait auftritt, wird ImplicitlyWait zuerst aufgerufen, wartet für 20 Sekunden und wenn Element nicht gefunden wird, gibt es keine weitere Wartezeit von 10 Sekunden von WebDriverWait. Recht? –

+1

Ja, das ist richtig. – Arran

+0

In diesem Sinne, nur eine letzte Frage. Was ist, wenn der WebDriverWait-Wert mehr als ImplicitlyWait-Wert ist, sagen wir WebDriverWait = 20 und ImplicitlyWait = 10. Können Sie mir bitte sagen, wie das ausgeführt wird? –

Verwandte Themen