當我運行rspec時,是否有可能讓水豚/硒報告任何javascript console.errors和其他異常返回到rspec?有沒有辦法打印javascript console.errors到Rspec/Capybara/Selenium的終端?
我有一大堆測試失敗,但我的應用程序工作時,我手動測試它。如果不知道在測試過程中可能會阻止我的單頁Web應用程序的JavaScript錯誤,則很難弄清楚爲什麼測試失敗。
我環顧四周,並沒有真正能夠找到解決方案。
當我運行rspec時,是否有可能讓水豚/硒報告任何javascript console.errors和其他異常返回到rspec?有沒有辦法打印javascript console.errors到Rspec/Capybara/Selenium的終端?
我有一大堆測試失敗,但我的應用程序工作時,我手動測試它。如果不知道在測試過程中可能會阻止我的單頁Web應用程序的JavaScript錯誤,則很難弄清楚爲什麼測試失敗。
我環顧四周,並沒有真正能夠找到解決方案。
我不知道這是否會有所幫助,但可以嘗試切換到thinkbot的capybara-webkit驅動程序。這是Selenium的一個替代品,它是無頭的,這意味着它不會打開瀏覽器來運行測試。當我使用此驅動程序運行測試時(在RSpec + Capybara安裝程序中),所有Javascript錯誤都將與RSpec輸出一起打印。
我從來沒有嘗試從Selenium切換到capybara-webkit,所以我不知道這對現有項目是多麼可行。如果你對Selenium沒有什麼特別的想法,那麼過渡可能會非常順利。但是,如果你依賴於能夠觀察在瀏覽器中運行的測試,或者對Selenium有其他特定需求,那麼我的答案不會太有用。
你可以在這裏找到水豚,WebKit的:https://github.com/thoughtbot/capybara-webkit
獲取安裝它可能是一個痛苦的,因爲你需要的Qt4函數庫。如果您的系統中尚未安裝Qt4,則構建過程可能需要多長時間。對我來說,這是非常值得的麻煩。我更喜歡capybara-webkit到我試過的任何其他解決方案。
這並不美觀,但您可以注入一個腳本來將錯誤導入DOM並通過Selenium監視這些更改。
更具體地說,在每個頁面中插入一個替代window.onerror
或console
的腳本,以便將錯誤信息附加到您注入DOM的某個隱藏節點。然後,通過Selenium,定期檢查並清空該元素的內容,將清空的數據打印到Java控制檯。
有點太複雜。我覺得有人已經這樣做了。不過謝謝。 –
在這個要點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
這個我發現有幫助的另一個變種:'expect(page.driver.browser.manage.logs.get(:browser).select {| m | m.level =='SEVERE'}} .to eq( 0)' – Julie
我在做類似的東西獅子座的情況下這樣做,但包括瀏覽器日誌,測試失敗消息的一部分:
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
這裏是另一種方式,目前正與硒和鉻無頭(也應該與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的修改。
我使用常綠寶石與水豚-webkit。除了一些解析問題,它似乎工作正常。 –