class Capybara::Cuprite::Driver

Constants

DEFAULT_MAXIMIZE_SCREEN_SIZE
EXTENSION

Attributes

app[R]
options[R]
screen_size[R]

Public Class Methods

new(app, options = {}) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 17
def initialize(app, options = {})
  @app     = app
  @options = options.dup
  @started = false

  @options[:extensions] ||= []
  @options[:extensions] << EXTENSION

  @screen_size = @options.delete(:screen_size)
  @screen_size ||= DEFAULT_MAXIMIZE_SCREEN_SIZE

  @options[:save_path] = Capybara.save_path.to_s if Capybara.save_path

  ENV["FERRUM_DEBUG"] = "true" if ENV["CUPRITE_DEBUG"]
end

Public Instance Methods

accept_modal(type, options = {}) { || ... } click to toggle source
# File lib/capybara/cuprite/driver.rb, line 387
def accept_modal(type, options = {})
  case type
  when :alert, :confirm
    browser.accept_confirm
  when :prompt
    browser.accept_prompt(options[:with])
  end

  yield if block_given?

  browser.find_modal(options)
end
add_header(name, value, permanent: true) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 263
def add_header(name, value, permanent: true)
  browser.headers.add({ name => value }, permanent: permanent)
end
add_headers(headers) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 259
def add_headers(headers)
  browser.headers.add(headers)
end
authorize(user, password)
Alias for: basic_authorize
basic_authorize(user, password) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 300
def basic_authorize(user, password)
  browser.network.authorize(user: user, password: password) do |request|
    request.continue
  end
end
Also aliased as: authorize
body()
Alias for: html
browser() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 37
def browser
  @browser ||= Browser.new(@options)
end
clear_cookies() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 288
def clear_cookies
  browser.cookies.clear
end
clear_memory_cache() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 296
def clear_memory_cache
  browser.network.clear(:cache)
end
clear_network_traffic() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 237
def clear_network_traffic
  browser.network.clear(:traffic)
end
click(x, y) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 91
def click(x, y)
  browser.mouse.click(x: x, y: y)
end
close_window(handle) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 129
def close_window(handle)
  browser.close_window(handle)
end
cookies() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 271
def cookies
  browser.cookies.all
end
current_url() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 46
def current_url
  if Capybara::VERSION.to_f < 3.0
    frame_url
  else
    browser.current_url
  end
end
current_window_handle() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 121
def current_window_handle
  browser.window_handle
end
debug(binding = nil) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 311
def debug(binding = nil)
  if @options[:inspector]
    Process.spawn(browser.process.path, debug_url)

    if binding&.respond_to?(:pry)
      Pry.start(binding)
    elsif binding&.respond_to?(:irb)
      binding.irb
    else
      pause
    end
  else
    raise Error, "To use the remote debugging, you have to launch " \
                 "the driver with `inspector: ENV['INSPECTOR']` " \
                 "configuration option and run your test suite passing " \
                 "env variable"
  end
end
debug_url() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 307
def debug_url
  "http://#{browser.process.host}:#{browser.process.port}"
end
dismiss_modal(type, options = {}) { || ... } click to toggle source
# File lib/capybara/cuprite/driver.rb, line 400
def dismiss_modal(type, options = {})
  case type
  when :confirm
    browser.dismiss_confirm
  when :prompt
    browser.dismiss_prompt
  end

  yield if block_given?

  browser.find_modal(options)
end
evaluate_async_script(script, *args) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 100
def evaluate_async_script(script, *args)
  result = browser.evaluate_async(script, session_wait_time, *native_args(args))
  unwrap_script_result(result)
end
evaluate_script(script, *args) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 95
def evaluate_script(script, *args)
  result = browser.evaluate(script, *native_args(args))
  unwrap_script_result(result)
end
execute_script(script, *args) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 105
def execute_script(script, *args)
  browser.execute(script, *native_args(args))
  nil
end
find(method, selector) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 87
def find(method, selector)
  browser.find(method, selector).map { |native| Node.new(self, native) }
