是否有方法使用Rspec/Capybara/Selenium将javascript console.errors打印到终端?

是否有方法使用Rspec/Capybara/Selenium将javascript console.errors打印到终端?,javascript,ruby-on-rails,selenium,rspec,capybara,Javascript,Ruby On Rails,Selenium,Rspec,Capybara,当我运行rspec时,是否可以让capybara/selenium向rspec报告任何javascript控制台错误和其他异常 我有一大堆测试都失败了,但是当我手动测试它时,我的应用程序正在工作。如果不知道javascript错误可能只在测试期间阻塞我的单页web应用程序,就很难找出测试失败的原因 我环顾四周,还没有找到解决方案。这不太好,但您可以插入一个脚本将错误定向到DOM中,并通过Selenium查看这些更改 更具体地说,在每个页面中插入一个脚本,该脚本覆盖或控制台,以便错误将信息附加到已

当我运行rspec时,是否可以让capybara/selenium向rspec报告任何javascript控制台错误和其他异常

我有一大堆测试都失败了,但是当我手动测试它时,我的应用程序正在工作。如果不知道javascript错误可能只在测试期间阻塞我的单页web应用程序,就很难找出测试失败的原因


我环顾四周,还没有找到解决方案。

这不太好,但您可以插入一个脚本将错误定向到DOM中,并通过Selenium查看这些更改


更具体地说,在每个页面中插入一个脚本,该脚本覆盖或
控制台
,以便错误将信息附加到已注入DOM的某个隐藏节点。然后,通过Selenium定期检查并清空该元素的内容,将清空的数据打印到Java控制台。

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

我从未尝试过从Selenium切换到capybara webkit,所以我不知道这在现有项目上有多可行。如果你对硒没有做什么特别的事情,过渡可能会非常顺利。然而,如果您依赖于能够观看在浏览器中运行的测试,或者对Selenium有其他特定的需求,那么很遗憾,我的答案没有多大用处

您可以在此处找到水豚网络工具包:


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

本文末尾有一个代码示例(来自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

我正在做一些类似于Leo的事情,但将浏览器日志作为测试失败消息的一部分:

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
def每次测试后检查浏览器日志(rspec\u配置)
rspec_config.before(:每个){
@prev_browser_logs=@browser.driver.manage.logs.get(:browser)
}
rspec_config.after(:每个){
logs=@browser.driver.manage.logs.get(:browser)
新建\u日志=日志-@prev\u浏览器\u日志
如果是example.exception,那么
s=new|logs.map{l|l.to_s}.join(“\n”)

example.exception.message这里是另一种方法,目前正在使用Selenium和headless Chrome(也应该使用Firefox)

RSpec.configure do | config |
块中,将以下内容添加到
spec/rails_helper.rb
,所有具有
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
类JavaScriptError

该代码是对的改编。

有点太复杂了。我认为有人已经这样做了。不过谢谢。我使用了长青宝石和水豚webkit。除了一些解析问题,它似乎工作正常。我发现另一个有用的变体:
expect(page.driver.browser.manage.logs.get(:browser)。选择{| m | m.level=='SEVERE'}.length)。对于等式(0)
在最新版本中不再工作,请参阅:(是的,显然它不再适用于Firefox。也许它仍然适用于Chrome?它仍然适用于Chrome,我使用的是chromeheadless 2.41,它可以工作