class Capybara::Poltergeist::Driver

Constants

DEFAULT_TIMEOUT

Attributes

app[R]
options[R]

Public Class Methods

new(app, options = {}) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 10
def initialize(app, options = {})
  @app       = app
  @options   = options
  @browser   = nil
  @inspector = nil
  @server    = nil
  @client    = nil
  @started   = false
end

Public Instance Methods

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

  yield if block_given?

  find_modal(options)
end
add_header(name, value, options = {}) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 279
def add_header(name, value, options = {})
  browser.add_header({ name => value }, { permanent: true }.merge(options))
end
add_headers(headers) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 275
def add_headers(headers)
  browser.add_headers(headers)
end
basic_authorize(user, password) click to toggle source
  • PhantomJS with set settings doesn't send `Authorize` on POST request

  • With manually set header PhantomJS makes next request with

`Authorization: Basic Og==` header when settings are empty and the response was `401 Unauthorized` (which means Base64.encode64(':')). Combining both methods to reach proper behavior.

# File lib/capybara/poltergeist/driver.rb, line 326
def basic_authorize(user, password)
  browser.set_http_auth(user, password)
  credentials = ["#{user}:#{password}"].pack('m*').strip
  add_header('Authorization', "Basic #{credentials}")
end
body()
Alias for: html
browser() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 24
def browser
  @browser ||= begin
    browser = Browser.new(server, client, logger)
    browser.js_errors  = options[:js_errors] if options.key?(:js_errors)
    browser.extensions = options.fetch(:extensions, [])
    browser.debug      = true if options[:debug]
    browser.url_blacklist = options[:url_blacklist] if options.key?(:url_blacklist)
    browser.url_whitelist = options[:url_whitelist] if options.key?(:url_whitelist)
    browser.page_settings = options[:page_settings] if options.key?(:page_settings)
    browser
  end
end
clear_cookies() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 309
def clear_cookies
  browser.clear_cookies
end
clear_memory_cache() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 317
def clear_memory_cache
  browser.clear_memory_cache
end
clear_network_traffic() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 259
def clear_network_traffic
  browser.clear_network_traffic
end
click(x, y) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 151
def click(x, y)
  browser.click_coordinates(x, y)
end
client() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 45
def client
  @client ||= Client.start(server,
    :path              => options[:phantomjs],
    :window_size       => options[:window_size],
    :phantomjs_options => phantomjs_options,
    :phantomjs_logger  => phantomjs_logger
  )
end
client_pid() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 66
def client_pid
  client.pid
end
close_window(handle) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 186
def close_window(handle)
  browser.close_window(handle)
end
cookies() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 287
def cookies
  browser.cookies
end
cookies_enabled=(flag) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 313
def cookies_enabled=(flag)
  browser.cookies_enabled = flag
end
current_url() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 102
def current_url
  if Capybara::VERSION.to_f < 3.0
    frame_url
  else
    browser.current_url.gsub(' ', '%20') # PhantomJS < 2.1 doesn't escape spaces
  end
end
current_window_handle() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 178
def current_window_handle
  browser.window_handle
end
debug() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 332
def debug
  if @options[:inspector]
    # Fall back to default scheme
    scheme = URI.parse(browser.current_url).scheme rescue nil
    scheme = 'http' if scheme != 'https'
    inspector.open(scheme)
    pause
  else
    raise Error, "To use the remote debugging, you have to launch the driver " \
                 "with `:inspector => true` configuration option"
  end
end
dismiss_modal(type, options = {}) { || ... } click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 404
def dismiss_modal(type, options = {})
  case type
  when :confirm
    browser.dismiss_confirm
  when :prompt
    browser.dismiss_prompt
  end

  yield if block_given?
  find_modal(options)
end
evaluate_async_script(script, *args) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 160
def evaluate_async_script(script, *args)
  result = browser.evaluate_async(script, session_wait_time, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ?  arg.native : arg})
  unwrap_script_result(result)
