2012-02-09 13 views
3

我正在使用Cucumber,Capybara和Capybara-webkit在我的Ruby on Rails應用程序中測試不同的場景。當頁面出現JavaScript錯誤時,如何在使用Capybara-Webkit的功能測試中失敗一步?

有沒有一種方法可以在場景運行時檢測頁面上的任何JavaScript錯誤,並且測試失敗?我們正在使用這些測試來確保我們不會在更改之間破壞功能(包括JavaScript),作爲我們自動化測試運行的一部分。

我可以看到測試輸出的失敗,但它不會失敗的測試:

http://127.0.0.1:54928/...|16|ReferenceError: Can't find variable: $ 
http://127.0.0.1:54928/...|16|ReferenceError: Can't find variable: $ 
... 

謝謝!

更新:我找到的一種方法是嘗試執行一些JavaScript,只有在以前的錯誤沒有發生時纔可能執行。在這種情況下,我會得到這樣的錯誤:

Javascript failed to execute (Capybara::Driver::Webkit::WebkitInvalidResponseError) 
./features/step_definitions/....rb:19:in `/^I should not see any JavaScript errors$/' 
features/....feature:34:in `Then I should not see any JavaScript errors' 

有沒有更好的方法?

回答

-1

讓您在每個步驟上運行的最佳方式是「顯示頁面」並檢查您的Web控制檯。然後你可以在你的代碼中放置console.log。您對所選步驟進行操作的位置。

+0

謝謝你的答案,但我不認爲我明白...我正在尋找一種方式來自動故障的步驟,所以我們可以再探討,只有當它失敗。不得不打開每個頁面並檢查控制檯,從而破壞了擁有無頭水豚-webkit的目的。 – 2012-02-09 15:35:41

0

雖然被通知JavaScript錯誤有時可能會有所幫助,但您應該着眼於測試實際的JavaScript行爲。如果存在JavaScript錯誤,則應該將其自身表現爲失敗的場景。

+0

我們遇到的問題是,只能通過失敗的JavaScript測試來檢查在canvas元素上繪製的東西的功能。這是因爲當涉及到測試時(和capybara-webkit不允許直接創建點擊事件),canvas(我們使用Backbone.js模型繪製)是一個黑盒子。也許有更好的方法來測試我錯過了嗎? – 2012-02-13 23:35:58

3

是的,您可以使用page.driver.console_messages訪問所有控制檯消息,或者僅訪問page.driver.error_messages的錯誤消息。

爲了測試沒有JavaScript錯誤我會沿着提出好的建議:

Then /^I should see no Java\-Script errors$/ do 
    page.driver.error_messages.length.should == 0 
end 

旁註:水豚,WebKit的還包括匹配:have_errors寫一個不錯的page.should_not have_errors。不幸的是,這在目前的版本中似乎被打破了(至少對我來說也是如此;另請參閱:https://github.com/thoughtbot/capybara-webkit/pull/201

0

capybara-webkit似乎在我們的環境中始終有兩條僞造消息。我試圖要儘可能具體和過濾這些了,但下面爲我們工作,自動在檢測到JavaScript錯誤與水豚,WebKit的失敗:

AfterStep do 
    if webkit? 
    real_error_messages = [] 
    page.driver.error_messages.each_with_index do |e, i| 
     # first two messages appear to be bogus, always. 
     if (e[:line_number] == 0) && (e[:source].eql? 'undefined') && (e[:message].eql? 'TypeError: \'null\' is not an object') && i <= 1 
     # discard message 
     else 
     real_error_messages << e 
     end 
    end 

    raise "Javascript errors: #{real_error_messages}" if real_error_messages.length > 0 
    end 
end 

其中webkit?是:

def webkit?() 
    [:webkit, :webkit_debug].include? Capybara.javascript_driver 
end 

Full gist here

+0

這似乎已經清理完畢,因此不再需要過濾郵件。 – kross 2014-03-19 19:24:28

相關問題