2013-07-24 18 views
5

Używam python + selenu webdriver dla mojej automatyzacji. Użyłem ImplicitlyWait wraz z WebDriverWait.Czy WebDriverWait przesłania ImplicitlyWait, gdy są używane oba?

Pytania:

  1. Czy jest to dobra praktyka, aby korzystać zarówno ImplicitlyWait i WebDriverWait w jednym skrypcie?

  2. Załóżmy, że moja wartość ImplicitlyWait wynosi 20, a wartość WebDriverWait wynosi 10 sekund. Czy WebDriverWait zastąpi 20, gdy czeka na określony element? Co się dzieje, gdy wartość ImplicitlyWait jest mniejsza niż WebDriverWait?

Proszę sugerować. Próbowałem znaleźć tę odpowiedź w Internecie, ale nie dostałem żadnego pełnego dowodu ani przekonującej odpowiedzi.

+4

Możesz chcieć rzucić okiem na myśli JimEvansa [tutaj] (http://stackoverflow.com/a/15174978/1177636). –

+0

Spojrzałem na tę odpowiedź, ale to tylko odpowiedź na pierwszą część mojego pytania powyżej. A co z drugą częścią? –

+0

Ta odpowiedź również odpowiada na drugą część twojego pytania. Odpowiedź (jak stwierdzono w tamtym innym poście) brzmi "to jest niezdefiniowane zachowanie". – JimEvans

Odpowiedz

4

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:

  1. Uruchom WebDriverWait początkowo
  2. To uderza połączenie .FindElement
  3. Selen uruchamia to wewnętrznie przez 10 sekund.
  4. Po pierwszych 10 sekundach otrzymasz odpowiedź WebDriverWait.
  5. Jeśli element nie zostanie znaleziony, jest ponownie uruchamiany od kroku 1.
  6. 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.

+0

Mamy na myśli, że jeśli mamy oba oczekiwania i gdy napotkamy WebDriverWait, ImplicitlyWait jest wywoływana jako pierwsza, czeka przez 20 sekund, a jeśli element nie zostanie znaleziony, nie ma więcej czekania na 10 sekund z WebDriverWait. Dobrze? –

+1

Tak, to prawda. – Arran

+0

W tej notatce, tylko jedno ostatnie pytanie. Co jeśli wartość WebDriverWait jest większa niż wartość ImplicitlyWait: WebDriverWait = 20 i ImplicitlyWait = 10. Czy możesz mi powiedzieć, jak to się stanie? –