2012-05-15 44 views
23

Estoy usando Selenium 2.20 WebDriver para crear y administrar un navegador Firefox con C#. Para visitar una página, yo uso el siguiente código, el establecimiento de los tiempos de espera del controlador antes de visitar la URL:Selenium WebDriver - Cómo configurar el tiempo de espera de carga de página usando C#

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); // Set implicit wait timeouts to 5 secs 
driver.Manage().Timeouts().SetScriptTimeout(new TimeSpan(0, 0, 0, 5)); // Set script timeouts to 5 secs 
driver.Navigate().GoToUrl(myUrl); // Goto page url 

El problema es que a veces las páginas llevan siempre a la carga, y parece que el tiempo de espera predeterminado para una página se cargue usar el Selenium WebDriver es de 30 segundos, que es demasiado largo. Y no creo que los tiempos de espera que estoy configurando se apliquen a la carga de una página usando el método GoToUrl().

Así que estoy tratando de averiguar cómo configurar un tiempo de espera para cargar una página, sin embargo, no puedo encontrar ninguna propiedad o método que realmente funcione. El tiempo de espera predeterminado de 30 segundos también parece aplicarse a cuando hago clic en un elemento.

¿Hay alguna manera de configurar el tiempo de espera de carga de la página en un valor específico para que cuando llame al método GoToUrl() solo espere mi tiempo especificado antes de continuar?

+0

¿Estás seguro de que 'GoToUrl()' espera a que se cargue la página? Mi experiencia es que no. Pero eso es solo un sentimiento, no un hecho. –

+0

sí, estoy 100% seguro de que al llamar a GoToUrl() bloquea la ejecución hasta que la página está completamente cargada y he medido un tiempo de espera predeterminado de 30 segundos para llamar a este método, después de 30 segundos la ejecución continuará, y estoy intentando para reducir el tiempo de espera predeterminado de 30 segundos de alguna manera. – KabanaSoft

+0

he publicado una pregunta similar: http://stackoverflow.com/questions/11958701/what-is-the-best-approach-for-timeout-using-selenium-using-webdriver –

Respuesta

3

Con esto deberías poder declarar una espera explícitamente.

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(time in seconds)); 
wait.until(Your condition) 

también se puede cambiar el tiempo de espera implícita

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 

Creo que es la sintaxis de C#. (No estoy seguro)

En Ruby es

@driver.manage.timeouts.implicit_wait = 30 
@wait = Selenium::WebDriver::Wait.new(:timeout => 30) 
+1

esto no funcionará porque la ejecución está bloqueada por el método GoToUrl(), por lo que no puedo ejecutar ningún código hasta que el método se complete o agote el tiempo de espera, que por defecto parece ser de 30 segundos. Gracias por la respuesta sin embargo. – KabanaSoft

+2

, por lo que debe cambiar el tiempo de espera implícito: 'driver.Manage(). Timeouts(). ImplicitlyWait (TimeSpan.FromSeconds (5));' disminuya los 5 segundos a menos cantidad que desee. Eso afectará su tiempo de espera en el gotourl. – Amey

+1

también podría intentar 'wait.until (driver.Navigate(). GoToUrl (myUrl)); // Ir a la página url' donde se define explícitamente el tiempo de espera para ejecutar el comando gotoURL – Amey

0

tiempos de espera de carga de las páginas no se aplican en los enlaces .NET todavía. Con suerte lo serán pronto.

3

encontré la solución a este problema. Al crear un FirefoxDriver nuevo, hay sobrecargas en el constructor que le permiten especificar un tiempo de espera de comando que es el tiempo máximo para esperar cada comando, y parece estar funcionando al llamar al método GoToUrl():

driver = new FirefoxDriver(new FirefoxBinary(), profile, new TimeSpan(0, 0, 0, timeoutSeconds)); 

enlace a la documentación del constructor FirefoxDriver para referencia: http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/html/M_OpenQA_Selenium_Firefox_FirefoxDriver__ctor_2.htm

Espero que esto ayude a otra persona que se encuentra con este problema.

+0

he publicado una pregunta similar: http://stackoverflow.com/questions/11958701/what-is-the-best-approach-for-timeout-using-selenium-using-webdriver –

28

En caso de que esto ayude a cualquiera que todavía esté buscando la respuesta a esto, la API C# WebDriver ahora contiene el método apropiado.

driver.Manage().Timeouts().SetPageLoadTimeout(timespan) 
+3

Ojalá alguien tuviera una descripción clara de cómo el tiempo de espera de carga de la página difiere de la espera implícita. ¿Cuándo exactamente se carga una página pero no un elemento? – JasonCoder

+7

Desde C# intellisense, 'ImplicitlyWait' es la cantidad de tiempo que se busca un elemento en la página, 'SetPageLoadTimeout' es la cantidad de tiempo que se espera para cargar una URL, y 'SetScriptTimeout' es la cantidad de tiempo que se espera para async JS carga. – jpvantuyl

7
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5); 

Nota: driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)) ahora está en desuso.

Cuestiones relacionadas