18
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Capybaraと仲良くなる(タブ・ウィンドウの操作について)

Posted at

別タブで開いた画面をテストする

※ここではタブ≒ウィンドウのニュアンス

別タブをスコープにして操作する方法

テスト実行しているカレントはそのままに別タブをスコープとして操作できる。
この方法だとテスト対象とするタブをスコープとして操作しているのでタブ間を行ったり来たりする操作、別タブを操作して元のウィンドウに戻る操作のときに対象がわかりやすい。

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)
18
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?