2012-05-25 31 views
18

Estoy probando un sitio con muchos proxies, y el problema es que algunos de estos proxies son terriblemente lentos. Por lo tanto, mi código se bloquea al cargar páginas de vez en cuando.¿Configurar un tiempo de espera real para cargar la página en Selenium WebDriver?

from selenium import webdriver 

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

He intentado un montón de cosas por el estilo explicit waits o implicit waits y estado buscando durante bastante tiempo, pero aún no han encontrado todavía una solución o solución. Nada parece afectar realmente a la línea de carga de la página browser.get("http://example.com/example-page.php"), y es por eso que siempre está atorada allí.

¿Alguien tiene una solución para esto?

Actualización 1: Respuesta

JimEvans' resuelto mi problema anterior, y here usted puede encontrar parche pitón para esta nueva característica.

nuevo problema:

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") 

Como se puede ver browser.set_page_load_timeout(30) sólo afecta browser.get("http://example.com/example-page.php") que significa que si esta página se carga durante más de 30 segundos que se van a lanzar hacia fuera una excepción de tiempo de espera, pero el problema es que no tiene poder sobre la carga de la página como element.click(), aunque no se bloquea hasta que la nueva página se carga por completo, another_element = browser.find_element_by_id("another_element") es el nuevo dolor en el culo, porque explicit waits o implicit waits esperarían a que toda la página se cargara antes de que comenzara a buscar ese elemento. En algunos casos extremos, esto tomaría incluso HORAS. ¿Qué puedo hacer al respecto?

Respuesta

12

Puede intentar usar el tiempo de espera de carga de la página introducido en la biblioteca. La implementación de la misma no es universal, pero está expuesta con seguridad por los enlaces .NET y Java, y se ha implementado en el controlador de Firefox ahora, y en el controlador de IE en el próximo 2.22. En Java, para establecer el tiempo de espera de carga de la página en 15 segundos, el código para establecer que se vería así:

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

Si no está expuesto en los enlaces de lenguaje Python, estoy seguro de que el mantenedor aceptaría con entusiasmo una parche que lo implementó.

+0

¡Genial! Sin duda una buena característica para tener. –

+0

@JimEvans: Gracias amigo, acabo de encontrar el parche de Python para este 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, y funciona muy bien. – Shane

+0

@JimEvans: Hola amigo, por favor revisa mi actualización. Hay un nuevo problema que me molesta. – Shane

0

Aún puede acelerar la ejecución de su script esperando la presencia (sin esperar visibilidad) del elemento esperado por ejemplo 5-8 segundos y luego el envío de window.stop() JS Script (para detener la carga de otros elementos) sin esperar toda la página para cargar o capturar la excepción de tiempo de espera para cargar la página después de 5-8 segundos y luego llamar a window.stop()

Porque si la página no adoptó la técnica de carga diferida (cargando solo el elemento visible y cargando el resto del elemento solo después del desplazamiento) carga cada elemento antes de devolver el estado de ventana.Replazado por lo que será más lento si alguno de los elementos tarda más tiempo en procesarse.

Cuestiones relacionadas