Есть ли способ распечатать 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