Attempt to handle crashes

* Restart server process after a command crashes the process
* Inform the user where they can get help
This commit is contained in:
Joe Ferris 2015-06-05 16:34:04 -04:00
parent 9fabb9b73d
commit 8820275188
No known key found for this signature in database
GPG Key ID: 1B00F8C9678CF148
4 changed files with 42 additions and 1 deletions

View File

@ -1,4 +1,5 @@
require 'json'
require "json"
require "capybara/webkit/errors"
module Capybara::Webkit
class Browser
@ -209,6 +210,17 @@ module Capybara::Webkit
end
check
read_response
rescue SystemCallError => exception
@connection.restart
raise(Capybara::Webkit::CrashError, <<-MESSAGE.strip)
The webkit_server process crashed!
#{exception.message}
This is a bug in capybara-webkit. For help with this crash, please visit:
https://github.com/thoughtbot/capybara-webkit/wiki/Reporting-Crashes
MESSAGE
end
def evaluate_script(script)

View File

@ -61,6 +61,12 @@ module Capybara::Webkit
response
end
def restart
@socket = nil
start_server
connect
end
private
def start_server

View File

@ -23,6 +23,9 @@ module Capybara::Webkit
class ModalNotFound < StandardError
end
class CrashError < StandardError
end
class JsonError
def initialize(response)
error = JSON.parse response

View File

@ -3092,6 +3092,26 @@ CACHE MANIFEST
end
end
context "when the driver process crashes" do
let(:driver) do
driver_for_app browser do
get "/" do
"<html><body>Relaunched</body></html>"
end
end
end
let(:browser) { Capybara::Webkit::Browser.new(connection) }
let(:connection) { Capybara::Webkit::Connection.new }
it "reports and relaunches on reset" do
Process.kill "KILL", connection.pid
expect { driver.reset! }.to raise_error(Capybara::Webkit::CrashError)
visit "/"
expect(driver.html).to include("Relaunched")
end
end
def driver_url(driver, path)
URI.parse(driver.current_url).merge(path).to_s
end