如何使用capybara-webkit在AJAX调用之后等待元素出现?

时间:2014-07-09 09:05:34

标签: capybara capybara-webkit

水豚方法,wait_until似乎不适用于capybara-webkit。是否有任何替代解决方案或任何Javascript实现?

有意需要替换sleep,例如sleep 2

enter image description here

4 个答案:

答案 0 :(得分:6)

您可以查看Thoughtbot撰写的此解决方案:here

我发现它非常有用。

答案 1 :(得分:5)

如果你的AJAX调用导致对DOM的更改,那么如果你这样做,Capybara会等待它

page.should have_selector?("some selector")

它是一个有意的Capybara功能,它等待(Capybara.default_wait_timehave_selector?并且相关方法为真。

如果你的AJAX调用没有导致对DOM的更改,那么使用Capybara就无法在浏览器端等待它。您可能能够在Javascript中检测到AJAX调用何时完成并以某种方式将其传达给Capybara,但这会将您的测试和实现紧密地联系起来。在这种情况下,常见的方法是等待AJAX​​调用的服务器端效果(创建或更新或删除模型对象,发送电子邮件等)。由于Capybara无法看到服务器端,因此您必须等待服务器端自行更改。

在Capybara 1中,您可以使用Capybara的wait_until等待服务器端的更改。我从Capybara 2中删除了wait_until。我在my answerWhy does adding "sleep 1" in an after hook cause this Rspec/Capybara test to pass?

发布了wait_until的实施内容

答案 2 :(得分:0)

也许是这样的:

# AJAX BEGIN
  expect(page).to have_selector('form#new_user_video .submit > .throbber')
  expect(page).to_not have_selector('form#new_user_video .submit > .throbber')
  # AJAX END

手动输入你的js代码集' ajax:send' (追加悸动)和' ajax:成功' (删除throbber)。通过这种方式,您可以知道请求何时完成。

你应该为ajax设置足够的时间来完成:

Capybara.default_wait_time = 5

答案 3 :(得分:0)

我真的不需要期望,因为这不是我需要测试的东西。

这对我有用:

page.has_css?('.my-selector')
# or
page.has_content?('Some text on the page')

# continue with test