Есть ли способ распечатать javascript console.errors на терминале с помощью Rspec/Capybara/Selenium?

Когда я запускаю rspec, возможно ли сообщить capybara/selenium о любых javascript console.errors и других исключениях назад к rspec?

У меня закончилась целая куча тестов, но мое приложение работает, когда я вручную проверяю его. Не зная ошибок javascript, которые, вероятно, блокируют одностраничное веб-приложение только во время тестирования, очень сложно понять, почему тесты терпят неудачу.

Я огляделся и не смог найти решение этого.

Ответы

Ответ 1

Я не знаю, поможет ли это, но вы можете попробовать переключиться на драйвер capybara-webkit. Это альтернатива Selenium, что безголовый, то есть он не открывает браузер для запуска тестов. Когда я запускаю свои тесты с помощью этого драйвера (в настройке RSpec + Capybara), все ошибки Javascript печатаются в строке с выходом RSpec.

Я никогда не пытался переключиться с Selenium на capybara-webkit, поэтому я не знаю, насколько это возможно в существующем проекте. Если вы не делаете ничего необычного с Selenium, переход может быть довольно гладким. Однако, если вы зависите от возможности наблюдать за тестами, запущенными в браузере, или иметь какую-то другую специфическую потребность в Selenium, тогда мой ответ, к сожалению, не будет очень полезен.

Вы можете найти capybara-webkit здесь: https://github.com/thoughtbot/capybara-webkit

Получение установки может быть больно, так как вам понадобится библиотека Qt4. Если у вас еще нет Qt4 в вашей системе, процесс сборки может занять много времени. Для меня это стоило проблем. Я предпочитаю capybara-webkit для любого другого решения, которое я пробовал.

Ответ 2

Вот пример кода в конце этого 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

Ответ 3

Это не очень, но вы можете ввести script, чтобы направить ошибки в DOM и наблюдать за этими изменениями через Selenium.

В частности, введите script на каждую страницу, которая переопределяет window.onerror или console, чтобы ошибки добавляли эту информацию в некоторые скрытый node, который вы ввели в DOM. Затем через Selenium периодически проверяйте и очищайте содержимое этого элемента, распечатывая опустошенные данные на консоли Java.

Ответ 4

Вот еще один способ, в настоящее время работающий с Selenium и безголовым Chrome (также должен работать с Firefox).

Добавьте в spec/rails_helper.rb следующее: в блоке RSpec.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.

Ответ 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