0

我们的 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)。

使用 afind而不是 2ndwithin似乎可以解决问题:

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

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

非常感谢您的意见。

4

2 回答 2

1

块中的代码find根本不会被调用,因为find不支持将块传递给它。当find方法接受*args时不会抛出异常,但如果您传递无效参数,则不会执行足够彻底的参数解析以引发异常。

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

您还应该知道 Capybara 方法,例如默认为 2 秒的have_content等待。Capybara.default_wait_time

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

using_wait_time 5 do
  page.should have_content '1 of 2'
end
于 2013-05-16T21:29:29.033 回答
0

我也经历过这种情况......如果你在你的内心之前做一个发现,那么有效。查找 Ajax 等待加载 Ajax 请求。如果它没有加载,你会得到一个陈旧的元素引用或类似的东西。您可能还需要执行 .keydown () 来触发请求……如果我正在测试自动完成之类的东西,我必须这样做。

于 2013-05-16T14:59:45.170 回答