2012-07-07 20 views
8

Estoy intentando escribir una prueba simple. Mi problema es que quiero esperar hasta que la página se cargue por completo. En este momento estoy esperando hasta que algunos elementos estén presentes, pero eso no es realmente lo que quiero. ¿Es posible hacer algo como esto:selenium-webdriver y aguarde a que cargue la página

driver = Selenium::WebDriver.for :chrome 
driver.navigate.to url 
driver.wait_for_page_to_load "30000" 

Con Java no es un problema, pero la forma de hacerlo con el rubí?

Respuesta

13

Esta es la forma en la Selenium docs() sugieren:

require 'rubygems' 
require 'selenium-webdriver' 

driver = Selenium::WebDriver.for :firefox 
driver.get "http://google.com" 

element = driver.find_element :name => "q" 
element.send_keys "Cheese!" 
element.submit 

puts "Page title is #{driver.title}" 

wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
wait.until { driver.title.downcase.start_with? "cheese!" } 

puts "Page title is #{driver.title}" 
driver.quit 

Si eso no es una opción que puede probar la sugerencia de this SO post aunque requeriría algo de JavaScript en la parte superior de la Rubí/rieles.

Parece que wait.until está siendo/ha sido eliminado. El nuevo proceso que se sugiere que se vea que la página tiene un elemento sabes estará allí:

expect(page).to have_selector '#main_div_id' 
+0

he utilizado el ejemplo de los documentos del selenio se ha vinculado a este y trabajó para mí. Muchas gracias. – chucknor

5

Por lo que yo entiendo WebDriver, usted no necesita esperar a que cargue la página, porque WebDriver tiene un blocking API pero se puede Asegúrese de establecer un tiempo de espera de carga de página.

driver.manage.timeouts.page_load = 10 # seconds 
2

Ya no es necesario con WebDriver.

WebElement, haga clic en() y en Acciones, haga clic en() tanto "esperar la carga de la página" si es necesario automáticamente.

Puede esperar de forma implícita y explícita (en este orden) esperar (descrito en seleniumhq) si necesita esperar algún contenido ajax, por ejemplo.

2

Por lo tanto, en Ruby, siempre que utilice get para abrir una URL, el script de ruby ​​SÓLO se inicia cuando la página se carga por completo.

Así, en su caso sólo tendría que hacer: -

driver.get url 
+1

Lo pensé así, pero la documentación de Webdriver dice: "Dependiendo de varios factores, incluida la combinación de OS/Navegador, WebDriver puede o no esperar a que se cargue la página. En algunas circunstancias, WebDriver puede devolver el control antes de que la página haya terminado, o incluso comenzó, cargando. Para garantizar la robustez, debe esperar a que los elementos existan en la página utilizando Esperas explícitas e implícitas ". – Umang

+1

Desde mi experiencia, Webdriver definitivamente no siempre espera a que todo se cargue, especialmente cuando se carga contenido usando AJAX. Definitivamente use una espera. – bsg

+1

Puedo confirmar con datos cargados de ajax que es absolutamente necesario esperar. – Kylee

1

Ha habido casos en los que sea AJAX o cambios CSS causaron mis pruebas a fallar a veces. Agregué estos métodos a mi instancia de controlador estático para que la prueba pueda esperar ciertas condiciones si es necesario. (C#)

TimedWait en el método WaitForCssChange es básicamente solo Threading.Thread.Sleep Esta no es la manera más hermosa que supongo, pero funciona bien para mis necesidades.

Por Ajax espera:

public static void WaitForAjax() 
    { 
     var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(25)); 
     wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0")); 
    } 

por cambios CSS:

public static void WaitForCssChange(IWebElement element, string value) 
    { 
     int counter = 0; 
     while (true) 
     { 
      if(element.GetAttribute("style").Contains(value) || counter > 50) 
      { 
       break; 
      } 
      TimedWait(20); 
      counter++; 
     } 
    } 
Cuestiones relacionadas