run - ¿Hay alguna forma de imprimir javascript console.errors en el terminal con Rspec/Capybara/Selenium?
ruby on rails rspec (5)
Cuando ejecuto rspec, ¿es posible que capybara / selenium informe cualquier javascript console.errors y otras excepciones a rspec?
Tengo un montón de pruebas que fallan, pero mi aplicación funciona cuando lo pruebo manualmente. Sin saber los errores de javascript que probablemente estén bloqueando mi aplicación web de una sola página solo durante las pruebas, es muy difícil averiguar por qué fallan las pruebas.
He mirado a mi alrededor y realmente no he podido encontrar una solución para esto.
Esta es otra manera, actualmente trabajando con Selenium y Chrome sin cabeza (también debería funcionar con Firefox).
Agregue lo siguiente a spec/rails_helper.rb
, dentro de RSpec.configure do |config|
El bloque y todas las especificaciones de características con js: true
metadatos js: true
mostrarán errores de 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
El código es una adaptación de this .
Esto no es bonito, pero podría inyectar un script para dirigir los errores en el DOM y observar esos cambios a través de Selenium.
Más específicamente, inyecte una secuencia de comandos en cada página que invalide window.onerror
o la console
modo que los errores agreguen la información a algún nodo oculto que haya inyectado en el DOM. Luego, a través de Selenium, verifique y vacíe periódicamente el contenido de ese elemento, imprimiendo los datos vacíos en la consola de Java.
Estoy haciendo algo similar a Leo, pero incluyendo los registros del navegador como parte del mensaje de error de prueba:
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
Hay un ejemplo de código al final de esta página https://gist.github.com/gkop/1371962 (la de alexspeller) que funcionó muy bien para mí.
Terminé haciendo esto en el contexto de las pruebas JS que estaba tratando de depurar
after(:each) do
errors = page.driver.browser.manage.logs.get(:browser)
if errors.present?
message = errors.map(&:message).join("/n")
puts message
end
end
No sé si esto será de alguna ayuda, pero podría intentar cambiar al controlador capybara-webkit de thoughtbot. Es una alternativa a Selenium sin cabeza, lo que significa que no abre un navegador para ejecutar las pruebas. Cuando ejecuto mis pruebas con este controlador (en una configuración RSpec + Capybara), todos los errores de Javascript se imprimen en línea con mi salida RSpec.
Nunca he intentado cambiar de Selenium a capybara-webkit, así que no sé qué tan factible es esto en un proyecto existente. Si no estás haciendo nada realmente sofisticado con Selenium, la transición podría ser bastante suave. Sin embargo, si depende de poder ver las pruebas que se ejecutan en el navegador, o tiene alguna otra necesidad específica de Selenium, mi respuesta, lamentablemente, no será de mucha utilidad.
Puede encontrar capybara-webkit aquí: https://github.com/thoughtbot/capybara-webkit
Instalarlo puede ser una molestia, ya que necesitará la biblioteca Qt4. Si aún no tiene Qt4 en su sistema, el proceso de compilación puede llevar mucho tiempo. Para mí, valió la pena. Prefiero mucho capybara-webkit a cualquier otra solución que haya probado.