From 97da26eef40d751e97b68500ebbb94d82227307e Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Fri, 13 May 2011 13:22:50 +0100 Subject: [PATCH] The at_exit hook to quit the selenium browser should not execute for unrelated child processes --- lib/capybara/selenium/driver.rb | 10 +++++++++- spec/driver/selenium_driver_spec.rb | 11 +++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) 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