valor recorrer queryselectorall queryselector que por obtener name elementos elemento ejemplos div dentro con buscar javascript ruby-on-rails dom integration-testing capybara

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