与 Capybara + Poltergeist 一起等待 AJAX

use*_*003 5 rspec capybara poltergeist ruby-on-rails-4

我见过该wait_for_ajax方法的各种实现,这些方法使 Capybara 等待所有 AJAX 请求完成后再继续。

我刚刚改用 Poltergeist 作为我的 JavaScript 驱动程序,但我无法让它等待 AJAX 完成测试(见下文)

下面是之前使用 Selenium 的实现 - 我唯一修改的是评估脚本 -

  • 以前的:page.evaluate_script("jQuery.active")
  • 更新:page.evaluate_script("$.active").to_i

如果我插入一条sleep语句,它就会通过,因为它有足够的时间来完成 AJAX 调用,所以我肯定知道这就是问题所在。

这种做法有什么错误吗?

谢谢!

it "user can log in", js: true do
  visit root_path
  click_tab("log-in")

  # Fill in form
  fill_in "user[email]", with: "al-horford@hawks.com"
  fill_in "user[password]", with: "sl4mdunkz"

  # Click submit and wait for AJAX
  within("#log-in") { click_button("Log In")) }
  wait_for_ajax

  # Expectations
  expect(current_path).to eq(home_index_path)
end

def wait_for_ajax
  Timeout.timeout(Capybara.default_max_wait_time) do
    loop until finished_all_ajax_requests?
  end
end

def finished_all_ajax_requests?
  request_count = page.evaluate_script("$.active").to_i
  request_count && request_count.zero?
rescue Timeout::Error
end
Run Code Online (Sandbox Code Playgroud)

小智 2

根据我的经验,有些情况 wait_for_ajax 不会等待。

在我们的应用程序中,我们有一个触发 Ajax 的“购物车”按钮。然后,它会在加载下一页之前等待回调事件。wait_for_ajax 不会获取此信息。

解决这个问题的方法,以及通常比使用 sleep() 等待给定时间更好的方法,是使用 Capybara 的等待查找器之一来验证您是否位于下一页。

只需更换expect(current_path).to eq(home_index_path)

与类似的东西expect(page).to have_content("content_home_page_should_have")

那应该有效。