Capybara ne reconnaît pas les éléments DOM dynamiquement ajoutés?

Je semble avoir du mal à tester les javascript lisses que je fais avec jQuery lors de l'utilisation de Capybara et Selenium. Le comportement attendu consiste à générer dynamiquement un formulaire lorsqu'un utilisateur clique sur le lien «ajouter une ressource». Capybara pourra cliquer sur le lien, mais ne reconnaît pas les nouveaux éléments de formulaire (c.-à-d. «Ressource [nom]»).

Existe-t-il un moyen de recharger les DOM pour Capybara, ou y at-il un élément de cette gemme que je n'ai encore rien appris?

Merci d'avance!

== Modifier ==

En essayant actuellement ma chance avec le sélénium:

wait_for_element 

méthode.

== Modifier ==

Je continue d'obtenir une "méthode indéfinie" wait_for_element` pour nill class "lors de la tentative de faire ce qui suit:

 @selenium.wait_for_element 

Il semble que cette méthode spécifique, ou peut-être wait_for avec un sélecteur énorme qui accède à l'élément DOM que j'attends, c'est le bon plan d'action, mais maintenant, essayer d'obtenir la session de sélénium commence à être un énorme mal de tête.

J'utilise le pilote basé Webdriver pour Capybara dans RSpec, que je configure et j'utilise comme ça, et il va certainement gérer JS et n'a pas besoin de recharger le dom. La clé utilise un wait_until et une condition qui sera vraie lorsque votre réponse AJAX est terminée.

 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 

J'ai également découvert un hack pour ralentir le webdriver la nuit dernière, comme ça, si vous voulez regarder des choses en slo-mo:

  #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 

Comme quelqu'un d'autre l'a mentionné, si vous obtenez un délai d'attente pour l'élément, vous pourriez envisager de faire avancer ceci:

 Capybara.default_wait_time = 10 

Des documents Capybara:

Lorsque vous travaillez avec un JavaScript asynchrone, vous pouvez rencontrer des situations où vous essayez d'interagir avec un élément qui n'est pas encore présent sur la page. Capybara s'occupe automatiquement de cela en attendant que des éléments apparaissent sur la page.

Vous pourriez avoir du chance d'augmenter le temps d'attente:

 Capybara.default_wait_time = 10 

Si cela ne vous aide pas, je voudrais vous contacter pour contacter quelqu'un du projet sur GitHub, écrire à la liste de diffusion ou soumettre un rapport de problème.

Même wait_until supprimé de Capybara 2.0. C'est toujours utile et prenez le code ci-dessous:

  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