Sukoshi. Fuzoroi

某フリーPGの技術っぽいブログ。

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