2016-03-02 48 views
6

Sto provando a eseguire alcuni test con Rspec/Capybara/Poltergeist sull'applicazione Rails 4, Phantomjs è installato (versione 2.2.1), ma ottengo sempre questo errore:Capybara :: Errore di stato di Poltergeist, impossibile raggiungere il server

Failure/Error: visit(perfect_landing_page_path)

Capybara::Poltergeist::StatusFailError:

Request to ' http://127.0.0.1:49623/path ' failed to reach server, check DNS and/or server status

Il test su cui sto lavorando:

require 'rails_helper' 

RSpec.feature 'Subscription', :type => :feature do 

    let!(:plan) { create(:plan) } 
    let!(:landing_page) { create(:landing_page) } 

    before(:each) { landing_page.default_plan = plan } 

    describe 'landing_page#perfect_show' do 
    scenario 'form display', js: true do 
     plan_2 = create(:plan) 
     plan_3 = create(:plan) 
     landing_page.plans << plan_2 
     landing_page.plans << plan_3 
     visit(perfect_landing_page_path) 
     expect(page).to have_css(".start-now", count: 3) 
     first(".start-now").click 
     expect(page).to have_css("#new_user") 
    end 

    end 

end 

mio Gemfile si presenta così:

gem 'rspec-rails', '~> 3.0' 
    gem 'factory_girl_rails' 
    gem 'guard-rspec' 

group :test do 
    gem 'database_cleaner' 
    gem 'capybara' 
    gem 'capybara-screenshot' 
    gem 'poltergeist' 
    gem 'selenium-webdriver' 
    gem 'shoulda-matchers', require: false 
    gem 'show_me_the_cookies' 
end 

mio spec file/supporto/capybara.rb:

require 'capybara/rails' 
require 'capybara/rspec' 
require 'capybara-screenshot/rspec' 

require "capybara/poltergeist" # Add this line to require poltergeist 
require 'selenium-webdriver' 

Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :default_max_wait_time => 30, :timeout => 30, phantomjs_options: [ 
          '--load-images=no', 
          '--ignore-ssl-errors=true', 
          '--ssl-protocol=any']}) 
end 

Capybara.register_driver :poltergeist_debug do |app| 
    Capybara::Poltergeist::Driver.new(app, :inspector => true) 
end 

Capybara.configure do |config| 
    config.javascript_driver = :poltergeist 
    config.ignore_hidden_elements = true 
    config.default_max_wait_time = 30 
end 

Il mio file spec_helper.rb:

require 'capybara/rspec' 

RSpec.configure do |config| 

    config.expect_with :rspec do |expectations| 
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true 
    end 

    config.mock_with :rspec do |mocks| 
    mocks.verify_partial_doubles = true 
    end 

    config.filter_run :focus 
    config.run_all_when_everything_filtered = true 

Soggetto con verifica questo problema prima? Qualcuno ha una soluzione per questo ? Ho battuto la testa per giorni guardando sul web ... Grazie mille.

PS: funziona bene sul Mac del mio amico (Yosemite o El Capitan), non solo sul mio.

+0

Puoi pubblicare il messaggio di errore completo?Quello che hai postato è troncato e manca la parte più importante (il dettaglio dell'errore) – agbodike

+0

Ho aggiornato la risposta per aggiungere un'alternativa lista bianca – agbodike

risposta

1

Ho avuto lo stesso problema ed era dovuto a un timeout di script di terze parti. È possibile impedire il caricamento di script di terze parti con una lista nera. Ad esempio:

config.before(:each, js: true) do 
    page.driver.browser.url_blacklist = ["http://use.typekit.net"] 
end 

impedirebbe qualsiasi URL che iniziano http://use.typekit.net dall'essere chiamato per ogni test che utilizza il driver js. Maggiori informazioni sono disponibili all'indirizzo:

https://robots.thoughtbot.com/speed-up-javascript-capybara-specs-by-blacklisting-urls

In alternativa è possibile utilizzare una whitelist:

config.before(:each, js: true) do 
    page.driver.browser.url_whitelist = ["127.0.0.1"] 
end 

che bloccherà tutte le richieste di non 127.0.0.1

ho messo la configurazione in spec/feature_helper.rb per assicurarsi che fosse impostato solo per le specifiche della funzione.

+0

Grazie per la risposta. Adesso il bug appare in modo casuale ... ma è anche vero che i test impiegano molto tempo per essere eseguiti, e ho provato il tuo metodo, ma non ha cambiato nulla per me. – Delphine

+0

Dove metteresti questa affermazione? – Trip

+0

Ce l'ho in 'spec/feature_helper.rb' – agbodike

0

È possibile evitare ciò precompilando le risorse prima dei test. E il codice è:

RSpec.configure do |config| 
    config.before :all do 
    ENV['PRECOMPILE_ASSETS'] ||= begin 
     case self.class.metadata[:type] 
     when :feature, :view 
     STDOUT.write "Precompiling assets..." 

     require 'rake' 
     Rails.application.load_tasks 
     Rake::Task['assets:precompile'].invoke 

     STDOUT.puts " done." 
     Time.now.to_s 
     end 
    end 
    end 
end 

more info

1

ho avuto questo problema in CI (CodeShip).

Aggiunta di una chiamata al bundle exec rake assets:precompile al termine dei comandi di impostazione sembrava per risolvere il problema:

CodeShip CI Setup comandi:

rvm use 2.3.4 --install 
bundle install 
export RAILS_ENV=test 
bundle exec rake db:schema:load 
bundle exec rake assets:precompile 

aveva anche una lista bianca per @agbodike ma nel rails_helper.rb

config.before(:each, js: true) do 
    page.driver.browser.url_whitelist = ["127.0.0.1"] 
end