2012-01-25 17 views
15

rspecを実行すると、capybara/seleniumにjavascript console.errorsとその他の例外をrspecに報告させることは可能ですか?Rspec/Capybara/Seleniumを使用してjavascript console.errorsを端末に出力する方法はありますか?

私は一揃いのテストに失敗しましたが、手動でテストするとアプリケーションが動作しています。テスト中に私のシングルページのWebアプリケーションをブロックする可能性が高いjavascriptエラーを知らなければ、テストが失敗している理由を理解することは本当に難しいです。

私はこれを見回し、実際にこれに対する解決策を見つけることはできませんでした。

答えて

3

これは助けになるか分かりませんが、thinkbotのcapybara-webkitドライバに切り替えてみてください。これは、ヘッドレスのセレンの代替品です。つまり、テストを実行するブラウザを開かないということです。このドライバを使ってテストを実行すると(RSpec + Capybaraの設定で)、すべてのJavascriptエラーがRSpec出力にインラインで出力されます。

私はSeleniumからcapybara-webkitへの切り替えを試みたことはありません。そのため、これは既存のプロジェクトでどの程度実現可能かわかりません。 Seleniumで本当に素晴らしいことをやっていないのであれば、移行はかなりスムーズかもしれません。しかし、ブラウザで実行中のテストを見ることができるかどうかに依存している場合、またはセレンの他の特定の必要性がある場合、私の答えは不幸にもあまり使用されません。

あなたがここにカピバラ-のWebKitを見つけることができます:あなたはQt4をライブラリが必要になりますので、それはhttps://github.com/thoughtbot/capybara-webkit

設置にあたっては、痛みかもしれません。あなたのシステムにまだQt4を持っていないのであれば、ビルドプロセスはになります。時間です。私のために、それは問題の価値があった。私は、私が試した他の解決策にcapybara-webkitを好んでいます。

+0

私はcapybara-webkitで常緑色の宝石を使用します。解析の問題を除いて、問題なく動作しているようです。 –

6

これはあまり美しいものではありませんが、エラーをDOMに送り、その変更をSelenium経由で監視するスクリプトを挿入することができます。

具体的には、各ページに、window.onerrorまたはconsoleを上書きするスクリプトを挿入して、エラーがDOMに注入した隠れたノードに情報を追加するようにします。その後、Seleniumを介して定期的にその要素の内容をチェックして空にし、空のデータをJavaコンソールに出力します。

+1

少し複雑です。私は、誰かがすでにこれをしていたと考えました。しかし、ありがとう。 –

12

この要点の末尾にコードサンプルがあります。https://gist.github.com/gkop/1371962(alexspellerのもの)は、私にとって非常にうまく機能しました。

は、私はレオに似た何かをやっている

after(:each) do 
    errors = page.driver.browser.manage.logs.get(:browser) 
    if errors.present? 
    message = errors.map(&:message).join("\n") 
    puts message 
    end 
end 
+1

私が参考にした別の変形: 'expect(page.driver.browser.manage.logs.get(:browser).select {| m | m.level == 'SEVERE'}。length).to eq( 0) ' – Julie

1

をデバッグしようとしていたJSテストのコンテキストでこれをやってますが、テストの失敗メッセージの一部として、ブラウザのログを含むことになりました。

def check_browser_logs_after_each_test(rspec_config) 
    rspec_config.before(:each) { 
    @prev_browser_logs = @browser.driver.manage.logs.get(:browser) 
    } 

    rspec_config.after(:each) { 
    logs = @browser.driver.manage.logs.get(:browser) 
    new_logs = logs - @prev_browser_logs 
    if example.exception then 
     s = new_logs.map { |l| l.to_s }.join("\n") 
     example.exception.message << "\nConsole logs:\n#{s}" 
    else 
     new_logs.should eq [ ] 
    end 
    } 
end 
4

現在のところ、SeleniumとヘッドレスChrome(Firefoxでも動作するはずです)で動作する別の方法です。

spec/rails_helper.rbに、RSpec.configure do |config|ブロック内に次を追加すると、js: trueメタデータのすべての機能仕様にJSエラーが表示されます。

class JavaScriptError< StandardError; end 
RSpec.configure do |config| 
    config.after(:each, type: :feature, js: true) do |spec| 
    errors = page.driver.browser.manage.logs.get(:browser) 
       .select {|e| e.level == "SEVERE" && e.message.present? } 
       .map(&:message) 
       .to_a 
    if errors.present? 
     raise JavaScriptError, errors.join("\n\n") 
    end 
    end 
end 

コードは、thisの順応です。

関連する問題