Po pierwsze, jest to prawdopodobnie osobisty wybór. Nie używam w ogóle implicit waiting
po prostu dlatego, że lubię mieć kontrolę nad tym, gdzie Selenium czeka i gdzie nie jest. Ustawienie implicit wait
ślepo mówi Selenium, jeśli nie znajdziesz mojego elementu, poczekaj na pewien czas, aż będziesz mógł. Bez względu na to, co to jest, bez względu na konsekwencje, bez względu na stronę, możesz zaczekać, aż ją znajdziesz lub minęło 20 sekund.
W porządku, jeśli tak właśnie chcesz iść, ale dla mnie problem wynika z tego, że jeśli mój element zajmuje 30 sekund na pojawienie się na stronie, to i tak jest to problem sam w sobie. Selen tylko to ukrywa, może rozwiązać problem.
Czasami jednak element pojawia się i musi być "gotowy" i wtedy pojawia się explicit waiting
. Gdy już to zrobisz, spodziewaj się.
Co do czekania, co się stanie, to początkowo, gdy zostanie uderzony Twój WebDriverWait
, zostanie uruchomiony i spróbuje znaleźć element. Selenium zobaczy, że masz swój zestaw implicit wait
, więc będzie on nieustannie próbował znaleźć ten element przez 20 sekund.
Wykona to "za darmo" za kulisami.
Gdy to wygaśnięciu WebDriverWait
dostanie odpowiedzi, a ponieważ twój czas oczekiwania implicit wait
jest większa niż limit czasu WebDriverWait
, to przewróci z wyjątkiem wyjątków (timeout).
Pod względem jeżeli wartość WebDriverWait
jest wyższa niż wartość implicit wait
(Twój przykład w komentarzach), to proces będzie:
- Uruchom WebDriverWait początkowo
- To uderza połączenie
.FindElement
- Selen uruchamia to wewnętrznie przez 10 sekund.
- Po pierwszych 10 sekundach otrzymasz odpowiedź
WebDriverWait
.
- Jeśli element nie zostanie znaleziony, jest ponownie uruchamiany od kroku 1.
- Gdy dojdzie do kroku 4, jeśli element nie zostanie znaleziony, zostanie teraz zgłoszony wyjątek limitu czasu.
celu wyjaśnienia (pseudo-C#):
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;
}
Mamy WebDriverWait
20 sekund, i implicit wait
10 sekund.
To będzie hit:
return w.FindElement(By.Id("something")).Displayed;
po raz pierwszy. Selenium wewnętrznie będzie uruchamiać .FindElement
przez 10 sekund. Po upływie 10 sekund mój WebDriverWait
sprawdzi stan urządzenia (.Displayed
). Jeśli to nie zostanie spełnione, to WebDriverWait
ponownie uruchomi ten sam wiersz kodu. Znowu Selenium zrobi to, co wcześniej, i będzie działał przez 10 sekund. Po powrocie z tej sytuacji, jeśli warunek nie zostanie spełniony, oznacza to, że czas oczekiwania WebDriverWait
wynosi w sumie 20 sekund, a następnie wygeneruje błąd.
Możesz chcieć rzucić okiem na myśli JimEvansa [tutaj] (http://stackoverflow.com/a/15174978/1177636). –
Spojrzałem na tę odpowiedź, ale to tylko odpowiedź na pierwszą część mojego pytania powyżej. A co z drugą częścią? –
Ta odpowiedź również odpowiada na drugą część twojego pytania. Odpowiedź (jak stwierdzono w tamtym innym poście) brzmi "to jest niezdefiniowane zachowanie". – JimEvans