我们的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一样? !
非常感谢您的意见。
答案 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()来触发请求...这就是我在测试自动完成时需要做的事情。