Rspec Capybara Webkit: случайным образом невозможно найти совпадающую строку из обратной трассировки

Я настраиваю внешние тесты с помощью Rspec (3.0.0), Capybara (2.4.4) и Capybara-Webkit (1.5.1). В моем приложении используется Sinatra, поэтому это не приложение Rails.
Я получил странную ошибку, которая кажется случайной. Это случается раз в три-четыре попытки, но из-за этого остальные тесты проваливаются. При прохождении все нормально, и Rspec не жалуется.

Я пробовал переустанавливать каждый драгоценный камень, помещая везде операторы sleep, увеличивая время ожидания до необоснованного значения, но ничего не сработало.
Я перепутал версию драгоценных камней, но ошибка продолжает возвращаться. Я попытался поместить тест в аварийный блок, стыд за меня, но даже это не сработало.
Ответы, которые я смог найти, казались устаревшими, и обновление программного обеспечения не решило проблемы. В другом ответе указывалось на проблему с подключаемыми модулями Chrome, но это тоже не сработало.

Вот информация, которую мне удалось собрать:

  • Он связан с тестом, который открывает новое окно (см. ниже). Может быть, какая-то ошибка взаимодействия/времени?
  • Когда я везде ставлю логи, кажется, что тест дошел до конца, и утверждение expect истинно. Ошибка появляется ПОСЛЕ выхода из теста.
  • Когда это происходит, остальная часть теста также не проходит со следующим кодом: Errno::EPIPE:Broken pipe

Соответствующая часть Gemfile:

gem 'byebug' # debugger
gem 'capybara'
gem 'capybara-webkit'
gem 'rspec', '~> 3.0.0' # tdd'
gem 'faker' # create fake, but realistic data
gem 'launchy'

Содержание проваленного теста:

it 'should submit signup form and open auth popup' do
  page.fill_in('email', with: EMAIL)
  page.fill_in('password', with: PASSWORD)
  page.within_window window_opened_by {click_button 'Sign Up'} do
    page.fill_in('EmailAddress', with: EMAIL)
    page.fill_in('Password', with: PASSWORD)
    page.click_button('sign-in')
  end
  while auth_connect = page.has_selector?('.loading-container.active.visible')
    sleep 0.5
  end
  expect(checkElementsKyc(page)).to be true
end

Результаты в случае сбоя (я включил следующий тест, он возвращает одно и то же для каждого теста после этого):

Failures:

  1) signup_flow signup should submit signup form and open dwolla auth popup
     Failure/Error: Unable to find matching line from backtrace
     EOFError:
       end of file reached
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read_nonblock'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:40:in `gets'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:283:in `check'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:210:in `command'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:38:in `reset!'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/driver.rb:251:in `reset!'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/session.rb:103:in `reset!'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `block in reset_sessions!'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `each'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `reset_sessions!'
     # /home/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/rspec.rb:20:in `block (2 levels) in <top (required)>'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec_with_rescue'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:356:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `block in run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `each'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:485:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:344:in `run_after_example'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:163:in `block in run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:301:in `with_around_example_hooks'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:145:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:494:in `block in run_examples'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `map'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `run_examples'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:457:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `block in run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `map'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `map'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block in run_specs'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/reporter.rb:54:in `report'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:108:in `run_specs'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:86:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:70:in `run'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:38:in `invoke'
     # /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/exe/rspec:4:in `<top (required)>'
     # /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `load'
     # /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `<main>'
     # 
     #   Showing full backtrace because every line was filtered out.
     #   See docs for RSpec::Configuration#backtrace_exclusion_patterns and
     #   RSpec::Configuration#backtrace_inclusion_patterns for more information.

  2) signup_flow edit_details should not pass test with invalid dob
     Failure/Error: Unable to find matching line from backtrace
     Errno::EPIPE:
       Broken pipe
     # ./test/scripts/test_helper.rb:18:in `block (2 levels) in <top (required)>'

Любая помощь будет принята с благодарностью! Даже инструмент отладки/регистрации был бы очень полезен.

Спасибо!

Обновление:

После использования webkit_debug я смог определить, что ошибка возникает, когда капибара перезагружает браузер. Вот вывод webkit_debug:

Finished "Node.attribute" with response "Success(true)" 
Wrote response true "true" 
Received "Reset()" 
Started "Reset()" 
Aborting request to "" 
    should submit signup form and open auth popup (FAILED - 1)
Failures:

person xalio07    schedule 22.05.2015    source источник
comment
Вы в итоге нашли решение этой проблемы?   -  person Eli White    schedule 11.06.2015


Ответы (1)


По умолчанию Capybara сбрасывает сеансы после каждого теста в ловушке :after. Как видно из трассировки стека, эта функция (reset_sessions!) приводила к сбою моих тестов.

В качестве временного решения я пропатчил Capybara Gem, чтобы я мог выбирать, сбрасывать сеансы или нет после теста.

Вот мой патч обезьяны:

module Capybara
  class << self
    attr_accessor :keep_sessions

    def reset_sessions!
      unless Capybara.keep_sessions
        session_pool.each { |mode, session| session.reset! }
      end
    end
    alias_method :reset!, :reset_sessions!
  end
end

После этого я просто делаю Capybara.keep_sessions=true в конце проблемного теста. Он работает, ошибка исчезла, но я знаю, что это не идеально.

Надеюсь это поможет!

person xalio07    schedule 12.06.2015