Есть ли способ напечатать javascript console.errors на терминал с помощью Rspec / Capybara / Selenium? - PullRequest
19 голосов
/ 25 января 2012

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

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

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

Ответы [ 5 ]

17 голосов
/ 21 апреля 2016

В конце этого гистограммы приведен пример кода 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
9 голосов
/ 18 июля 2017

Вот еще один способ, в настоящее время работающий с 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

Код является адаптацией этого .

6 голосов
/ 25 января 2012

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

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

2 голосов
/ 25 января 2012

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

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

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

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

1 голос
/ 29 августа 2016

Я делаю что-то похожее на 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
...