my_back_pages

プログラミング学習の記録 Ruby / Rails / FjordBootCamp

【Rails】Capybaraのwindows.lastで得られるウィンドウは、必ずしも最後に開いたものにならない可能性がある

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.

www.rubydoc.info

返り値のオブジェクト(開いたページ)の配列の順が、開いた順になることを完全に保証するものではないらしい。

ウィンドウを指定してそのページの中で何かを確認するコード

window = Capybara.window_opened_by do
  click_on '別タブでページを開くボタン'
end

within_window(window) do
  assert_text 'あるか確認したいテキスト`
end

Capybara.window_opened_byメソッドは、ブロック内の行為の処理によって開かれたウィンドウを返してくれるので、その返り値を使えば、確実に自分のテストしたいウィンドウにいける。

www.rubydoc.info

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で指定しておこう、というイメージで理解しました。