2012-05-25 17 views
18

Testuję witrynę z dużą ilością serwerów proxy, a problemem jest to, że niektóre z tych serwerów są strasznie wolne. Dlatego mój kod utknął przy ładowaniu stron co jakiś czas.Ustawić prawdziwy limit czasu na ładowanie strony w Selenium WebDriver?

from selenium import webdriver 

browser = webdriver.Firefox() 
browser.get("http://example.com/example-page.php") 
element = browser.find_element_by_id("someElement") 

Próbowałem wiele rzeczy jak explicit waits lub implicit waits i zostały wyszukiwanie wokół na dłuższą chwilę, ale wciąż jeszcze nie znaleziono rozwiązania lub obejścia. Wydaje się, że nic nie wpływa na ładowanie strony linii browser.get("http://example.com/example-page.php") i dlatego zawsze tam utknęła.

Ktoś ma rozwiązanie tego problemu?

Aktualizacja 1: odpowiedź

JimEvans' rozwiązać mój poprzedni problem i here można znaleźć łatkę Pythona do tej nowej funkcji.

nowy problem:

browser = webdriver.Firefox() 
browser.set_page_load_timeout(30) 

browser.get("http://example.com/example-page.php") 

element = browser.find_element_by_id("elementA") 
element.click() ## assume it's a link to a new page http://example.com/another-example.php 

another_element = browser.find_element_by_id("another_element") 

Jak widać browser.set_page_load_timeout(30) wpływa tylko browser.get("http://example.com/example-page.php") co oznacza, jeśli ta strona ładuje przez ponad 30 sekund będzie wyrzucić wyjątek limitu czasu, ale problemem jest to, że nie ma ładowanie ponad ładowaniem strony, takie jak element.click(), chociaż nie blokuje się, dopóki nowa strona nie załaduje się całkowicie, another_element = browser.find_element_by_id("another_element") to nowy ból w dupie, ponieważ albo explicit waits lub implicit waits będzie czekać na załadowanie całej strony zanim zacznie szukać ten element. W skrajnych przypadkach wymagałoby to nawet HOURS. Co mogę z tym zrobić?

Odpowiedz

12

Możesz spróbować użyć limitu czasu ładowania strony wprowadzonego do biblioteki. Jego implementacja nie jest uniwersalna, ale jest na pewno widoczna dzięki powiązaniom .NET i Java, i została zaimplementowana w sterowniku Firefox i teraz w sterowniku IE w nadchodzącym 2.22. W języku Java, aby ustawić limit czasu ładowania strony do 15 sekund, kod ustawienie to będzie wyglądać następująco:

driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS); 

Jeśli nie jest narażony na wiązaniami języka Python, jestem pewien, że opiekun będzie chętnie akceptują łatka, która to zaimplementowała.

+0

Super! Z pewnością fajna funkcja. –

+0

@JimEvans: Dzięki kolego, właśnie znalazłem poprawkę dla Pythona dla tego http://code.google.com/p/selenium/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Stars%20Type% 20Status% 20Priority% 20Milestone% 20Owner% 20Summary & groupby = & sort = & id = 687 i działa świetnie. – Shane

+0

@JimEvans: Hej kolego, sprawdź moją aktualizację. Zaczyna mnie nurtować nowy problem. – Shane

0

Nadal można przyspieszyć wykonywanie skryptu, czekając na obecność (nie czekając na widoczność) oczekiwanego elementu, na przykład 5-8 sekund, a następnie wysyłając skrypt window.stop() JS (aby zatrzymać ładowanie kolejnych elementów) bez czekania na całą stronę, aby załadować lub przechwycić wyjątek timeout dla ładowania strony po 5-8 sekundach, a następnie wywoływać window.stop()

Ponieważ strona nie przyjęła techniki leniwego ładowania (ładowanie tylko widocznego elementu i ładowanie reszty elementu tylko po przewinięciu) ładuje każdy element przed zwróceniem window.ready stwierdza, więc będzie wolniej, jeśli dowolny element potrzebuje więcej czasu na renderowanie.

Powiązane problemy