end
evaluate_script(script, *args) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 155
def evaluate_script(script, *args)
  result = browser.evaluate(script, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ?  arg.native : arg})
  unwrap_script_result(result)
end
execute_script(script, *args) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 165
def execute_script(script, *args)
  browser.execute(script, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ?  arg.native : arg})
  nil
end
find(method, selector) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 139
def find(method, selector)
  browser.find(method, selector).map { |page_id, id| Capybara::Poltergeist::Node.new(self, page_id, id) }
end
find_css(selector) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 147
def find_css(selector)
  find :css, selector
end
find_xpath(selector) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 143
def find_xpath(selector)
  find :xpath, selector
end
frame_title() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 135
def frame_title
  browser.frame_title
end
frame_url() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 110
def frame_url
  browser.frame_url.gsub(' ', '%20') # PhantomJS < 2.1 doesn't escape spaces
end
go_back() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 379
def go_back
  browser.go_back
end
go_forward() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 383
def go_forward
  browser.go_forward
end
headers() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 267
def headers
  browser.get_headers
end
headers=(headers) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 271
def headers=(headers)
  browser.set_headers(headers)
end
html() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 118
def html
  browser.body
end
Also aliased as: body
inspector() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 37
def inspector
  @inspector ||= options[:inspector] && Inspector.new(options[:inspector])
end
invalid_element_errors() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 375
def invalid_element_errors
  [Capybara::Poltergeist::ObsoleteNode, Capybara::Poltergeist::MouseEventFailed]
end
logger() click to toggle source

logger should be an object that responds to puts, or nil

# File lib/capybara/poltergeist/driver.rb, line 88
def logger
  options[:logger] || (options[:debug] && STDERR)
end
maximize_window(handle) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 241
def maximize_window(handle)
  resize_window_to(handle, *screen_size)
end
needs_server?() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 20
def needs_server?
  true
end
network_traffic(type = nil) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 255
def network_traffic(type = nil)
  browser.network_traffic(type)
end
no_such_window_error() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 202
def no_such_window_error
  NoSuchWindowError
end
open_new_window() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 190
def open_new_window
  browser.open_new_window
end
paper_size=(size = {}) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 222
def paper_size=(size = {})
  browser.set_paper_size(size)
end
pause() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 345
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.new { IO.copy_stream(STDIN, write); write.close }

  STDERR.puts "Poltergeist 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

  begin
    input = read.read_nonblock(80) # clear out the read buffer
    puts unless input && input =~ /\n\z/
  rescue EOFError, IO::WaitReadable # Ignore problems reading from STDIN.
  end unless signal

ensure
  trap('SIGCONT', old_trap) # Restore the previous signal handler, if there was one.
  STDERR.puts 'Continuing'
end
phantomjs_logger() click to toggle source

logger should be an object that behaves like IO or nil

# File lib/capybara/poltergeist/driver.rb, line 93
def phantomjs_logger
  options.fetch(:phantomjs_logger, nil)
end
phantomjs_options() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 54
def phantomjs_options
  list = options[:phantomjs_options] || []

  # PhantomJS defaults to only using SSLv3, which since POODLE (Oct 2014)
  # many sites have dropped from their supported protocols (eg PayPal,
  # Braintree).
  list += ["--ignore-ssl-errors=yes"] unless list.grep(/ignore-ssl-errors/).any?
  list += ["--ssl-protocol=TLSv1"] unless list.grep(/ssl-protocol/).any?
  list += ["--remote-debugger-port=#{inspector.port}", "--remote-debugger-autorun=yes"] if inspector
  list
end
quit() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 82
def quit
  server.stop
  client.stop
end
refresh() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 387
def refresh
  browser.refresh
end
render(path, options = {})
Alias for: save_screenshot
render_base64(format = :png, options = {}) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 218
def render_base64(format = :png, options = {})
  browser.render_base64(format, options)
end
reset!() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 206
def reset!
  browser.reset
  browser.url_blacklist = options[:url_blacklist] if options.key?(:url_blacklist)
  browser.url_whitelist = options[:url_whitelist] if options.key?(:url_whitelist)
  @started = false
