sauce_ruby/lib/sauce/capybara.rb

110 lines
2.8 KiB
Ruby

require 'capybara'
require 'sauce/config'
require 'sauce/selenium'
$sauce_tunnel = nil
module Sauce
module Capybara
def connect_tunnel(options={})
begin
require 'sauce/connect'
rescue LoadError
puts 'Please install the `sauce-connect` gem if you intend on using Sauce Connect with your tests!'
raise
end
unless $sauce_tunnel.nil?
return $sauce_tunnel
end
$sauce_tunnel = Sauce::Connect.new(options)
$sauce_tunnel.connect
$sauce_tunnel.wait_until_ready
$sauce_tunnel
end
module_function :connect_tunnel
class Driver < ::Capybara::Selenium::Driver
RETRY_ON = [::Selenium::WebDriver::Error::UnhandledError,
::Selenium::WebDriver::Error::UnknownError]
MAX_RETRIES = 3
def handle_retry(method, *args, &block)
retries = 0
# Disable retries only when we really really want to, this will remain
# an undocomented hack for the time being
if ENV['SAUCE_DISABLE_RETRY']
retries = MAX_RETRIES
end
begin
send("base_#{method}".to_sym, *args, &block)
rescue *RETRY_ON => e
if retries < MAX_RETRIES
puts "Received an exception (#{e}), retrying"
retries = retries + 1
retry
else
raise
end
end
end
alias :base_find :find
alias :base_visit :visit
alias :base_current_url :current_url
alias :base_reset! :reset!
alias :base_within_frame :within_frame
alias :base_within_window :within_window
alias :base_find_window :find_window
alias :base_body :body
alias :base_source :source
alias :base_execute_script :execute_script
alias :base_evaluate_script :evaluate_script
[:find, :visit, :current_url, :reset!, :within_frame,
:within_window, :find_window, :body, :source,
:execute_script, :evaluate_script].each do |method|
define_method(method) do |*args, &block|
handle_retry(method, *args, &block)
end
end
def browser
unless @browser
if Sauce.get_config[:start_tunnel]
Sauce::Capybara.connect_tunnel(:quiet => true)
end
@browser = Sauce::Selenium2.new
at_exit do
finish!
end
end
@browser
end
def finish!
@browser.quit if @browser
@browser = nil
$sauce_tunnel.disconnect if $sauce_tunnel
end
end
end
end
Capybara.register_driver :sauce do |app|
Sauce::Capybara::Driver.new(app)
end
# Monkeypatch Capybara to not use :selenium driver
require 'capybara/dsl'
module Capybara
def self.javascript_driver
@javascript_driver || :sauce
end
end