Capybara无法识别动态添加的DOM元素?

在使用Capybara和Selenium时,我似乎无法测试使用jQuery进行的光滑javascript操作。 预期的行为是当用户单击链接“添加资源”时动态生成表单。 Capybara将能够单击该链接,但无法识别新的表单元素(即“resource [name]”)。

有没有办法为Capybara重新加载DOM,或者我还没有学到这个gem的某些元素?

提前致谢!

== ==编辑

目前我正在尝试与selenium的运气:

wait_for_element 

方法。

== ==编辑

在尝试执行以下操作时,我一直在为“nill类”获取“未定义的方法’wait_for_element`”:

 @selenium.wait_for_element 

似乎那个特定的方法,或者也许是wait_for ,一个巨大的选择器访问我期望的DOM元素是正确的行动方案,但现在试图让selenium会话开始成为一个巨大的麻烦。

我在RSpec中使用基于Webdriver的Capybara驱动程序,我这样配置和使用它肯定会处理JS并且不需要重新加载dom。 关键是使用wait_until和一个条件,当你的AJAX响应完成时它将成立。

 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 

如果你想在慢动作中看东西,昨晚我也想出了一个能够减速webdriver的黑客攻击:

  #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 

正如其他人提到的那样,如果你正在等待该元素超时,你可以看一下这个:

 Capybara.default_wait_time = 10 

来自Capybara文档:

使用异步JavaScript时,您可能会遇到尝试与页面上尚不存在的元素进行交互的情况。 Capybara通过等待页面上显示的元素自动处理此问题。

你可能会有一些运气来增加等待时间:

 Capybara.default_wait_time = 10 

如果这没有用,那么我会邀请你联系GitHub项目的某人,写信给邮件列表或提交问题报告。

甚至wait_until也从Capybara 2.0中删除了。 仍然有用并从下面获取代码:

  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