簡體   English   中英

當頁面上出現JavaScript錯誤時,如何使用Capybara-Webkit在功能測試中失敗?

[英]How do I fail a step in a feature test with Capybara-Webkit when there is a JavaScript error on a page?

我使用Cucumber,Capybara和Capybara-webkit在我的Ruby on Rails應用程序中測試不同的場景。

有沒有辦法在場景運行時檢測到頁面上的任何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'

有沒有更好的辦法?

是的,你可以訪問所有控制台消息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

旁注:capybara-webkit還包括一個matcher :have_errors來編寫一個很好的page.should_not have_errors 不幸的是,這似乎在當前版本中被破壞了(至少對我而言;另見: https//github.com/thoughtbot/capybara-webkit/pull/201

capybara-webkit似乎總是在我們的環境中有兩條虛假的消息。 我試圖盡可能具體,並過濾掉這些,但以下是我們在使用capybara-webkit檢測到javascript錯誤時自動失敗:

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?在哪里webkit? 是:

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

這里充分要點

盡管收到JavaScript錯誤的通知有時可能會有所幫助,但您應該嘗試測試實際的JavaScript行為。 如果存在JavaScript錯誤,則應將其自身表現為失敗方案。

您在每個步驟上運行的最佳方式是“向我顯示頁面”並檢查您的Web控制台。 然后,您可以在您的代碼中放置console.log。 您為所選步驟執行操作的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM