繁体   English   中英

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

[英]Is there a way to print javascript console.errors to the terminal with Rspec/Capybara/Selenium?

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

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

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

在这个要点的末尾有一个代码示例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

这是另一种方式,目前正在使用Selenium和无头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

该代码是一个适应这样

这不是很好,但你可以注入一个脚本来将错误引导到DOM中,并通过Selenium观察这些更改。

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

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

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

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

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

我正在做类似于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM