困ったこと
タイトルの通り、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
画面操作ができているわけではないが、どうしてもの場合はこれで応急処置できそう。