2012-01-25 10 views
15

Cuando ejecuto rspec, ¿es posible que capibara/selenio informe cualquier javascript console.errors y otras excepciones a rspec?¿Hay alguna forma de imprimir javascript console.errors al terminal con Rspec/Capybara/Selenium?

Tengo un montón de pruebas fallando, pero mi aplicación está funcionando cuando la pruebo manualmente. Sin conocer los errores de javascript que probablemente bloqueen mi aplicación web de una sola página durante las pruebas, es realmente difícil averiguar por qué fallan las pruebas.

He mirado alrededor y realmente no he podido encontrar una solución a esto.

Respuesta

3

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 usando este controlador (en una configuración de RSpec + Capybara), todos los errores de Javascript se imprimen en línea con mi salida de 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 elegante con Selenium, la transición podría ser bastante suave. Sin embargo, si usted depende de poder ver las pruebas que se ejecutan en el navegador, o si tiene alguna otra necesidad específica de Selenio, entonces desafortunadamente mi respuesta no será de mucha utilidad.

puede encontrar capibara-webkit aquí: https://github.com/thoughtbot/capybara-webkit

Conseguir instalado podría ser un dolor, ya que necesitará la biblioteca Qt4. Si todavía no tiene Qt4 en su sistema, el proceso de compilación puede tomar un tiempo largo. Para mí, valió la pena el problema. Yo prefiero capybara-webkit a cualquier otra solución que haya probado.

+0

Utilizo la gema perenne con capibara-webkit. Aparte de algunos problemas de análisis, parece estar funcionando bien. –

6

Esto no es bonito, pero podría inyectar una secuencia de comandos para dirigir los errores al DOM y observar esos cambios a través de Selenium.

Más específicamente, inserte una secuencia de comandos en cada página que anula window.onerror o console de modo que los errores añadan la información a algún nodo oculto que haya inyectado en el DOM. Luego, a través de Selenium, revise periódicamente y vacíe el contenido de ese elemento, imprimiendo los datos vacíos en la consola de Java.

+1

Un poco demasiado complicado. Pensé que alguien ya había hecho esto. Gracias sin embargo. –

12

Hay un ejemplo de código al final de esta idea https://gist.github.com/gkop/1371962 (el de alexspeller) que funcionó muy bien para mí.

que terminé haciendo esto en el contexto de las pruebas de 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 
+1

Otra variante de esto que encontré útil: 'expect (page.driver.browser.manage.logs.get (: browser) .select {| m | m.level == 'SEVERE'}. Length) .to eq (0) ' – Julie

1

estoy haciendo algo similar a Leo, pero incluyendo los registros del explorador como parte del mensaje de falla de la 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 
4

Aquí hay otra forma, actualmente trabajando con Selenium y Chrome sin cabeza (también debería funcionar con Firefox).

Agregue lo siguiente a spec/rails_helper.rb, dentro del bloque RSpec.configure do |config| y todas las características con js: true metadatos mostrarán errores 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.

Cuestiones relacionadas