結論
page.driver.browser.manage.logs.get(:browser)
調べた経緯
フォームの text input に対する fill
が働かないのでどうしたかと思い、Selenium で操作中のブラウザをのぞいてみると React の component が一切 render されていなかった。
どこかで JavaScript の error が起きているだろうとと思ったがブラウザの console を確認する方法がわからず調べた。
visit 直後に binding.pry を張り、このワンライナーで確認したところたしかに js error で死んでいた。csrf_meta_tag
で生成される meta tag から CSRF token を js 側から取り出そうとしているが、そもそもその要素が DOM tree 内に存在せずにエラーになる、というものだった。
たしかにテスト時の環境では CSRF チェックを無効にするよう config/environments/test.rb
で以下のように設定しているのでわかればどうということはない問題だった。
# config/environments/test.rb config.action_controller.allow_forgery_protection = false
しかし、直接の原因はクライアントサイドの js にあっても RSpec の failure message 上は Element Not Found
で失敗しているので何が起きているか突き止めるのに結構悩んでしまった。
環境
- capybara 2.18.0
- selenium-webdriver 3.10.0
- Selenium と Chrome は selenium/standalone-chrome-debug:3.6.0 image を使用
(追記)
記事を書いた後に見つけたのだが、以下の記事では SEVERE レベルの js error が起きた場合にテストを fail させる方法を紹介している。これは良いかも。