2016-03-02 63 views
6

我想在我的Rails 4应用程序上使用Rspec/Capybara/Poltergeist进行一些测试,Phantomjs已安装(版本2.2.1),但我总是得到这个错误:水豚:: Poltergeist状态错误,未能到达服务器

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

测试我的工作:

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 

我的Gemfile看起来是这样的:

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 

我的规格/支持/ 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 

我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 

是否有人以前遇到这样的问题?有没有人有这个解决方案?我一直在网上殴打我的头... 非常感谢。

PS:它可以在我朋友的Mac(优胜美地或El Capitan)上正常工作,只是不在我的。

+0

你能发布完整的错误信息吗?你发布的内容被截断并丢失了最重要的部分(错误的详细信息) – agbodike

+0

我更新了答案以添加白名单替代 – agbodike

回答

1

我有同样的问题,这是由于第三方脚本超时。您可以阻止加载第三方脚本与黑名单。例如:

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

将阻止任何URL被要求使用js的司机每次测试开始http://use.typekit.net。更多信息可以在这里找到:

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

或者您可以使用白名单:

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

这将阻止所有请求不为127.0.0.1

我放在spec/feature_helper.rb配置以确保仅针对功能规格进行设置。

+0

感谢您的回复。 这个错误实际上现在是随机出现的......但测试运行时间很长也是事实,我尝试了你的方法,但它并没有改变任何东西。 – Delphine

+0

你会在哪里发表该声明? – Trip

+0

我在'spec/feature_helper.rb'中 – agbodike

0

您可以通过在测试之前预先编译资源来避免这些。 和代码是:

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

我是有在CI(CodeShip)这个问题。

在安装命令的结尾添加到bundle exec rake assets:precompile通话似乎解决它:

CodeShip CI设置命令:

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

也有每@agbodike白名单,但在rails_helper.rb

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