end
resize(width, height) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 230
def resize(width, height)
  browser.resize(width, 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/poltergeist/driver.rb, line 235
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/poltergeist/driver.rb, line 283
def response_headers
  browser.response_headers
end
restart() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 78
def restart
  browser.restart
end
save_screenshot(path, options = {}) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 213
def save_screenshot(path, options = {})
  browser.render(path, options)
end
Also aliased as: render
scroll_to(left, top) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 251
def scroll_to(left, top)
  browser.scroll_to(left, top)
end
server() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 41
def server
  @server ||= Server.new(options[:port], options.fetch(:timeout) { DEFAULT_TIMEOUT }, options[:host])
end
set_proxy(ip, port, type = "http", user = nil, password = nil) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 263
def set_proxy(ip, port, type = "http", user = nil, password = nil)
  browser.set_proxy(ip, port, type, user, password)
end
source() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 123
def source
  browser.source.to_s
end
status_code() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 114
def status_code
  browser.status_code
end
switch_to_frame(locator) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 174
def switch_to_frame(locator)
  browser.switch_to_frame(locator)
end
switch_to_window(handle) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 194
def switch_to_window(handle)
  browser.switch_to_window(handle)
end
timeout() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 70
def timeout
  server.timeout
end
timeout=(sec) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 74
def timeout=(sec)
  server.timeout = sec
end
title() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 127
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/poltergeist/driver.rb, line 97
def visit(url)
  @started = true
  browser.visit(url)
end
wait?() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 371
def wait?
  true
end
window_handles() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 182
def window_handles
  browser.window_handles
end
window_size(handle) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 245
def window_size(handle)
  within_window(handle) do
    evaluate_script('[window.innerWidth, window.innerHeight]')
  end
end
within_frame(name, &block) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 170
def within_frame(name, &block)
  browser.within_frame(name, &block)
end
within_window(name, &block) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 198
def within_window(name, &block)
  browser.within_window(name, &block)
end
zoom_factor=(zoom_factor) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 226
def zoom_factor=(zoom_factor)
  browser.set_zoom_factor(zoom_factor)
end

Private Instance Methods

find_modal(options) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 422
def find_modal(options)
  start_time    = Time.now
  timeout_sec   = options.fetch(:wait) { session_wait_time }
  expect_text   = options[:text]
  expect_regexp = expect_text.is_a?(Regexp) ? expect_text : Regexp.escape(expect_text.to_s)
  not_found_msg = 'Unable to find modal dialog'
  not_found_msg += " with #{expect_text}" if expect_text

  begin
    modal_text = browser.modal_message
    raise Capybara::ModalNotFound if modal_text.nil? || (expect_text && !modal_text.match(expect_regexp))
  rescue Capybara::ModalNotFound => e
    raise e, not_found_msg if (Time.now - start_time) >= timeout_sec
    sleep(0.05)
    retry
  end
  modal_text
end
screen_size() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 418
def screen_size
  options[:screen_size] || [1366,768]
end
session_wait_time() click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 441
  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

  def default_cookie_host
    if respond_to?(:session_options)
      session_options.app_host
    else
      Capybara.app_host
    end || ''
  end

  def unwrap_script_result(arg)
    case arg
    when Array
      arg.map { |e| unwrap_script_result(e) }
    when Hash
      return Capybara::Poltergeist::Node.new(self, arg['ELEMENT']['page_id'], arg['ELEMENT']['id']) if arg['ELEMENT']
      arg.each { |k, v| arg[k] = unwrap_script_result(v) }
    else
      arg
    end
  end
end
unwrap_script_result(arg) click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 457
def unwrap_script_result(arg)
  case arg
  when Array
    arg.map { |e| unwrap_script_result(e) }
  when Hash
    return Capybara::Poltergeist::Node.new(self, arg['ELEMENT']['page_id'], arg['ELEMENT']['id']) if arg['ELEMENT']
    arg.each { |k, v| arg[k] = unwrap_script_result(v) }
  else
    arg
  end
end