WebRat+Selenium WebDriver: espere a que ajax se complete
(3)
Disculpa a mi Ruby, pero lo que tienes que hacer es intentar encontrar el objeto y, si no lo está, esperar a que vuelva. Lo que el siguiente código debería hacer es esperar el bucle cada segundo durante un minuto para ver si el controlador puede encontrar el elemento con el ID idOfElement
y luego, si no puede, lanzar un error.
assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 }
Estamos ejecutando Webrat con Selenium2.0 también conocido como WebDriver en nuestra aplicación.
WebDriver maneja la página recargando muy bien y no comienza los próximos 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 ajax en la página?
Un mtd (contenedor) separado para verificar el elemento con una espera debería ser de ayuda.
Terminamos escribiendo una capa sobre el selenio que manejó este escenario envolviendo las llamadas en un bucle opcional. Entonces cuando lo harías:
@browser.click "#my_button_id"
Haría algo similar a lo que AutomatedTester sugirió anteriormente:
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
el envoltorio también hizo otras cosas, como permitir buscar por el botón / etiqueta de entrada, etc. (por lo que el envoltorio no solo existía para los problemas de temporización, esta fue solo una de las cosas que pusimos ahí).