2013-11-01 8 views
8

A quanto pare, sleep o wait_until non sono validi con le versioni recenti di Capybara, secondo il webpageupdates.Capybara richiede il sonno per funzionare?

Tuttavia, ho una serie di test che funzionano solo su macchine veloci se aggiungo una chiamata sleep(1) al test. Cioè, un test che assomiglia:

describe "dosimeters page" do 
    before do 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

diventa

describe "dosimeters page" do 
    before do 
    unix_wait 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

dove ho definito come unix_wait:

def unix_wait 
    case RbConfig::CONFIG['host_os'] 
    when /darwin/ 
    when /linux-gnu/ 
    sleep(1) 
    end 
end 

La cosa è, ho un vecchio Ubuntu 12.04 quadcore il portatile esegue questi test su Jenkins e tutto funziona bene senza le chiamate unix_wait. I test sono falliti casualmente su un desktop hexacore con Ubuntu 13.10 e un laptop MacBook Pro, ma se aggiungo la chiamata unix_wait, i test passano.

Gli stessi errori di test sono indicativi di errori di caricamento (ad esempio, mancano elementi di css su alcune esecuzioni, ma non su altri) e gli elementi testati funzionano effettivamente quando il sito viene caricato manualmente.

Quindi qual è l'azione appropriata qui? Apparentemente, sleep non è consentito durante il test, né wait_until. Tuttavia, il sonno funziona, ma a me sembra estremamente rude. Dovrei guardare #synchronized? Da quello che raccolgo da quei post del blog, questo viene già chiamato quando chiamo click_link, e i test continuano a fallire.

Qual è il protocollo accettato qui?

Dovrei aggiungere, perché penso che sia importante: questi sono tutti i test di JavaScript. Sto usando capybara-webkit costruito su qt4 (non qt5). Sto considerando di passare al poltergeist o ad un altro driver javascript come passo di debug.

+0

È possibile provare a utilizzare il webdriver per il debug ma ho problemi simili in esso. –

+0

Ho riscontrato lo stesso problema con capybara-webkit quando uso ajax. Non so se il poltergeist potrebbe risolvere questo problema, ma vale la pena provarlo. – basgys

+0

Puoi spiegare di più quali guasti stai vedendo? Non sono chiaro cosa significhi veramente "elementi mancanti". – Shepmaster

risposta

4

Nel caso in cui non lo facciate già, nella vostra asserzione di test se controllate il contenuto della pagina attenderà un certo lasso di tempo prima che quel contenuto diventi disponibile.

Così, invece di aggiungere un sonno si può aggiungere qualcosa di simile

expect(page).to have_content 'Success' 

Capybara ospita l'Ajax e il caricamento di elementi, ecc in modo che attenderanno implicitamente al momento del check contenuti.

È possibile modificare il tempo di attesa predefinito se è necessario per consentire il caricamento di elementi che si sa può richiedere più tempo cioè 3rd query partying/login

Capybara.default_wait_time = 5 
+1

Capybara _should_ essere accomodante Ajax, ma non sono del tutto sicuro che lo sia, dal momento che questi sono errori durante l'utilizzo di ': js => true' durante i test. Cambiare il 'default_wait_time' in realtà non aiuta, ma a volte' save_and_open_page' corregge il problema (anche se fa sì che una finestra interrompa il lavoro). – mmr

+0

Asta ha ragione, il problema è che non stai attivando il meccanismo di attesa di Capybara, perché non stai controllando il contenuto. Asta menziona il controllo 'have_content', e non stai facendo nulla del genere. – kross

+0

Anche qui viene data una risposta: http://stackoverflow.com/a/20003280/2363935 – kross

0

Una buona alternativa di wait_until e sleep è using_wait_time, un esempio di cui è mostrato sotto.

using_wait_time 5 do 
    page.should have_content '<content>' 
end 

È inoltre possibile ricaricare la pagina, dopo di che è possibile verificare le condizioni che si hanno. Questo funziona per me, a volte.

visit current_url