【问题标题】:Is there a way to print javascript console.errors to the terminal with Rspec/Capybara/Selenium?有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?
【发布时间】:2012-01-25 00:17:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript ruby-on-rails selenium rspec capybara


    【解决方案1】:

    这个要点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
    

    【讨论】:

    • 另一个我发现有用的变体:expect(page.driver.browser.manage.logs.get(:browser).select {|m| m.level == 'SEVERE'}.length).to eq(0)
    【解决方案2】:

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

    代码改编自this

    【讨论】:

    • 在最新版本中不再工作,请参阅here :(
    • 是的,显然它不再适用于 Firefox。也许它仍然适用于 Chrome?
    • 它仍在 chrome 中工作,我使用的是 chromeheadless 2.41,它可以工作
    【解决方案3】:

    这并不漂亮,但是您可以注入一个脚本来将错误引导到 DOM 中,并通过 Selenium 监视这些更改。

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

    【讨论】:

    • 有点太复杂了。我想有人已经这样做了。不过还是谢谢。
    【解决方案4】:

    我不知道这是否会有所帮助,但您可以尝试切换到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。

    【讨论】:

    • 我将常青宝石与 capybara-webkit 一起使用。除了一些解析问题之外,它似乎工作正常。
    【解决方案5】:

    我正在做与 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
    

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2012-01-18
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多