別タブで開いた画面をテストする
※ここではタブ≒ウィンドウのニュアンス
別タブをスコープにして操作する方法
テスト実行しているカレントはそのままに別タブをスコープとして操作できる。
この方法だとテスト対象とするタブをスコープとして操作しているのでタブ間を行ったり来たりする操作、別タブを操作して元のウィンドウに戻る操作のときに対象がわかりやすい。
click_on '別タブでページを開く'
# 最後に開いたタブを指定している
handle = page.driver.browser.window_handles.last
page.driver.browser.within_window(handle) do
expect(page).to have_content('この文字列が見つかるかな?')
click_on 'モーダルを開く'
expect(page).to have_content('別タブ内のモーダルなどの操作もできる')
click_on 'モーダルを閉じる'
end
click_on '別タブでページを開く'
# 最後に開いたタブを指定している
within_window(windows.last) do
expect(page).to have_content('この文字列が見つかるかな?')
click_on 'モーダルを開く'
expect(page).to have_content('別タブ内のモーダルなどの操作もできる')
click_on 'モーダルを閉じる'
end
別タブに移動して操作する方法
テスト実行しているカレントも別タブに移動して操作する。
なので元々操作していた画面をテストするにはタブ移動するかスコープ定義する必要がある。
行ったり来たりするテストを書くとどの画面をテストしているのかの可読性が低くなりそう😑
click_on '別タブでページを開く'
# 最後に開いたタブに移動している
switch_to_window(windows.last)
expect(page).to have_content('この文字列が見つかるかな?')
click_on 'モーダルを開く'
expect(page).to have_content('別タブ内のモーダルなどの操作もできる')
click_on 'モーダルを閉じる'
アラートウィンドウを操作する
テストではアラートウィンドウを表示・操作するケースもあります。
そんなときは下記のように操作します。
# OK操作
page.driver.browser.switch_to.alert.accept
# キャンセル操作
page.driver.browser.switch_to.alert.dismiss
画面サイズを指定する
自分が知っているのは以下の2パターン。
driverの違いがまだ理解できていない。。。😇
width = 400
height = 800
Capybara.current_session.driver.browser.manage.window.resize_to(width, height)
width = 400
height = 800
Capybara.page.driver.resize(width, height)