2012-01-25 171 views
15

當我運行rspec時,是否有可能讓水豚/硒報告任何javascript console.errors和其他異常返回到rspec?有沒有辦法打印javascript console.errors到Rspec/Capybara/Selenium的終端?

我有一大堆測試失敗,但我的應用程序工作時,我手動測試它。如果不知道在測試過程中可能會阻止我的單頁Web應用程序的JavaScript錯誤,則很難弄清楚爲什麼測試失敗。

我環顧四周,並沒有真正能夠找到解決方案。

回答

3

我不知道這是否會有所幫助,但可以嘗試切換到thinkbot的capybara-webkit驅動程序。這是Selenium的一個替代品,它是無頭的,這意味着它不會打開瀏覽器來運行測試。當我使用此驅動程序運行測試時(在RSpec + Capybara安裝程序中),所有Javascript錯誤都將與RSpec輸出一起打印。

我從來沒有嘗試從Selenium切換到capybara-webkit,所以我不知道這對現有項目是多麼可行。如果你對Selenium沒有什麼特別的想法,那麼過渡可能會非常順利。但是,如果你依賴於能夠觀察在瀏覽器中運行的測試,或者對Selenium有其他特定需求,那麼我的答案不會太有用。

你可以在這裏找到水豚,WebKit的:https://github.com/thoughtbot/capybara-webkit

獲取安裝它可能是一個痛苦的,因爲你需要的Qt4函數庫。如果您的系統中尚未安裝Qt4,則構建過程可能需要多長時間。對我來說,這是非常值得的麻煩。我更喜歡capybara-webkit到我試過的任何其他解決方案。

+0

我使用常綠寶石與水豚-webkit。除了一些解析問題,它似乎工作正常。 –

6

這並不美觀,但您可以注入一個腳本來將錯誤導入DOM並通過Selenium監視這些更改。

更具體地說,在每個頁面中插入一個替代window.onerrorconsole的腳本,以便將錯誤信息附加到您注入DOM的某個隱藏節點。然後,通過Selenium,定期檢查並清空該元素的內容,將清空的數據打印到Java控制檯。

+1

有點太複雜。我覺得有人已經這樣做了。不過謝謝。 –

12

在這個要點https://gist.github.com/gkop/1371962(來自alexspeller的)的末尾有一個代碼示例,它對我來說工作得非常好。

我結束了在JS測試中,我試圖調試

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'}} .to eq( 0)' – Julie

1

我在做類似的東西獅子座的情況下這樣做,但包括瀏覽器日誌,測試失敗消息的一部分:

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

這裏是另一種方式,目前正與硒和鉻無頭(也應該與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的修改。

相關問題