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

qfe3c7zg  于 2023-02-04  发布在  Java
关注(0)|答案(5)|浏览(151)

当我运行rspec时,是否有可能让capybara/selenium将任何javascript console.errors和其他异常报告回rspec?
我有一大堆测试失败了,但是我的应用程序在我手动测试的时候是可以工作的,如果不知道在测试过程中可能阻塞我的单页web应用程序的javascript错误,真的很难弄清楚为什么测试失败了。
我环顾四周,还没有真正能够找到一个解决这个问题的办法。

rta7y2nd

rta7y2nd1#

在这个gist 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

对于更新版本的headless chrome,请使用page.driver.browser.logs.get(:browser)

fnx2tebb

fnx2tebb2#

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

该代码是对此的改编。
对于更新版本的headless chrome,请使用page.driver.browser.logs.get(:browser)

3lxsmp7m

3lxsmp7m3#

这并不漂亮,但是您可以注入一个脚本来将错误定向到DOM中,并通过Selenium监视这些更改。
更具体地说,在每个页面中注入一个脚本,该脚本覆盖window.onerrorconsole,以便错误将信息附加到您注入到DOM中的某个隐藏节点。然后,通过Selenium定期检查并清空该元素的内容,将清空的数据打印到Java控制台。

u7up0aaq

u7up0aaq4#

我不知道这是否会有帮助,但你可以尝试切换到thoughtbot的capybara-webkit驱动程序。它是Selenium的替代品,它是无头的,这意味着它不打开浏览器来运行测试。当我使用这个驱动程序运行测试时(在RSpec+Capybara设置中),所有的Javascript错误都会与我的RSpec输出一起打印出来。
我从来没有尝试过从Selenium转换到capybara-webkit,所以我不知道这在现有的项目上是否可行。如果你没有用Selenium做任何真正花哨的事情,转换可能会相当顺利。但是,如果你依赖于能够在浏览器中观看测试运行,或者对Selenium有其他特定的需求,那么不幸的是我的答案不会有太大的用处。
你可以在这里找到水豚-webkit:https://github.com/thoughtbot/capybara-webkit
安装Qt 4可能会很痛苦,因为你需要Qt 4库。如果你的系统上还没有Qt 4,构建过程可能会花很长时间。对我来说,这是值得的。我更喜欢capybara-webkit,而不是我试过的任何其他解决方案。

rjjhvcjd

rjjhvcjd5#

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

相关问题