diff --git a/lib/capybara/selenium/driver.rb b/lib/capybara/selenium/driver.rb index 526989a6..c25d03ed 100644 --- a/lib/capybara/selenium/driver.rb +++ b/lib/capybara/selenium/driver.rb @@ -13,8 +13,10 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base def browser unless @browser @browser = Selenium::WebDriver.for(options[:browser], options.reject { |key,val| SPECIAL_OPTIONS.include?(key) }) + + main = Process.pid at_exit do - @browser.quit + quit if Process.pid == main end end @browser @@ -110,6 +112,12 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base browser.switch_to.window(handle, &blk) end + def quit + @browser.quit + rescue Errno::ECONNREFUSED + # Browser must have already gone + end + private def load_wait_for_ajax_support diff --git a/spec/driver/selenium_driver_spec.rb b/spec/driver/selenium_driver_spec.rb index 26f1ca5d..1081b795 100644 --- a/spec/driver/selenium_driver_spec.rb +++ b/spec/driver/selenium_driver_spec.rb @@ -12,4 +12,15 @@ describe Capybara::Selenium::Driver do it_should_behave_like "driver with support for window switching" it_should_behave_like "driver without status code support" it_should_behave_like "driver with cookies support" + + it "should not interfere with forking child processes" do + # Launch a browser, which registers the at_exit hook + browser = Capybara::Selenium::Driver.new(TestApp).browser + + # Fork an unrelated child process. This should not run the code in the at_exit hook. + pid = fork { "child" } + Process.wait2(pid)[1].exitstatus.should == 0 + + browser.quit + end end