3

我正在使用 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'

有没有更好的办法?

4

4 回答 4

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

旁注:capybara-webkit 还包括一个匹配器:have_errors来编写一个不错的page.should_not have_errors. 不幸的是,这似乎在当前版本中被打破了(至少对我来说;另见:https ://github.com/thoughtbot/capybara-webkit/pull/201 )

于 2012-03-23T09:12:47.613 回答
0

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?

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

完整的要点在这里

于 2013-11-21T20:39:31.430 回答
0

尽管有时通知 JavaScript 错误可能会有所帮助,但您应该旨在测试实际的 JavaScript 行为。如果有 JavaScript 错误,这应该表现为失败的场景。

于 2012-02-12T23:09:28.967 回答
-1

您在“显示页面”的每个步骤上运行并检查您的 Web 控制台的最佳方式。然后您可以将 console.log 放在您的代码中。您在其中为所选步骤执行操作。

于 2012-02-09T11:51:09.563 回答