2013-07-08 20 views
27

Próba znalezienia dobrego sposobu na ustawienie maksymalnego czasu opóźnienia wykonywania polecenia w Selenium Python WebDriver. Idealnie byłoby coś takiego:Jak ustawić domyślny limit czasu Selenium Python WebDriver?

my_driver = get_my_driver() 
my_driver.set_timeout(30) # seconds 
my_driver.get('http://www.example.com') # stops/throws exception when time is over 30  seconds 

będzie działać. Znalazłem .implicitly_wait(30), ale nie jestem pewien, czy powoduje pożądane zachowanie.

Jeśli jest to przydatne, w szczególności korzystamy z WebDriver dla przeglądarki Firefox.

EDIT

Zgodnie użytkownika @ Amey odpowiedzi, to może być przydatne:

ff = webdriver.Firefox() 
ff.implicitly_wait(10) # seconds 
ff.get("http://somedomain/url_that_delays_loading") 
myDynamicElement = ff.find_element_by_id("myDynamicElement") 

Jednak to nie jest dla mnie jasne, czy domniemane oczekiwania dotyczy zarówno get (która jest pożądana funkcjonalność) i do find_element_by_id.

Dziękuję bardzo!

+1

musiałem spojrzeć na kodzie źródłowym. Jest niejasne dla wiązania Pythona. Ale dla C# 'ImplicitlyWait' działa tylko dla' FindElement/FindElements' (to samo dla Javy). Źródło: [1] (https://code.google.com/p/selenium/source/browse/dotnet/src/WebDriver/ITimeouts.cs#48) [2] (https://code.google.com/ p/selen/problemy/szczegóły? id = 5092) –

+0

Dzięki. Zobacz moją odpowiedź poniżej, jeśli jesteś zainteresowany. –

Odpowiedz

64

pythonowa sposób, aby utworzyć czas oczekiwania na wczytanie strony jest:

driver.set_page_load_timeout(30) 

to rzuci TimeoutException gdy obciążenie strona trwa dłużej niż 30 sekund.

+2

To nie działa ze sterownikiem Chrome. – sorin

+1

Chcesz zdobyć więcej informacji lub dokonać edycji? –

4

Informacje na temat jawnych i niejawnych czeków można znaleźć here.

UPDATE

w Javie widzę to, w oparciu o this:

WebDriver.Timeouts pageLoadTimeout(long time, 
           java.util.concurrent.TimeUnit unit) 

Sets the amount of time to wait for a page load to complete before throwing an error. If the timeout is negative, page loads can be indefinite. 

Parameters: 
    time - The timeout value. 
    unit - The unit of time. 

Nie wiesz ekwiwalentu Pythona.

3

Najlepszym sposobem jest ustawienie preferencji:

fp = webdriver.FirefoxProfile() 
fp.set_preference("http.response.timeout", 5) 
fp.set_preference("dom.max_script_run_time", 5) 
driver = webdriver.Firefox(firefox_profile=fp) 

driver.get("http://www.google.com/") 
+0

Czy zwraca jakiś błąd? –

+0

@ivan_bilan: Jeśli masz na myśli 'Exeption', nie, to nie zwraca żadnego –

+0

' dom.max_script_run_time' ustawia limit czasu dla wykonywania javascript. To nie jest pełny limit czasu dla serwisu pageload. –

1

Moje rozwiązanie było uruchomić asynchronicznego wątku obok przypadku obciążenia przeglądarka i go zamknąć przeglądarkę i ponownie wywołać funkcję ładowania, jeśli nie było koniec czasu.

#Thread 
def f(): 
    loadStatus = true 
    print "f started" 
    time.sleep(90) 
    print "f finished" 
    if loadStatus is true: 
     print "timeout" 
     browser.close() 
     call() 

#Function to load 
def call(): 
    try: 
     threading.Thread(target=f).start() 
     browser.get("http://website.com") 
     browser.delete_all_cookies() 
     loadStatus = false 
    except: 
     print "Connection Error" 
     browser.close() 
     call() 

call() jest funkcją, która właśnie

Powiązane problemy