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

kel*_*unn 17 javascript integration-testing dom ruby-on-rails capybara

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

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

提前致谢!

== ==编辑

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

wait_for_element 
Run Code Online (Sandbox Code Playgroud)

方法.

== ==编辑

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

@selenium.wait_for_element
Run Code Online (Sandbox Code Playgroud)

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

ebe*_*and 17

我在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
Run Code Online (Sandbox Code Playgroud)

如果你想在慢动作中看东西,我昨晚也想出了一个能够减速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  
Run Code Online (Sandbox Code Playgroud)

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

Capybara.default_wait_time = 10
Run Code Online (Sandbox Code Playgroud)

  • `wait_until`已从Capybara 2.0.0中删除.[见这篇博文](http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara) (4认同)

tho*_*edb 7

来自Capybara文档:

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

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

Capybara.default_wait_time = 10
Run Code Online (Sandbox Code Playgroud)

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

  • +1在这里.Capybara使用这个默认的等待时间进行方法调用,例如`has_selector?``has_css?`等等.所以你可以使用这些方法来等待元素出现,使用类似:`has_css?("a#myinput",:visible => true)`这将等到元素出现在屏幕上然后继续. (3认同)