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")
那应该有效。
| 归档时间: |
|
| 查看次数: |
5448 次 |
| 最近记录: |