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
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