LoginSignup
9
3

More than 3 years have passed since last update.

Selenium + Capybaraで target="_blank" をテストする

Last updated at Posted at 2019-09-16

困ったこと

タイトルの通り、Selenium + RSpec + Capybara でRailsアプリのテスト自動化をしている際、

<a href="https://www.sample.com/xxxxx" id="link" target="_blank">リンク</a>

のようにクリックしたら別タブでhrefにアクセスするコードがあり、クリックしたら別タブでそのページに遷移しているかを検証したかった。

色々調べたところ、within_windowを使う例が多く出てきたのですが、もともと非推奨だったらしく今ではSelenium的にundefinedになっており使えないようだったので別の方法を模索。

解決方法

swith_toというメソッドを利用することで解決しました。
以下、ソースコード例です。

scenario "xxxxx" do
  visit root_path
  click_on :link

  # 全てのタブを取得
  windows = page.driver.browser.window_handles

  # 最後に開いたタブに移動=リンククリックで開いたタブ
  page.driver.browser.switch_to.window(windows.last)

  # URLを検証(ここは自由に検証を)
  expect(current_url).to eq "https://www.sample.com/"

  # 現在表示中のタブ=リンククリックで開いたタブをクローズ(これをしないとゴミのタブがたまる)
  page.driver.browser.close

  # 元いたタブに戻る
  page.driver.browser.switch_to.window(windows.first)

end

Troubleshooting: invalid session id

テストしていると高い頻度で、

Selenium::WebDriver::Error::InvalidSessionIdError:
invalid session id

でNGになってしまう。メモリ不足とかが原因らしい。ウィンドウサイズの設定を変更したらうまくいったという人もいるがうまく行かない。
そして気づいた。a要素にhrefが正しく設定されていて、target_blankが設定されていれば、まぁよしとできるんじゃないかと。

scenario "xxxxx" do
  visit root_path
  expect(find("a#link")[:href]).to eq "https://www.sample.com/xxxxx"
  expect(find("a#link")[:target]).to eq "_blank"
end

画面操作ができているわけではないが、どうしてもの場合はこれで応急処置できそう。

Reference

9
3
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
9
3