end
find_css(selector) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 83
def find_css(selector)
  find(:css, selector)
end
find_xpath(selector) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 79
def find_xpath(selector)
  find(:xpath, selector)
end
frame_title() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 75
def frame_title
  evaluate_script("document.title")
end
frame_url() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 54
def frame_url
  evaluate_script("window.location.href")
end
fullscreen_window(handle) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 213
def fullscreen_window(handle)
  within_window(handle) do
    browser.resize(fullscreen: true)
  end
end
go_back() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 371
def go_back
  browser.back
end
go_forward() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 375
def go_forward
  browser.forward
end
headers() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 251
def headers
  browser.headers.get
end
headers=(headers) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 255
def headers=(headers)
  browser.headers.set(headers)
end
html() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 58
def html
  browser.body
end
Also aliased as: body
invalid_element_errors() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 363
def invalid_element_errors
  [Capybara::Cuprite::ObsoleteNode,
   Capybara::Cuprite::MouseEventFailed,
   Ferrum::CoordinatesNotFoundError,
   Ferrum::NoExecutionContextError,
   Ferrum::NodeNotFoundError]
end
maximize_window(handle) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 203
def maximize_window(handle)
  resize_window_to(handle, *screen_size)
end
needs_server?() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 33
def needs_server?
  true
end
network_traffic(type = nil) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 223
def network_traffic(type = nil)
  traffic = browser.network.traffic

  case type.to_s
  when "all"
    traffic
  when "blocked"
    traffic.select(&:blocked?)
  else
    # when request isn't blocked
    traffic.reject(&:blocked?)
  end
end
no_such_window_error() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 148
def no_such_window_error
  Ferrum::NoSuchPageError
end
open_new_window() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 133
def open_new_window
  target = browser.default_context.create_target
  target.maybe_sleep_if_new_window
  target.page = Page.new(target.id, browser)
  target.page
end
paper_size=(value) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 188
def paper_size=(value)
  @paper_size = value
end
pause() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 330
def pause
  # STDIN is not necessarily connected to a keyboard. It might even be closed.
  # So we need a method other than keypress to continue.

  # In jRuby - STDIN returns immediately from select
  # see https://github.com/jruby/jruby/issues/1783
  read, write = IO.pipe
  thread = Thread.new { IO.copy_stream(STDIN, write); write.close }

  STDERR.puts "Cuprite execution paused. Press enter (or run 'kill -CONT #{Process.pid}') to continue."

  signal = false
  old_trap = trap("SIGCONT") { signal = true; STDERR.puts "\nSignal SIGCONT received" }
  keyboard = IO.select([read], nil, nil, 1) until keyboard || signal # wait for data on STDIN or signal SIGCONT received

  unless signal
    begin
      input = read.read_nonblock(80) # clear out the read buffer
      puts unless input&.end_with?("\n")
    rescue EOFError, IO::WaitReadable # Ignore problems reading from STDIN.
    end
  end
ensure
  thread.kill
  read.close
  trap("SIGCONT", old_trap) # Restore the previous signal handler, if there was one.
  STDERR.puts "Continuing"
end
refresh() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 379
def refresh
  browser.refresh
end
render(path, options = {})
Alias for: save_screenshot
render_base64(format = :png, options = {}) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 174
def render_base64(format = :png, options = {})
  if pdf?(nil, options)
    options[:paperWidth] = @paper_size[:width].to_f if @paper_size
    options[:paperHeight] = @paper_size[:height].to_f if @paper_size
    browser.pdf(encoding: :base64, **options)
  else
    browser.screenshot(format: format, encoding: :base64, **options)
  end
end
reset!() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 152
def reset!
  @zoom_factor = nil
  @paper_size = nil
  browser.url_blacklist = @options[:url_blacklist]
  browser.url_whitelist = @options[:url_whitelist]
  browser.reset
  @started = false
end
resize(width, height) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 192
def resize(width, height)
  browser.resize(width: width, height: height)
