capybara-webkit で javascript の alert の中味をチェックするときの注意
capybara-webkit でjsがらみのテストをするときにちょっとハマったので情報共有します。環境は Capybara, capybara-webkit, RSpec です。
例えば、フォームのバリデーションをjs側でも行っていて、エラーをアラートダイアログなどで出力する仕様のテストがあったとします。
アラートダイアログの文章は capybara-webkit の場合、下記のメソッドで取得できます。
page.driver.browser.alert_messages
この返り値は配列になっているので、例えば、2回テストを行った場合、2回目のアラートメッセージは配列の2番目 page.driver.browser.alert_messages[1] に入っています。
このことを知らなかったのでプチハマリしました…
あと、jsは非同期タイミングで走りますので、ダイアログが出る前にテストが走ってしまわないように、アサーションの前に sleep など入れて、少しまってやる必要があります。
なお、アラートダイアログの場合は、ダイアログが出ている(と思われる)状態から続けて次のテストにうつるときも、OKボタンを押すという動作を記述しなくても大丈夫なようです。
サンプルコードを下記に掲載します。
it '8文字未満のパスワードの更新に失敗する' do fill_in 'NewPassword', with: @password_less_than_8char fill_in 'NewPassword2', with: @password_less_than_8char click_button 'パスワード変更' sleep 1 expect(page.driver.browser.alert_messages[0]).to match(/ログインエラー/) end it '小文字のみのパスワードの更新に失敗する' do fill_in 'NewPassword', with: @password_lower_case fill_in 'NewPassword2', with: @password_lower_case click_button 'パスワード変更' sleep 1 expect(page.driver.browser.alert_messages[1]).to match(/ログインエラー/) end