2012-07-08 19:17:08 +00:00
|
|
|
require "capybara"
|
|
|
|
require "capybara/webkit/version"
|
|
|
|
require "capybara/webkit/node"
|
|
|
|
require "capybara/webkit/connection"
|
|
|
|
require "capybara/webkit/browser"
|
|
|
|
require "capybara/webkit/cookie_jar"
|
|
|
|
require "capybara/webkit/errors"
|
|
|
|
|
|
|
|
module Capybara::Webkit
|
2014-10-21 15:31:46 +00:00
|
|
|
class Driver < Capybara::Driver::Base
|
2012-07-08 19:17:08 +00:00
|
|
|
attr_reader :browser
|
|
|
|
|
|
|
|
def initialize(app, options={})
|
|
|
|
@app = app
|
|
|
|
@options = options
|
|
|
|
@browser = options[:browser] || Browser.new(Connection.new(options))
|
|
|
|
end
|
|
|
|
|
|
|
|
def enable_logging
|
|
|
|
browser.enable_logging
|
|
|
|
end
|
|
|
|
|
2014-11-14 19:55:14 +00:00
|
|
|
def allow_url(url)
|
|
|
|
browser.allow_url(url)
|
|
|
|
end
|
|
|
|
|
|
|
|
def block_url(url)
|
|
|
|
browser.block_url(url)
|
|
|
|
end
|
|
|
|
|
|
|
|
def block_unknown_urls
|
|
|
|
browser.block_unknown_urls
|
|
|
|
end
|
|
|
|
|
2015-04-09 20:11:55 +00:00
|
|
|
def allow_unknown_urls
|
|
|
|
browser.allow_url("*")
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def current_url
|
|
|
|
browser.current_url
|
|
|
|
end
|
|
|
|
|
|
|
|
def visit(path)
|
2012-11-17 04:44:03 +00:00
|
|
|
browser.visit(path)
|
2012-07-08 19:17:08 +00:00
|
|
|
end
|
|
|
|
|
2013-02-25 17:04:12 +00:00
|
|
|
def find_xpath(xpath)
|
|
|
|
browser.find_xpath(xpath).map { |native| Node.new(self, native) }
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method :find, :find_xpath
|
|
|
|
|
|
|
|
def find_css(selector)
|
|
|
|
browser.find_css(selector).map { |native| Node.new(self, native) }
|
2012-07-08 19:17:08 +00:00
|
|
|
end
|
|
|
|
|
2012-11-17 15:41:38 +00:00
|
|
|
def html
|
2012-07-08 19:17:08 +00:00
|
|
|
browser.body
|
|
|
|
end
|
|
|
|
|
|
|
|
def header(key, value)
|
|
|
|
browser.header(key, value)
|
|
|
|
end
|
|
|
|
|
2013-02-18 16:08:40 +00:00
|
|
|
def title
|
|
|
|
browser.title
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def execute_script(script)
|
|
|
|
value = browser.execute_script script
|
|
|
|
value.empty? ? nil : value
|
|
|
|
end
|
|
|
|
|
|
|
|
def evaluate_script(script)
|
|
|
|
browser.evaluate_script script
|
|
|
|
end
|
|
|
|
|
|
|
|
def console_messages
|
|
|
|
browser.console_messages
|
|
|
|
end
|
|
|
|
|
|
|
|
def error_messages
|
|
|
|
browser.error_messages
|
|
|
|
end
|
|
|
|
|
2012-07-10 13:47:17 +00:00
|
|
|
def alert_messages
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#alert_messages ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_alert instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.alert_messages
|
|
|
|
end
|
|
|
|
|
|
|
|
def confirm_messages
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#confirm_messages ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_confirm ' \
|
|
|
|
'or Capybara::Session#dismiss_confirm instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.confirm_messages
|
|
|
|
end
|
|
|
|
|
|
|
|
def prompt_messages
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#prompt_messages ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_prompt ' \
|
|
|
|
'or Capybara::Session#dismiss_prompt instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.prompt_messages
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def response_headers
|
|
|
|
browser.response_headers
|
|
|
|
end
|
|
|
|
|
|
|
|
def status_code
|
|
|
|
browser.status_code
|
|
|
|
end
|
|
|
|
|
|
|
|
def resize_window(width, height)
|
2014-07-10 01:32:35 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#resize_window ' \
|
|
|
|
'is deprecated. Please use Capybara::Window#resize_to instead.'
|
2014-06-18 22:00:34 +00:00
|
|
|
resize_window_to(current_window_handle, width, height)
|
|
|
|
end
|
|
|
|
|
|
|
|
def resize_window_to(handle, width, height)
|
|
|
|
browser.window_resize(handle, width, height)
|
|
|
|
end
|
|
|
|
|
|
|
|
def window_size(handle)
|
|
|
|
browser.window_size(handle)
|
2012-07-08 19:17:08 +00:00
|
|
|
end
|
|
|
|
|
2013-02-17 21:23:43 +00:00
|
|
|
def within_frame(selector)
|
|
|
|
browser.frame_focus(selector)
|
2012-07-08 19:17:08 +00:00
|
|
|
begin
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
browser.frame_focus
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def within_window(selector)
|
2014-06-18 22:00:34 +00:00
|
|
|
current_window = current_window_handle
|
|
|
|
switch_to_window(selector)
|
2012-07-08 19:17:08 +00:00
|
|
|
begin
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
browser.window_focus(current_window)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-18 22:00:34 +00:00
|
|
|
def switch_to_window(selector)
|
|
|
|
browser.window_focus(selector)
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def window_handles
|
|
|
|
browser.get_window_handles
|
|
|
|
end
|
|
|
|
|
2014-06-18 22:00:34 +00:00
|
|
|
def current_window_handle
|
2012-07-08 19:17:08 +00:00
|
|
|
browser.get_window_handle
|
|
|
|
end
|
|
|
|
|
2014-06-18 22:00:34 +00:00
|
|
|
def open_new_window
|
|
|
|
browser.window_open
|
|
|
|
end
|
|
|
|
|
|
|
|
def close_window(selector)
|
|
|
|
browser.window_close(selector)
|
|
|
|
end
|
|
|
|
|
|
|
|
def maximize_window(selector)
|
|
|
|
browser.window_maximize(selector)
|
|
|
|
end
|
|
|
|
|
2012-07-10 13:47:17 +00:00
|
|
|
def accept_js_confirms!
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#accept_js_confirms! ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_confirm instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.accept_js_confirms
|
|
|
|
end
|
|
|
|
|
|
|
|
def dismiss_js_confirms!
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#dismiss_js_confirms! ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#dismiss_confirm instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.reject_js_confirms
|
|
|
|
end
|
|
|
|
|
|
|
|
def accept_js_prompts!
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#accept_js_prompts! ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_prompt instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.accept_js_prompts
|
|
|
|
end
|
|
|
|
|
|
|
|
def dismiss_js_prompts!
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#dismiss_js_prompts! ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#dismiss_prompt instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
browser.reject_js_prompts
|
|
|
|
end
|
|
|
|
|
|
|
|
def js_prompt_input=(value)
|
2014-07-09 13:27:55 +00:00
|
|
|
warn '[DEPRECATION] Capybara::Webkit::Driver#js_prompt_input= ' \
|
|
|
|
'is deprecated. Please use Capybara::Session#accept_prompt instead.'
|
2012-07-10 13:47:17 +00:00
|
|
|
if value.nil?
|
|
|
|
browser.clear_prompt_text
|
|
|
|
else
|
|
|
|
browser.set_prompt_text_to(value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-18 22:00:34 +00:00
|
|
|
def go_back
|
|
|
|
browser.go_back
|
|
|
|
end
|
|
|
|
|
|
|
|
def go_forward
|
|
|
|
browser.go_forward
|
|
|
|
end
|
|
|
|
|
2014-07-03 22:21:21 +00:00
|
|
|
def accept_modal(type, options={})
|
|
|
|
options = modal_action_options_for_browser(options)
|
|
|
|
|
|
|
|
case type
|
|
|
|
when :confirm
|
|
|
|
id = browser.accept_confirm(options)
|
|
|
|
when :prompt
|
|
|
|
id = browser.accept_prompt(options)
|
|
|
|
else
|
|
|
|
id = browser.accept_alert(options)
|
|
|
|
end
|
|
|
|
|
|
|
|
yield
|
|
|
|
|
|
|
|
find_modal(type, id, options)
|
|
|
|
end
|
|
|
|
|
|
|
|
def dismiss_modal(type, options={})
|
|
|
|
options = modal_action_options_for_browser(options)
|
|
|
|
|
|
|
|
case type
|
|
|
|
when :confirm
|
|
|
|
id = browser.reject_confirm(options)
|
|
|
|
else
|
|
|
|
id = browser.reject_prompt(options)
|
|
|
|
end
|
|
|
|
|
|
|
|
yield
|
|
|
|
|
|
|
|
find_modal(type, id, options)
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def wait?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2012-11-17 04:44:03 +00:00
|
|
|
def needs_server?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2012-07-08 19:17:08 +00:00
|
|
|
def reset!
|
|
|
|
browser.reset!
|
|
|
|
end
|
|
|
|
|
|
|
|
def has_shortcircuit_timeout?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
2012-11-17 15:33:31 +00:00
|
|
|
def save_screenshot(path, options={})
|
2012-07-08 19:17:08 +00:00
|
|
|
options[:width] ||= 1000
|
|
|
|
options[:height] ||= 10
|
|
|
|
|
|
|
|
browser.render path, options[:width], options[:height]
|
|
|
|
end
|
|
|
|
|
|
|
|
def cookies
|
|
|
|
@cookie_jar ||= CookieJar.new(browser)
|
|
|
|
end
|
|
|
|
|
|
|
|
def invalid_element_errors
|
2013-01-19 15:28:58 +00:00
|
|
|
[Capybara::Webkit::ClickFailed]
|
2012-07-08 19:17:08 +00:00
|
|
|
end
|
|
|
|
|
2014-06-18 22:00:34 +00:00
|
|
|
def no_such_window_error
|
|
|
|
Capybara::Webkit::NoSuchWindowError
|
|
|
|
end
|
|
|
|
|
2013-02-06 18:23:39 +00:00
|
|
|
def version
|
|
|
|
[
|
|
|
|
"Capybara: #{Capybara::VERSION}",
|
|
|
|
"capybara-webkit: #{Capybara::Driver::Webkit::VERSION}",
|
|
|
|
browser.version
|
|
|
|
].join("\n")
|
|
|
|
end
|
2014-07-03 22:21:21 +00:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def modal_action_options_for_browser(options)
|
|
|
|
if options[:text].is_a?(Regexp)
|
|
|
|
options.merge(text: options[:text].source)
|
|
|
|
else
|
|
|
|
options.merge(text: Regexp.escape(options[:text].to_s))
|
|
|
|
end.merge(original_text: options[:text])
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_modal(type, id, options)
|
|
|
|
Timeout::timeout(options[:wait] || Capybara.default_wait_time) do
|
2014-07-16 02:55:24 +00:00
|
|
|
browser.find_modal(id)
|
2014-07-03 22:21:21 +00:00
|
|
|
end
|
|
|
|
rescue ModalNotFound
|
|
|
|
raise Capybara::ModalNotFound,
|
|
|
|
"Unable to find modal dialog#{" with #{options[:original_text]}" if options[:original_text]}"
|
|
|
|
rescue Timeout::Error
|
|
|
|
raise Capybara::ModalNotFound,
|
|
|
|
"Timed out waiting for modal dialog#{" with #{options[:original_text]}" if options[:original_text]}"
|
|
|
|
end
|
2012-07-08 19:17:08 +00:00
|
|
|
end
|
|
|
|
end
|