2010-02-03 20 views
5

Estamos ejecutando Webrat con Selenium2.0 también conocido como WebDriver en nuestra aplicación.WebRat + Selenium WebDriver: espere a que se complete ajax

WebDriver maneja la página recargando muy bien y no inicia los siguientes pasos si el navegador está recargando toda la página. El problema es que este mecanismo no funciona con las solicitudes de Ajax. WebDriver no hace ningún uso inactivo cuando hay algo después de hacer clic() o cambiar().

¿Alguien puede sugerir cómo hacer que el disco web esté inactivo hasta el final de todas las solicitudes de ajax en la página?

Respuesta

3

Terminamos escribiendo una capa sobre el selenio que manejó este escenario envolviendo las llamadas en un bucle opcional. Así que cuando usted haría:

@browser.click "#my_button_id" 

sería hacer algo similar a lo que se sugirió anteriormente AutomatedTester:

class Browser 
    def click(locator) 
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT) 
    @selenium.click(locator) 
    end 

    def wait_for_element(locator, options) 
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT 
    selenium_locator = locator.clone 
    expression = <<EOF 
     var element; 
     try { 
     element = selenium.browserbot.findElement('#{selenium_locator}'); 
     } catch(e) { 
     element = null; 
     }; 
     element != null; 
EOF 
    begin 
     selenium.wait_for_condition(expression, timeout) 
    rescue ::Selenium::SeleniumException 
     raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'" 
    end 
    end 
end 

la envoltura también hizo otras cosas, como la de permitir la búsqueda por la etiqueta del botón/de entrada, etc. . (Así que el envoltorio no solo existía para los problemas de sincronización, esta fue solo una de las cosas que pusimos ahí.)

1

Disculpe mi Ruby, pero lo que debe hacer es intentar encontrar el objeto y si no está allí, solo espere a que vuelva. Lo que el código de abajo debe hacer es esperar bucle cada segundo durante un minuto tratando de ver si el conductor puede encontrar el elemento con el ID idOfElement y luego si se puede, no se debe lanzar un error

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 } 
+0

Sí, eso funcionaría pero tienes que especificar qué esperas en cada solicitud de Ajax . Creo que debería haber una mejor manera. –

0

A mtd separada (envoltorio) para comprobar el elemento con una espera debería ayudar.

Cuestiones relacionadas