Capybara没有等待ajax请求完成

时间:2011-11-02 14:10:52

标签: ajax ruby-on-rails-3 cucumber capybara

我正在尝试测试从select标签中选择一个选项(这些选项是从远程数据库服务器获取的)。在与网站正常交互期间,填充此下拉列表的时间不会超过几分之一秒。但是,当我运行以下测试时,



    When /^(?:|I )select "([^"]*)" from "([^"]*)" in search form$/ do |value, field|
      within "#select_container" do
        save_and_open_page
        page.should have_css("#criteria_div_code > option:nth-child(10)")
        select(value, :from => field)
      end 
    end


我收到以下错误,

expected css "#criteria_div_code > option:nth-child(10)" to return something (RSpec::Expectations::ExpectationNotMetError)

下拉列表中至少包含20个选项,因此我只测试第10个选项的存在(暂时)。

save_and_open_page表示只存在一个选项(默认选项)而不是至少10个,因此出现“ExpectionNotMetError”。

Capybara.default_wait_time = 30 - 充足的时间来填充列表。

是不是capybara等待ajax呼叫完成?

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您可能想要检查我对ajax重新同步Using Capybara for AJAX integration tests的设置超时的响应。重新同步超时默认为10秒,如果您的响应在此之前未返回,则不会得到任何响应,尤其是在配置中已将set:resynchronize设置为false时。下面是设置超时的片段

 Capybara.register_driver :selenium do |app|
   Capybara::Selenium::Driver.new(app, :browser => :firefox, :resynchronization_timeout => 1000)
 end

注意:如果您之前设置:resynchronize为false,则需要将其设置为true。

答案 1 :(得分:0)

我猜你需要使用js驱动程序进行ajax测试,

describe 'some stuff which requires js', :js => true do
  it 'will use the default js driver'
  it 'will switch to one specific driver', :driver => :celerity
end

另请注意以下行 - Capybara可以在您与页面进行交互后阻止并等待Ajax请求完成。要启用此行为,请将:resynchronize驱动程序选项设置为true。