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:
expect
statement is true . The error seems to be raised AFTER exiting the test.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:
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!