Search code examples
rubyrspeccapybaracapybara-webkit

Rspec Capybara Webkit: Random Unable to find matching line from backtrace


I am setting up frontend tests with Rspec (3.0.0), Capybara (2.4.4) and Capybara-Webkit (1.5.1). My application uses Sinatra, so it's not a Rails application.
I got a weird error which seems random. It happens maybe once every three or four attemps, but it makes the rest of the tests fail. When it passes everything is fine, and Rspec does not complain.

I have tried reinstalling every gem, putting sleep statements everywhere, increasing the wait time to an unreasonnable value, but nothing worked.
I have messed up with the version of the gems, but the error keep coming back. I tried to put the test in a rescue block, shame on me, but even that didn't worked.
The answers I have been able to find seemed outdated, and updating the software didn't solve the problems. Another answer suggested a problem with Chrome plugins, but that didn't worked either.

Here is the info I have been able to gather:

  • It is linked to a test that opens a new window (see below). Maybe some kind of interaction/timing bug?
  • When I put logs everywhere, it seems to reach the end of the test, and the expect statement is true . The error seems to be raised AFTER exiting the test.
  • When this happens, the rest of the test fails as well, with the following code: Errno::EPIPE:Broken pipe

Relevant part of the Gemfile:

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

Content of the failing test:

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

Results in a failure case (I have included the next test, it returns the same thing for every test after that):

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)>'

Any help would be greatly appreciated ! Even a debugging/logging tool would be very useful.

Thank you!

Update:

After using webkit_debug, I was wable to determine that the error is triggered when capybara reset the browser. Here is the output of 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:

Solution

  • Capybara default behavior is to reset sessions after each test, in an :after hook. As indicated in the stack trace, this function (reset_sessions!) was crashing my tests.

    As a temporary solution, I monkey patched the Capybara Gem so that I can choose wether or not to reset sessions after a test.

    Here is my monkey patch:

    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
    

    After that I simply do Capybara.keep_sessions=true at the end of the problematic test. It is working, the error dissapearead, but I am aware that this is not ideal.

    Hope this helps!