当块传递给find()时,为什么Capybara不会引发异常,而当块传递给内部时,会引发一个异常

时间:2013-05-14 08:20:10

标签: ajax rspec capybara

我们的AJAX规范和within / find遇到了一些麻烦。

我想做以下事情:

it 'allows to load more search results if there are any', focus: true, js: true do
  fill_in 'search_term', with: '*'
  click_button 'Search projects' # Sends a POST request

  within 'table.projects' do
    page.should have_content '1 of 2'
    click_link 'Load more' # Sends an AJAX request
  end

  within 'table.projects' do
    page.should have_content '2 of 2'
    page.should have_link('Load more', visible: false)
  end
end

可悲的是,这不起作用,因为第二个within似乎不等待AJAX​​调用完成,而第一个似乎等待“正常”POST请求(非AJAX)

使用find代替第二个within似乎可以解决问题:

it 'allows to load more search results if there are any', focus: true, js: true do
  fill_in 'search_term', with: '*'
  click_button 'Search projects' # Sends a POST request

  within 'table.projects' do
    page.should have_content '1 of 2'
    click_link 'Load more' # Sends an AJAX request
  end

  find 'table.projects' do # find instead of within here!
    page.should have_content '2 of 2'
    page.should have_link('Load more', visible: false)
  end
end

在测试涉及AJAX请求的内容时,使用within通常是个坏主意吗?为什么我应该使用within而不是find,因为find似乎与within 等待AJAX​​一样? !

非常感谢您的意见。

2 个答案:

答案 0 :(得分:1)

find块内的代码根本不会被调用为find doesn't support passing block to it。由于find方法接受*args但未执行足够的参数解析以在传递无效参数时抛出异常,因此不会引发异常。

为了让您的第二个示例正常工作,您可以尝试将Capybara更新为2.1,因为Capybara 2.0和2.1中的自动等待得到了改善。

此外,你应该知道像have_content这样的水豚方法等待Capybara.default_wait_time默认为2秒。

如果您想等待更多时间,可以修改Capybara.default_wait_time或使用using_wait_time method

using_wait_time 5 do
  page.should have_content '1 of 2'
end

答案 1 :(得分:0)

我也经历过这个......如果你在内心之前做了一个发现,那么有效的方法是什么。查找Ajax等待加载Ajax请求。如果它没有加载,你将获得陈旧的元素引用或类似的东西。 您还可能需要执行.keydown()来触发请求...这就是我在测试自动完成时需要做的事情。