recorrer - queryselectorall javascript
¿La capibara no reconoce elementos DOM agregados dinámicamente? (3)
Parece que tengo problemas para probar las cosas de javascript que hago con jQuery cuando uso Capybara y Selenium. El comportamiento esperado es que un formulario se genere dinámicamente cuando un usuario hace clic en el enlace "agregar recurso". Capybara podrá hacer clic en el enlace, pero no reconoce los nuevos elementos del formulario (es decir, "recurso [nombre]").
¿Hay alguna forma de volver a cargar el DOM para Capybara, o hay algún elemento de esta gema que aún no conozco?
¡Gracias por adelantado!
== Editar ==
Actualmente probando suerte con el selenio:
wait_for_element
método.
== Editar ==
Sigo obteniendo un "método indefinido ''wait_for_element` para nill class" cuando intento hacer lo siguiente:
@selenium.wait_for_element
Parece que ese método específico, o tal vez wait_for
con un selector enorme que accede al elemento DOM que espero, sea el curso de acción correcto, pero ahora intentar obtener la sesión de selenio está empezando a ser un gran dolor de cabeza.
De los documentos de Capybara:
Cuando trabaje con JavaScript asíncrono, puede encontrarse con situaciones en las que está intentando interactuar con un elemento que aún no está presente en la página. Capybara trata esto automáticamente esperando que aparezcan elementos en la página.
Puede que tengas algo de suerte aumentando el tiempo de espera:
Capybara.default_wait_time = 10
Si eso no funciona, entonces le insto a que se comunique con alguien del proyecto en GitHub, escriba a la lista de correo o envíe un informe de problemas.
Incluso wait_until eliminado de Capybara 2.0. Aún así es útil y toma el código de abajo:
def wait_until(delay = 1)
seconds_waited = 0
while ! yield && seconds_waited < Capybara.default_wait_time
sleep delay
seconds_waited += 1
end
raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield
end
Utilizo el controlador basado en Webdriver para Capybara en RSpec, que configuro y uso de esta manera y definitivamente manejará JS y no necesita una recarga del dominio. La clave es usar un wait_until y una condición que se cumplirá cuando su respuesta AJAX haya finalizado.
before(:each) do
select_driver(example)
logout
login(''databanks'')
end
def select_driver(example)
if example.metadata[:js]
Capybara.current_driver = :selenium
else
Capybara.use_default_driver
end
end
it "should let me delete a scenario", :js=>true do
select("Mysite Search", :from=>''scenario_id'')
wait_until{ page.has_content?(''mysite_searchterms'')}
click_on "delete"
wait_until{ !page.has_content?(''mysite_searchterms'')}
visit ''/databanks''
page.should_not have_content(''Mysite Search'')
end
También descubrí un truco para ralentizar el controlador de web anoche, de esta manera, si quieres ver las cosas en cámara lenta:
#set a command delay
require ''selenium-webdriver''
module ::Selenium::WebDriver::Remote
class Bridge
def execute(*args)
res = raw_execute(*args)[''value'']
sleep 0.5
res
end
end
end
Como lo mencionó alguien más, si está esperando un tiempo de espera para el elemento, podría considerar aumentar esto:
Capybara.default_wait_time = 10