如何让 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 行为
我有一个测试,用于检查在用户从自动完成建议中选择一个选项后,路径是否已更改。我正在 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 行为