2011-11-17 9 views
6

Estoy usando capibara para probar la aplicación de mis rieles para pruebas de integración. En mi aplicación hay muchas llamadas Lightbox y Ajax y js.¿Cómo agregar condición de espera en escenarios de capibara?

@javascript 
    Scenario: I agree functionatilty 
    Given I go to the create account page 
    When I click on button which is given as image "lnkTerms2" 
    And I follow "i_agree" 
    Then I go to the create account page 

Aquí en el anterior código es lnkTerms2 y la identificación que ayudará a llamar a la función js para abrir una caja de luz. Y estoy recibiendo un error como

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError) 
     [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]code.com/components/nsCommandProcessor.js:256:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:305:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:320:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:197:in `unknown' 
     (eval):2:in `send' 
     (eval):2:in `click_link' 
     ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/' 
     features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"' 

El problema es que esta función se llama en WebDriver, no está recibiendo tiempo para cargar las llamadas javascript y ajax. Y lightbox no abre. Así que por favor sugiero cualquier solución.

Además, si supongamos que escribo la línea

When I click on button which is given as image "lnkTerms2" 

después de 4 a 5 declaraciones luego de que funciona bien como se pone en cargar js.

Respuesta

3

Para una pausa después del paso a esperar ajax intento:

And I wait 5 seconds 

su no deben añadir a web_steps.rb siguiente código:

When /^I wait (\d+) seconds?$/ do |seconds| 
    sleep seconds.to_i 
end 
+4

esa no es una buena solución, está agregando un retraso forzado a la ejecución de la prueba; si se reutiliza, esto puede agregar mucho tiempo. la forma correcta de resolver este problema es esperar hasta que un elemento esté visible. – Benja

+4

cualquier forma de suspensión fija, incluso si toma el valor del escenario es generalmente una idea terrible, a menos que el escenario sea realmente sobre la experiencia del usuario que implica esperar esa cantidad específica de tiempo (en lugar de esperar a que la pantalla se actualice, etc. , por ejemplo, 'sincronizar') –

1

A la espera de un número determinado de segundos en la esperanza de que su escenario será lo suficientemente rápido como para no ser la mejor estrategia, ya que puede conducir a fallas en las pruebas aleatorias. Te recomiendo que espere hasta que se cumpla alguna condición en su lugar:

And I wait until '#meow' is visible 

#... 
When /^I wait until '([^']+)' is visible$/ do |selector| 
    wait_until do # you can also specify timeout here 
    find(selector).visible? 
    end 
end 
+7

wait_until no está disponible en Capybara 2 –

+0

Sin embargo, el punto general acerca de que las esperas fijas son malas sigue siendo cierto. Consulte la discusión aquí: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FZY en cuanto a por qué eliminaron wait_until .. –

+2

'find (selector)' es suficiente en lugar de esto 'wait_until 'block if' Capybara.ignore_hidden_elements = true'. Si es falso, se puede usar 'find (selector, visible: true)' –

12

generalmente fija duerme/esperas son una mala cosa .. Se trata de un método de fuerza bruta que cause guiones, guiones frágiles lentos, oa menudo ambos. Si no los configuras lo suficiente, ocasionalmente se rompen las pruebas, si los configura demasiado tiempo, entonces las pruebas nunca se rompen, pero son LENTAS debido a todo el tiempo de manipulación del pulgar fijo.

mayoría de las herramientas de automatización ya sea cuidar de la espera automágicamente, o proporcionar formas más elegantes para sincronizar las secuencias de comandos con su aplicación

A recent blog posting by JNicklas explanes algunos cambios recientes en Carpincho en este sentido, proporciona algunos ejemplos de algunas formas de haga un tipo específico de código de espera de condición para algunos casos especiales, y en general, recomienda aprender más sobre la herramienta y cómo se trata de esperar cosas, acciones de ajax y sincronización.

Cuestiones relacionadas