2015-01-18 13 views
5

Sto avendo problemi strani con alcuni dei miei test di funzionalità utilizzando Capybara con driver poltergeist. Il test dovrebbe eseguire un checkout semplice nel mio negozio online. Passano tutti bene sul mio MacBook locale e su una scatola vagabonda di Ubuntu. Tuttavia su servizi CI come Codeship, Wercker o Semaphore falliscono con lo stesso errore.Capybara Poltergeist funzionalità test fallito su CI ma passa localmente

mia spec:

require 'rails_helper' 

    describe 'Checkout' do 

     let!(:product) { FactoryGirl.create(:product) } 

     it 'checks out via CreditCard', js: true do 
     visit products_path 
     expect(page.body).to have_link('Test Product 1') 
     click_link('Test Product 1') 
     #rest of spec ommitted 
     end 
    end 

L'errore che ottengo sul C'è:

2) Checkout checks out via CreditCard 
Failure/Error: click_link('Test Product 1') 
Capybara::ElementNotFound: 
    Unable to find link "Test Product 1" 

Per me questo è super strano, come la prima aspettativa 'aspettano (page.body). to have_link ('Test Product 1') 'sembra passare ma poi non riesce al passaggio successivo in cui dovrebbe effettivamente fare clic sul collegamento che ha semplicemente assicurato di essere presente nella pagina?

Quindi ho riconfigurato il driver di poltergeist come segue per raccogliere più informazioni di debug.

Snippet di rails_helper.rb:

Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, {js_errors: false, 
              #inspector: true, 
              phantomjs_logger: Rails.logger, 
              logger: nil, 
              phantomjs_options: ['--debug=no', '--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1'], 
              debug: true 
             }) 
end 
Capybara.server_port = 3003 
Capybara.app_host = 'http://application-test.lvh.me:3003' # lvh.me always resolves to 127.0.0.1 
Capybara.javascript_driver = :poltergeist 
Capybara.current_driver = :poltergeist 
Capybara.default_wait_time = 5 

ora posso vedere su console CI che il test con successo la mia visita products_path e la pagina html atteso (compreso il mio link dovrebbe click) viene restituito. Ho rimosso il resto della risposta HTML per renderlo più leggibile:

{"name"=>"visit", "args"=>["http://application-test.lvh.me:3003/products"]} 
{"response"=>{"status"=>"success"}} 
{"name"=>"body", "args"=>[]} 
{"response"=>"--- snip --- <div class=\"info\">\n<a class=\"name color-pomegranate\" href=\"/en/products/6\">\nTest Product 1\n</a>\n850,00 \n</div> --- snap ---"} 
{"name"=>"find", "args"=>[:xpath, ".//a[./@href][(((./@id = 'Test Product 1' or normalize-space(string(.)) = 'Test Product 1') or ./@title = 'Test Product 1') or .//img[./@alt = 'Test Product 1'])]"]} 
{"response"=>{"page_id"=>4, "ids"=>[0]}} 
{"name"=>"visible", "args"=>[4, 0]} 
{"response"=>false} 
{"name"=>"find", "args"=>[:xpath, ".//a[./@href][(((./@id = 'Test Product 1' or contains(normalize-space(string(.)), 'Test Product 1')) or contains(./@title, 'Test Product 1')) or .//img[contains(./@alt, 'Test Product 1')])]"]} 
{"response"=>{"page_id"=>4, "ids"=>[1]}} 
{"name"=>"visible", "args"=>[4, 1]} 
{"response"=>false} 

Gli ultimi due trovano le azioni si ripetono fino Capybara raggiunge il suo timeout, quindi il test fallisce. Ho ricontrollato gli usi di xpath Capybara tramite alcuni validatori online di xpath, ma come previsto corrisponde al collegamento HTML. Ho usato anche capybara-screenshot gem per eseguire il dump del corpo HTML in caso di errore e anche il link in questione è presente.

Quindi perché il test continua a fallire? C'è qualche condizione di gara di cui non sono a conoscenza? Perché passa in locale ma su nessuno dei servizi CI?

Ecco la mia versione gioiello:

  • capibara (2.4.4)
  • capibara-screenshot (1.0.3)
  • database_cleaner (1.3.0)
  • factory_girl (4.5.0)
  • factory_girl_rails (4.5.0)
  • poltergeist (1.5.1)
  • rotaie (4.1.8)
  • RSpec (3.1.0)
  • RSpec-rotaie (3.1.0)
  • e phantomjs 1.9.7

risposta

0

Mentre non posso riprodurre questo, mi ricordo di aver avuto questo problema prima.Credo che la vostra linea:

expect(page.body).to have_link('Test Product 1') 

sta passando perché il collegamento è letteralmente sul corpo della pagina HTML, anche se può essere nascosto a causa di un comportamento CSS o JS. Tuttavia, la riga:

click_link('Test Product 1') 

verifica definitivamente la visibilità prima di fare clic sul collegamento. Si dovrebbe verificare le configurazioni spec_helper.rb per assicurarsi:

Capybara.ignore_hidden_elements = true 

è presente, in modo che la prima linea non sarebbe passata. Penso di aver avuto anche per cambiare la prima linea ho detto a:

# Change page.body to page, to look at the rendered page, not the literal one 
expect(page).to have_link('Test Product 1') 

Una volta fatto questo, la prima fila di linea il filo e attende che il collegamento diventa visibile. Quindi il resto del test passerà.

Spero che questo lo risolva.

+0

Infatti, se imposto 'Capybara.ignore_hidden_elements = true' anche la prima aspettativa fallisce. Quindi l'elemento non sembra essere visibile. Comunque se metto 'expect (page). A have_link ('Test Product 1')' fallisce ancora mentre blocca fino a quando Capybara non raggiunge il timeout. Quindi per qualsiasi motivo gli elementi non diventano mai visibili – philkry

Problemi correlati