2012-05-25 6 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, jak widać, nawet jeśli ustawiłem czas oczekiwania na 0,1 sekundy, nie ma jeszcze zgłoszonego wyjątku limitu czasu. Po wykonaniu element.click() nie blokuje się do momentu załadowania całej strony i dlatego pojawił się Just clicked! And I'm expecting timeout error! i ku mojemu zaskoczeniu new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) poczekaj, aż cała strona się załaduje. A jeśli użyjesz implicit waits, otrzymasz taki sam wynik.Powiedz mi, dlaczego to nie kończy się z błędem limitu czasu (webmaster selenu 2)?

Chodzi mi o to, że czasami po kliknięciu elementu może minąć nawet kilka godzin, zanim strona załaduje się z powodu złego proxy, i oczywiście NIE chcę chcę czekać tak długo, czego chcesz wyjątek timeout. W takim przypadku, jak by to działało?

Odpowiedz

4

Kliknięcia mają wbudowaną wbudowaną funkcję oczekiwania, aby czekać na załadowanie strony. W dziale FirefoxDriver dostępna jest tylko praca, która pozwala określić, jak długo Selenium powinien czekać na załadowanie strony.

Prawdopodobnie będzie w selen 2,22 dla Pythona, a następnie sprawa Test prawdopodobnie nie raz, że jest ustawiony

+0

Nie rozumiem, co masz na myśli. Czy mógłbyś bardziej konkretnie i jak mogę to zrobić? – Shane

+0

... i po przejściu na 2.22, zdałem sobie sprawę z wszystkich miejsc, w których nieświadomie polegałem na tym domniemanym oczekiwaniu. XD – Isaac

+0

Nie sądzę, żeby to było całkiem słuszne. Mówisz o driver.set_page_load_timeout() Uważam jednak, że nie ma to związku z kliknięciami. Nie wszystkie kliknięcia powodują załadowanie strony. Czas wczytywania strony jest przeznaczony tylko do ładowania strony. Pytający ma również problem z przekroczeniem limitu czasu, po prostu znajdując element (nie trzeba wykonywać żadnych kliknięć). – Purrell

0

Do metoda na webdriver czekać ignoruje element nie znaleziono wyjątku i inne wyjątki, które occures w warunku ty określić, przez określony czas. Po określonym czasie początkowo otrzymywałbyś wyjątek od takiego elementu, jeśli nie masz elementu obecnego, a następnie wyjątku limitu czasu, jeśli poradzisz sobie z wyjątkiem "brak takiego elementu" (najlepiej w próbie catch).

Dla potrzeb można spróbować obejść ten drodze,

-> Przynieś ostrość na przycisk po której znajduje się ładunek strona -> Ogień kliknięcie z kodem Java (nie webdriver ponieważ kliknięć. zaczeka na załadowanie kolejnej strony.) -> Umieść thread.sleep na sekundę lub dwie -> sprawdź, czy nie ma presconu elementu.

+0

nie wiesz, jak to działa z pytonem. ale to jak to idzie w java .. – QVSJ

+0

Całkowicie rozumiem twoją pracę, dzięki kolego! Ale z tego, co widzę, problem trochę się dzieje z 'browser.find_element_by_id (" idstuff ")', co oznacza, że ​​faktycznie nie zaczyna on sprawdzać obecności tego elementu, dopóki ta strona nie jest w pełni załadowana, nie wiem, który punkt jest w tym mechanizmie, ale to bardzo mnie martwi, ponieważ nie masz nad tym kontroli. – Shane

+0

Jeśli jeszcze tego nie wypróbowałeś, możesz zobaczyć, czy coś tu masz. (Szczególnie komentarz 4 brzmiał obiecująco) tego linku http://code.google.com/p/selenium/issues/detail?id=687 . Pojawił się po losowym wyszukiwaniu. Bez gadżetów :) - – QVSJ

Powiązane problemy