Как мне настроить Capybara для работы с Poltergeist?

#ruby-on-rails-3 #rspec #capybara #rspec2 #poltergeist

#ruby-on-rails-3 #rspec #capybara #rspec2 #полтергейст

Вопрос:

У меня есть интеграционный тест RSpec, который должен выполнить некоторый JavaScript. Я включил Poltergeist и установил PhantomJS, но всякий раз, когда я запускаю пример, я получаю эту ошибку:

 Failure/Error: page.execute_script("$('form')[0].submit();")
Capybara::NotSupportedByDriverError:
  Capybara::Driver::Base#execute_script
  

Спецификация:

 require 'spec_helper'

describe "Signup", :type => :feature do
  describe "workflow" do
    it "ensures entry of contact information" do
      visit 'signup/action'
      # snip - use Capybara to fill out form elements
      page.execute_script("$('form')[0].submit();")
      page.should have_content("Name can't be blank")
      page.should have_content("Email can't be blank")

      # snip - use Capybara to fill out more form elements
      page.execute_script("$('form')[0].submit();")
      page.should have_content("Next page")
    end
  end
end
  

Я думаю, проблема в том, что я не уверен, как указать, что Capybara должна использовать Poltergeist в качестве своего драйвера JavaScript. В документации Poltergeist говорится:

Установка

Добавьте poltergeist в свой Gemfile, а в настройках тестирования добавьте:

 require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
  

Но в нем не указано, в какой конкретно файл он должен входить. В нем также говорится:

Настройка

Вы можете настроить способ, которым Capybara настраивает Poltegeist, с помощью следующего кода в вашей тестовой настройке:

 Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, options)
end
  

Но мне не ясно, нужно ли или когда мне нужно будет включить это в мои тесты. И опять же, я не уверен, куда его поместить, если мне нужно.


Чего мне не хватает?

  • Куда мне нужно поместить конфигурацию для Capybara и Poltergiest, и что именно в ней нужно сказать (или как я могу определить это для себя)?
  • Есть ли шаг или часть конфигурации, которую я пропустил?

Ответ №1:

Попробуйте ввести js: true строку описания. Я знаю, что должен был сделать это для спецификаций функций в приложении на работе:

 describe "Signup", :type => :feature, :js => true do
  

Я не вижу никакой другой конфигурации для этого. Было некоторое время назад, когда я его настраивал 🙂

Вы можете просто вызвать методы настройки драйвера Capybara один раз перед вашим блоком RSpec.configure:

 Capybara.default_selector = :css
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :window_size => [1920, 1080], :phantomjs_logger => nil)
end
Capybara.javascript_driver = :poltergeist
RSpec.configure do |config|
  

Также обязательно используйте усечение, а не транзакцию с помощью database cleaner. Poltergeist выполняется в отдельном потоке, поэтому у вас, вероятно, будут странные проблемы с БД, если вы используете транзакционный.

Редактировать

Здесь упоминается истинная вещь js: https://github.com/jnicklas/capybara#using-capybara-with-rspec в книге «капибара читает меня».