¿Cómo puedo implementar wait_for_page_to_load en Selenium 2?

Soy nuevo en las pruebas web automatizadas y actualmente estoy migrando de una antigua implementación de Selenium RC a Selenium 2 en Ruby. ¿Hay una manera de detener la ejecución de comandos hasta que la página se cargue, similar a ” wait_for_page_to_load ” en Selenium RC?

Intenta usar Javascript para informarte!

Creé un par de métodos que verifica a través de nuestras bibliotecas de javascript y espera para ver si la página ha terminado de cargar el DOM y que todas las solicitudes de ajax están completas. Aquí hay un fragmento de muestra. El javascript que necesitará usar solo dependerá de su biblioteca.

 Selenium::WebDriver::Wait.new(:timeout => 30).until { @driver.execute_script("[use javascript to return true once loaded, false if not]"} 

Luego envolví estos métodos en un método clickAndWait que hace clic en el elemento y llama a waitForDomLoad y waitForAjaxComplete. En buena medida, el siguiente comando después de un clickAndWait suele ser un waitForVisble elemento waitForVisble para garantizar que estamos en la página correcta.

 # Click element and wait for page elements, ajax to complete, and then run whatever else def clickElementAndWait(type, selector) @url = @driver.current_url clickElement(type, selector) # If the page changed to a different URL, wait for DOM to complete loading if @driver.current_url != @url waitForDomLoad end waitForAjaxComplete if block_given? yield end end 

Resolví muchos problemas que tenía en ese departamento al agregar esta línea después de iniciar mi controlador

 driver.manage.timeouts.implicit_wait = 20 

Básicamente, esto hace que cada llamada fallida del controlador vuelva a intentarlo durante un máximo de 20 segundos antes de lanzar una excepción, que suele ser suficiente para que su AJAX termine.

Si está usando capybara , siempre que esté probando page.should have_content("foo") , capybara no fallará instantáneamente si la página no tiene el contenido (aún) pero esperará un rato para ver si una llamada ajax va a cambiar eso

Básicamente, después de click , desea comprobar de inmediato el contenido de have_content("some content that is a consequence of that click") .