end
Also aliased as: resize_window
resize_window(width, height)
Alias for: resize
resize_window_to(handle, width, height) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 197
def resize_window_to(handle, width, height)
  within_window(handle) do
    resize(width, height)
  end
end
response_headers() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 267
def response_headers
  browser.network.response&.headers
end
save_screenshot(path, options = {}) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 161
def save_screenshot(path, options = {})
  options[:scale] = @zoom_factor if @zoom_factor

  if pdf?(path, options)
    options[:paperWidth] = @paper_size[:width].to_f if @paper_size
    options[:paperHeight] = @paper_size[:height].to_f if @paper_size
    browser.pdf(path: path, **options)
  else
    browser.screenshot(path: path, **options)
  end
end
Also aliased as: render
scroll_to(left, top) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 219
def scroll_to(left, top)
  browser.mouse.scroll_to(left, top)
end
set_proxy(ip, port, type = nil, user = nil, password = nil, bypass = nil) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 241
def set_proxy(ip, port, type = nil, user = nil, password = nil, bypass = nil)
  @options[:browser_options] ||= {}
  server = type ? "#{type}=#{ip}:#{port}" : "#{ip}:#{port}"
  @options[:browser_options].merge!("proxy-server" => server)
  @options[:browser_options].merge!("proxy-bypass-list" => bypass) if bypass
  browser.network.authorize(type: :proxy, user: user, password: password) do |request|
    request.continue
  end
end
source() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 63
def source
  browser.source.to_s
end
switch_to_frame(locator) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 110
def switch_to_frame(locator)
  handle = case locator
  when Capybara::Node::Element
    locator.native.description["frameId"]
  when :parent, :top
    locator
  end

  browser.switch_to_frame(handle)
end
switch_to_window(handle) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 140
def switch_to_window(handle)
  browser.switch_to_window(handle)
end
title() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 67
def title
  if Capybara::VERSION.to_f < 3.0
    frame_title
  else
    browser.title
  end
end
visit(url) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 41
def visit(url)
  @started = true
  browser.visit(url)
end
wait?() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 359
def wait?
  true
end
wait_for_network_idle(**options) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 292
def wait_for_network_idle(**options)
  browser.network.wait_for_idle(**options)
end
wait_for_reload(*args) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 383
def wait_for_reload(*args)
  browser.wait_for_reload(*args)
end
window_handles() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 125
def window_handles
  browser.window_handles
end
window_size(handle) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 207
def window_size(handle)
  within_window(handle) do
    evaluate_script("[window.innerWidth, window.innerHeight]")
  end
end
within_window(name, &block) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 144
def within_window(name, &block)
  browser.within_window(name, &block)
end
zoom_factor=(value) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 184
def zoom_factor=(value)
  @zoom_factor = value.to_f
end

Private Instance Methods

default_domain() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 415
def default_domain
  if @started
    URI.parse(browser.current_url).host
  else
    URI.parse(default_cookie_host).host || "127.0.0.1"
  end
end
native_args(args) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 423
def native_args(args)
  args.map { |arg| arg.is_a?(Capybara::Cuprite::Node) ? arg.node : arg }
end
pdf?(path, options) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 460
def pdf?(path, options)
  (path && File.extname(path).delete(".") == "pdf") ||
  options[:format].to_s == "pdf"
end
session_wait_time() click to toggle source
# File lib/capybara/cuprite/driver.rb, line 427
def session_wait_time
  if respond_to?(:session_options)
    session_options.default_max_wait_time
  else
    begin
      Capybara.default_max_wait_time
    rescue
      Capybara.default_wait_time
    end
  end
end
unwrap_script_result(arg) click to toggle source
# File lib/capybara/cuprite/driver.rb, line 447
def unwrap_script_result(arg)
  case arg
  when Array
    arg.map { |e| unwrap_script_result(e) }
  when Hash
    arg.each { |k, v| arg[k] = unwrap_script_result(v) }
  when Ferrum::Node
    Node.new(self, arg)
  else
    arg
  end
end