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:
- die WebDriverWait startet zunächst
- Es trifft den
.FindElement
Anruf
- Selenium führt dies, intern, für 10 Sekunden
- Nach den ersten 10 Sekunden, Ihre würde eine Antwort erhalten.
- Wenn das Element nicht gefunden wird, wird es ab Schritt 1 erneut ausgeführt.
- 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.
Vielleicht möchten Sie JimEvans Gedanken [hier] (http://stackoverflow.com/a/15174978/1177636) ansehen. –
Ich habe mir diese Antwort angesehen, aber sie beantwortet nur den ersten Teil meiner Frage. Was ist mit dem 2. Teil? –
Diese Antwort beantwortet auch den zweiten Teil Ihrer Frage. Die Antwort (wie in diesem anderen Post angegeben) ist "es ist undefiniertes Verhalten". – JimEvans