Не могу войти с помощью Capybara-webkit, но RSpec/Capybara работает нормально

У меня есть спецификация функции RSpec, которая проверяет вход в систему для моего приложения. Он проходит, когда я запускаю его в RSpec с помощью Capybara, но когда я пытаюсь запустить его с пометкой js: true с помощью Capybara-webkit, он терпит неудачу. Это проблема, потому что все мое приложение стоит за входом в систему, и если я не могу запустить этот бит, я не знаю, как сделать спецификации функций для остальной части приложения.

Вот что я пробовал:

Как заставить мои параметры входа работать в Capybara-webkit? Некоторые из моих спецификаций нужно будет пометить для JS, а некоторые нет, но всем им потребуется, чтобы пользователь вошел в систему. Спасибо.

log_in_spec.rb

require 'rails_helper'

RSpec.feature "Log in", type: :feature do

  scenario "as admin" do
    user = create(:admin)

    # Tried this instead of with Capybara, works with Capybara but not capybara-webkit    
    # login_as user, scope: :user, run_callbacks: false

    visit root_path
    fill_in 'Email', with: user.email
    fill_in 'Password', with: user.password
    find('.btn-primary').click
    expect(page).to have_content('Admin')
  end
end

spec_helper.rb

require 'capybara/rspec'
require 'paperclip/matchers'

RSpec.configure do |config|

  Capybara.javascript_driver = :webkit
  Capybara.app_host = 'https://192.168.99.101'

  config.include Paperclip::Shoulda::Matchers

  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
    mocks.verify_doubled_constant_names = true
  end

  config.filter_run :focus
  config.run_all_when_everything_filtered = true

  config.disable_monkey_patching!

  if config.files_to_run.one?
    config.default_formatter = 'doc'
  end

end

rails_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)

# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'

require 'capybara/rails'
require 'devise'
require 'support/controller_macros'

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.filter_rails_from_backtrace!

  config.include Warden::Test::Helpers
  config.before :suite do
    Warden.test_mode!
  end

  config.after :each do
    Warden.test_reset!
  end

end

# Added headless gem and this code thanks to this post: http://stackoverflow.com/a/28706535/3043668
if ENV['HEADLESS']
  require 'headless'
  headless = Headless.new
  headless.start
  at_exit { headless.stop }
end

spec/support/database_cleaner.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

spec/support/headless.rb

RSpec.configure do |config|
  config.around type: :feature do |example|
    Headless.ly do
      example.run
    end
  end
end

spec/support/capybara.rb

Capybara::Webkit.configure do |config|
  config.debug = true
  config.allow_unknown_urls
  config.timeout = 5
  config.ignore_ssl_errors
  config.skip_image_loading
end

Вот суть вывода отладки из Capybara-webkit, когда я запускаю тест. Похоже, он пытается делать одно и то же снова и снова.

ОБНОВЛЕНИЕ Я удалил свою настройку Capybara.app_host, и тест не-JS все еще проходит, но когда я запускаю его под capybara-webkit, я вижу это в выводе отладки:

Received 0 from "https://127.0.0.1:37193/login"
Page finished with false
Load finished
Page load from command finished
Wrote response false "{"class":"InvalidResponseError","message":"Unable to load URL: http://127.0.0.1:37193/login because of error loading https://127.0.0.1:37193/login: Unknown error"}"
Received "Reset()"
Started "Reset()"
undefined|1|SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

Он пытается visit("/login") и перенаправляется на https-версию, что приводит к сбою. Как мне добиться успеха?


person David Ham    schedule 26.04.2016    source источник
comment
Ваша конфигурация use_transactional_fixtures и database_cleaner мне кажется подходящей для внепроцессного тестирования, поэтому я не думаю, что хак с совместным использованием соединения должен быть необходим. Это говорит о том, что я не знаю, в чем проблема. Я бы попробовал save_and_open_page и save_and_open_screenshot.   -  person Dave Schweisguth    schedule 26.04.2016


Ответы (2)


  1. Первая причина в том, что запись после процедуры сохранения c=не хранит пароль на виду, но кажется, что в данном случае это хорошо:

    user = create(:admin)
    # ...
    user = User.first # wrong way
    #...
    fill_in 'Password', with: 'password'
    
  2. Вторая причина сбоя входа в систему заключается в том, что фабричная девушка и водосвинка используют разные соединения, поэтому данные, созданные в одном сеансе, недоступны в другом. Чтобы исправить это, используйте исправление для одного соединения (поместите его в spec/support), как описано здесь.

person Малъ Скрылевъ    schedule 26.04.2016
comment
Я так пробовал, не получилось. Но я думаю, что он получает значение правильно, я добавил print "Sending email: #{find('#user_email').value}\n" и print "Sending password: #{find('#user_password').value}\n" и увидел правильные значения в выводе отладчика. - person David Ham; 26.04.2016
comment
@DavidHam А, помнишь, ты использовал патч для одного соединения? - person Малъ Скрылевъ; 26.04.2016
comment
Пробовал, никакого эффекта :( - person David Ham; 26.04.2016
comment
@DavidHam, вы должны забрать его в rails_helper - person Малъ Скрылевъ; 26.04.2016
comment
Давайте продолжим обсуждение в чате. - person David Ham; 26.04.2016

Это было тяжело. Но проблема заключалась в том, что я по глупости установил force_ssl = true в своем application.rb вместо того, чтобы поместить его в production.rb и development.rb, как обычный человек.

Я также установил app_host Capybara-webkit, что, как оказалось, мне не нужно было делать. Удалив это и запустив capybara-webkit с включенной отладкой, я увидел, что он пытается перенаправить с http://localhost:45362/login (или любого другого порта) на https://localhost:45362/login (обратите внимание на https!) и что это вызывает ошибку безопасности DOM 18 или что-то еще, и это заставляло его задыхаться. Я отключил force_ssl и теперь он работает как чамп. Надеюсь, это поможет вам не рвать на себе волосы.

person David Ham    schedule 28.04.2016