有没有办法用Rspec/Capybara/Selenium将javascript console.errors打印到终端?

And*_*ade 21 javascript selenium rspec ruby-on-rails capybara

当我运行rspec时,是否有可能让capybara/selenium报告任何javascript console.errors和其他异常回到rspec?

我有一大堆测试失败,但是当我手动测试它时,我的应用程序正在运行.在不知道可能仅在测试期间阻止我的单页Web应用程序的javascript错误的情况下,很难弄清楚测试失败的原因.

我环顾四周,并没有真正找到解决方案.

Leo*_*Leo 17

在这个要点的末尾有一个代码示例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
Run Code Online (Sandbox Code Playgroud)


Bru*_*cca 10

这是另一种方式,目前正在使用Selenium和无头Chrome(也应该与Firefox一起使用).

spec/rails_helper.rbRSpec.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
Run Code Online (Sandbox Code Playgroud)

该代码是一个适应这样.


che*_*ken 6

这不是很好,但你可以注入一个脚本来将错误导入DOM,并通过Selenium观察这些变化.

更具体地说,将脚本注入到每个页面中,这些脚本会覆盖window.onerrorconsole错误将信息附加到您注入DOM的某个隐藏节点.然后,通过Selenium,定期检查并清空该元素的内容,将清空的数据打印到Java控制台.


Rya*_*yan 3

我不知道这是否有任何帮助,但你可以尝试切换到thoughtbot的capybara-webkit驱动程序。它是 Selenium 的替代品,它是无头的,这意味着它不会打开浏览器来运行测试。当我使用此驱动程序(在 RSpec+Capybara 设置中)运行测试时,所有 Javascript 错误都会与我的 RSpec 输出一起打印。

我从未尝试过从 Selenium 切换到 capybara-webkit,所以我不知道这在现有项目上有多可行。如果您没有使用 Selenium 做任何真正喜欢的事情,那么过渡可能会非常顺利。但是,如果您依赖于能够观看浏览器中运行的测试,或者对 Selenium 有其他特定需求,那么不幸的是,我的答案不会有多大用处。

您可以在这里找到 capybara-webkit: https: //github.com/thoughtbot/capybara-webkit

安装它可能会很痛苦,因为您需要 Qt4 库。如果您的系统上尚未安装 Qt4,则构建过程可能需要很长时间。对我来说,这是非常值得的。与我尝试过的任何其他解决方案相比,我更喜欢 capybara-webkit。