Railsのシステムテストで、別タブでページを開くボタンを押して、その先で何かを確認するテストを書きたいと思った時のメモです。
もしかしたら、思った挙動にならないかもしれないテスト
click_on '別タブでページを開くボタン' # 最後に開いたタブの中でテキストをチェックしたい within_window(windows.last) do assert_text 'あるか確認したいテキスト` end
テスト中のブラウザの動きを見ていると、これでうまく動いているように見えることもあるのですが、それはたまたまかも?という感じらしいです。
Get all opened windows. The order of windows in returned array is not defined. The driver may sort windows by their creation time but it's not required.
返り値のオブジェクト(開いたページ)の配列の順が、開いた順になることを完全に保証するものではないらしい。
ウィンドウを指定してそのページの中で何かを確認するコード
window = Capybara.window_opened_by do click_on '別タブでページを開くボタン' end within_window(window) do assert_text 'あるか確認したいテキスト` end
Capybara.window_opened_by
メソッドは、ブロック内の行為の処理によって開かれたウィンドウを返してくれるので、その返り値を使えば、確実に自分のテストしたいウィンドウにいける。
Get the window that has been opened by the passed block. It will wait for it to be opened (in the same way as other Capybara methods wait). It's better to use this method than windows.last as order of windows isn't defined in some drivers.
公式リファレンスにも、windows.last
よりこちらの方がいいよ、という添え書きがありますね。
switch_to_window(window)
とか、開いたタブのページに行く方法はいろいろありますが、とにかく確実にテストしたいタブがある場合はまずCapybara.window_opened_by
で指定しておこう、というイメージで理解しました。