2011-11-17 13 views
6

Sto utilizzando capibara per testare la mia applicazione di rotaie per i test di integrazione. Nella mia applicazione ci sono molte lightbox e chiamate Ajax e js.Come aggiungere le condizioni di attesa negli scenari di 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 

Qui in lnkTerms2 codice di cui sopra è e id, che contribuirà a chiamando la funzione js per aprire un lightbox. E sto ottenendo un errore come

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]/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"' 

Il problema è come questa funzione chiamata in WebDriver, non è sempre tempo per caricare javascript e le chiamate Ajax. E lightbox non si sta aprendo. Quindi, per favore suggeriscimi qualsiasi soluzione.

anche se supponiamo che scrivo la linea

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

dopo 4 a 5 dichiarazioni, allora sta lavorando bene, come si arriva il momento di caricare js.

risposta

3

Per una pausa dopo passo per attendere l'Ajax prova:

And I wait 5 seconds 

tuo bisogna aggiungere al web_steps.rb codice successivo:

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

non è una buona soluzione, aggiunge un ritardo forzato all'esecuzione del test, se riutilizzato può aggiungere molto tempo. il modo corretto per risolvere questo problema è attendere che un elemento sia visibile. – Benja

+4

qualsiasi forma di sonno fisso, anche se sta prendendo il valore dallo scenario è generalmente una pessima idea, a meno che lo scenario non sia in realtà sull'esperienza utente che implica l'attesa di quella specifica quantità di tempo (a differenza dell'aspettare il display per aggiornare ecc. , ad esempio "sincronizzazione") –

1

In attesa di un numero fisso di secondi nella speranza che il vostro piano d'azione sarà abbastanza veloce non è la strategia migliore, perché potrebbe portare a problemi di test casuali. Vi consiglio di aspettare fino a quando una condizione è verificata invece:

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 non è disponibile in Capybara 2 –

+0

Il punto generale riguardo alle attese fisse che sono scadenti rimane comunque vero. Vedi la discussione qui: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FzY sul motivo per cui hanno rimosso wait_until .. –

+2

'find (selector)' è abbastanza invece di questo 'wait_until 'Blocca se' Capybara.ignore_hidden_elements = true'. Se è falso, 'find (selector, visible: true)' può essere utilizzato –

12

generalmente fissato posti letto/attese sono una brutta cosa .. Si tratta di un approccio forza bruta che o risultati negli script, script fragili lenti, o spesso entrambi. Se non li imposti abbastanza a lungo, a volte i test si interrompono, se li imposti troppo a lungo, i test non si interrompono mai, ma sono LENTITI a causa di tutti i tempi fissi per il pollice.

maggior parte degli strumenti di automazione o prendersi cura del aspettare automagicamente, o forniscono modi più eleganti per sincronizzare i propri script con la vostra applicazione

A recent blog posting by JNicklas explanes alcune modifiche recenti alla Capybara a questo proposito, fornisce alcuni esempi di alcuni modi per fare un determinato tipo di codice di attesa per alcuni casi speciali, e in generale raccomanda di saperne di più sullo strumento e su come si tratta di aspettare cose, azioni Ajax e sincronizzazione.

Problemi correlati