如何让 Capybara/Poltergeist 等待 js 启动的导航完成?

How to make Capybara/Poltergeist wait for js initiated navigation to finish?

我有一个测试,用于检查在用户从自动完成建议中选择一个选项后,路径是否已更改。我正在 Poltergeist 上使用 Capybara 进行测试。但是,大概是因为我是通过 JS 触发页面更改,我现在必须使用睡眠语句来等待页面完成加载,这当然不理想。

这是js:

window.location.href = suggestion.url;

这是测试:

sleep 1# Allow the time to navigate
expect(current_path).to eq(arg1)

其中 arg1 是预期的页面 url。

睡眠时效果很好,但这不是最佳选择的原因很明显。如何让测试更智能,让它等待导航发生?

在新页面上测试某些内容(在您导航的页面上不存在的内容)并且 rspec 将继续寻找直到它出现(只要它在默认等待限制内) ,然后检查您的路径,例如先做这样的事

expect(page).to have_selector("a.testclass", text: "Some link on your new page")

然后你的路径测试:

expect(current_path).to eq(arg1)

不要将 eq 匹配器与 current_path 一起使用(实际上大多数水豚的东西),请使用 have_current_path 匹配器

expect(page).to have_current_path(arg1)

这将利用 Capybara

内置的自动 wait/retry 行为