class Capybara::Poltergeist::Browser

Constants

ERROR_MAPPINGS
KEY_ALIASES

Attributes

client[R]
logger[R]
server[R]

Public Class Methods

new(server, client, logger = nil) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 23
def initialize(server, client, logger = nil)
  @server = server
  @client = client
  @logger = logger
end

Public Instance Methods

accept_confirm() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 417
def accept_confirm
  command 'set_confirm_process', true
end
accept_prompt(response) click to toggle source

press “OK” with text (response) or default value

# File lib/capybara/poltergeist/browser.rb, line 428
def accept_prompt(response)
  command 'set_prompt_response', response || false
end
add_header(header, options={}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 316
def add_header(header, options={})
  command 'add_header', header, options
end
add_headers(headers) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 312
def add_headers(headers)
  command 'add_headers', headers
end
all_text(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 83
def all_text(page_id, id)
  command 'all_text', page_id, id
end
attribute(page_id, id, name) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 103
def attribute(page_id, id, name)
  command 'attribute', page_id, id, name.to_s
end
attributes(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 99
def attributes(page_id, id)
  command 'attributes', page_id, id
end
body() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 54
def body
  command 'body'
end
clear_cookies() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 340
def clear_cookies
  command 'clear_cookies'
end
clear_memory_cache() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 381
def clear_memory_cache
  command 'clear_memory_cache'
end
clear_network_traffic() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 289
def clear_network_traffic
  command('clear_network_traffic')
end
click(page_id, id, keys=[], offset={}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 207
def click(page_id, id, keys=[], offset={})
  command 'click', page_id, id, keys, offset
end
click_coordinates(x, y) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 131
def click_coordinates(x, y)
  command 'click_coordinates', x, y
end
close_window(handle) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 186
def close_window(handle)
  command 'close_window', handle
end
command(name, *args) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 385
def command(name, *args)
  cmd = Command.new(name, *args)
  log cmd.message

  response = server.send(cmd)
  log response

  json = JSON.load(response)

  if json['error']
    klass = ERROR_MAPPINGS[json['error']['name']] || BrowserError
    raise klass.new(json['error'])
  else
    json['response']
  end
rescue DeadClient
  restart
  raise
end
cookies() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 324
def cookies
  Hash[command('cookies').map { |cookie| [cookie['name'], Cookie.new(cookie)] }]
end
cookies_enabled=(flag) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 344
def cookies_enabled=(flag)
  command 'cookies_enabled', !!flag
end
current_url() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 42
def current_url
  command 'current_url'
end
debug=(val) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 376
def debug=(val)
  @debug = val
  command 'set_debug', !!val
end
delete_text(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 91
def delete_text(page_id, id)
  command 'delete_text', page_id, id
end
disabled?(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 127
def disabled?(page_id, id)
  command 'disabled', page_id, id
end
dismiss_confirm() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 421
def dismiss_confirm
  command 'set_confirm_process', false
end
dismiss_prompt() click to toggle source

press “Cancel”

# File lib/capybara/poltergeist/browser.rb, line 435
def dismiss_prompt
  command 'set_prompt_response', nil
end
double_click(page_id, id, keys=[], offset={}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 215
def double_click(page_id, id, keys=[], offset={})
  command 'double_click', page_id, id, keys, offset
end
drag(page_id, id, other_id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 223
def drag(page_id, id, other_id)
  command 'drag', page_id, id, other_id
end
drag_by(page_id, id, x, y) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 227
def drag_by(page_id, id, x, y)
  command 'drag_by', page_id, id, x, y
end
equals(page_id, id, other_id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 300
def equals(page_id, id, other_id)
  command('equals', page_id, id, other_id)
end
evaluate(script, *args) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 135
def evaluate(script, *args)
  command 'evaluate', script, *args
end
evaluate_async(script, wait_time, *args) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 139
def evaluate_async(script, wait_time, *args)
  command 'evaluate_async', script, wait_time, *args
end
execute(script, *args) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 143
def execute(script, *args)
  command 'execute', script, *args
end
extensions=(names) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 361
def extensions=(names)
  @extensions = names
  Array(names).each do |name|
    command 'add_extension', name
  end
end
find(method, selector) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 74
def find(method, selector)
  result = command('find', method, selector)
  result['ids'].map { |id| [result['page_id'], id] }
end
find_window_handle(locator) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 190
def find_window_handle(locator)
  return locator if window_handles.include? locator

  handle = command 'window_handle', locator
  raise NoSuchWindowError unless handle
  return handle
end
find_within(page_id, id, method, selector) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 79
def find_within(page_id, id, method, selector)
  command 'find_within', page_id, id, method, selector
end
frame_title() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 66
def frame_title
  command 'frame_title'
end
frame_url() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 46
def frame_url
  command 'frame_url'
end
get_headers() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 304
def get_headers
  command 'get_headers'
end
go_back() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 405
def go_back
  command 'go_back'
end
go_forward() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 409
def go_forward
  command 'go_forward'
end
hover(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 219
def hover(page_id, id)
  command 'hover', page_id, id
end
js_errors=(val) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 352
def js_errors=(val)
  @js_errors = val
  command 'set_js_errors', !!val
end
modal_message() click to toggle source
network_traffic(type = nil) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 279
def network_traffic(type = nil)
  command('network_traffic', type).map do |event|
    NetworkTraffic::Request.new(
      event['request'],
      event['responseParts'].map { |response| NetworkTraffic::Response.new(response) },
      event['error'] ? NetworkTraffic::Error.new(event['error']) : nil
    )
  end
end
open_new_window() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 182
def open_new_window
  command 'open_new_window'
end
page_settings=(settings) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 357
def page_settings=(settings)
  command 'set_page_settings', settings
end
parents(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 70
def parents(page_id, id)
  command 'parents', page_id, id
end
path(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 275
def path(page_id, id)
  command 'path', page_id, id
end
property(page_id, id, name) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 95
def property(page_id, id, name)
  command 'property', page_id, id, name.to_s
end
refresh() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 413
def refresh
  command 'refresh'
end
render(path, options = {}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 247
def render(path, options = {})
  check_render_options!(options)
  options[:full] = !!options[:full]
  command 'render', path.to_s, options
end
render_base64(format, options = {}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 253
def render_base64(format, options = {})
  check_render_options!(options)
  options[:full] = !!options[:full]
  command 'render_base64', format.to_s, options
end
reset() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 239
def reset
  command 'reset'
end
resize(width, height) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 267
def resize(width, height)
  command 'resize', width, height
end
response_headers() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 320
def response_headers
  command 'response_headers'
end
restart() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 29
def restart
  server.restart
  client.restart

  self.debug = @debug if defined?(@debug)
  self.js_errors = @js_errors if defined?(@js_errors)
  self.extensions = @extensions if @extensions
end
right_click(page_id, id, keys=[], offset={}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 211
def right_click(page_id, id, keys=[], offset={})
  command 'right_click', page_id, id, keys, offset
end
scroll_to(left, top) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 243
def scroll_to(left, top)
  command 'scroll_to', left, top
end
select(page_id, id, value) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 231
def select(page_id, id, value)
  command 'select', page_id, id, value
end
select_file(page_id, id, value) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 115
def select_file(page_id, id, value)
  command 'select_file', page_id, id, value
end
send_keys(page_id, id, keys) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 271
def send_keys(page_id, id, keys)
  command 'send_keys', page_id, id, normalize_keys(keys)
end
set(page_id, id, value) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 111
def set(page_id, id, value)
  command 'set', page_id, id, value
end
set_headers(headers) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 308
def set_headers(headers)
  command 'set_headers', headers
end
set_http_auth(user, password) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 348
def set_http_auth(user, password)
  command 'set_http_auth', user, password
end
set_paper_size(size) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 263
def set_paper_size(size)
  command 'set_paper_size', size
end
set_proxy(ip, port, type, user, password) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 293
def set_proxy(ip, port, type, user, password)
  args = [ip, port, type]
  args << user if user
  args << password if password
  command('set_proxy', *args)
end
set_zoom_factor(zoom_factor) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 259
def set_zoom_factor(zoom_factor)
  command 'set_zoom_factor', zoom_factor
end
source() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 58
def source
  command 'source'
end
status_code() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 50
def status_code
  command 'status_code'
end
switch_to_frame(handle) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 159
def switch_to_frame(handle)
  case handle
  when Capybara::Node::Base
    command 'push_frame', [handle.native.page_id, handle.native.id]
  when :parent
    command 'pop_frame'
  when :top
    command 'pop_frame', true
  end
end
switch_to_window(handle) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 178
def switch_to_window(handle)
  command 'switch_to_window', handle
end
tag_name(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 119
def tag_name(page_id, id)
  command('tag_name', page_id, id).downcase
end
title() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 62
def title
  command 'title'
end
trigger(page_id, id, event) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 235
def trigger(page_id, id, event)
  command 'trigger', page_id, id, event.to_s
end
url_blacklist=(blacklist) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 372
def url_blacklist=(blacklist)
  command 'set_url_blacklist', *blacklist
end
url_whitelist=(whitelist) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 368
def url_whitelist=(whitelist)
  command 'set_url_whitelist', *whitelist
end
value(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 107
def value(page_id, id)
  command 'value', page_id, id
end
visible?(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 123
def visible?(page_id, id)
  command 'visible', page_id, id
end
visible_text(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 87
def visible_text(page_id, id)
  command 'visible_text', page_id, id
end
visit(url) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 38
def visit(url)
  command 'visit', url
end
window_handle() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 170
def window_handle
  command 'window_handle'
end
window_handles() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 174
def window_handles
  command 'window_handles'
end
within_frame(handle) { || ... } click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 147
def within_frame(handle, &block)
  if handle.is_a?(Capybara::Node::Base)
    command 'push_frame', [handle.native.page_id, handle.native.id]
  else
    command 'push_frame', handle
  end

  yield
ensure
  command 'pop_frame'
end
within_window(locator) { || ... } click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 198
def within_window(locator, &block)
  original = window_handle
  handle = find_window_handle(locator)
  switch_to_window(handle)
  yield
ensure
  switch_to_window(original)
end

Private Instance Methods

check_render_options!(options) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 449
def check_render_options!(options)
  if !!options[:full] && options.has_key?(:selector)
    warn "Ignoring :selector in #render since :full => true was given at #{caller.first}"
    options.delete(:selector)
  end
end
log(message) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 445
def log(message)
  logger.puts message if logger
end
normalize_keys(keys) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 468
def normalize_keys(keys)
  keys.map do |key_desc|
    case key_desc
    when Array
      # [:Shift, "s"] => { modifier: "shift", keys: "S" }
      # [:Shift, "string"] => { modifier: "shift", keys: "STRING" }
      # [:Ctrl, :Left] => { modifier: "ctrl", key: 'Left' }
      # [:Ctrl, :Shift, :Left] => { modifier: "ctrl,shift", key: 'Left' }
      # [:Ctrl, :Left, :Left] => { modifier: "ctrl", key: [:Left, :Left] }
      _keys = key_desc.chunk {|k| k.is_a?(Symbol) && %w(shift ctrl control alt meta command).include?(k.to_s.downcase) }
      modifiers = if _keys.peek[0]
        _keys.next[1].map do |k|
          k = k.to_s.downcase
          k = 'ctrl' if k == 'control'
          k = 'meta' if k == 'command'
          k
        end.join(',')
      else
        ''
      end
      letters = normalize_keys(_keys.next[1].map {|k| k.is_a?(String) ? k.upcase : k })
      { modifier: modifiers, keys: letters }
    when Symbol
      # Return a known sequence for PhantomJS
      key = KEY_ALIASES.fetch(key_desc, key_desc)
      if match = key.to_s.match(/numpad(.)/)
        res = { keys: match[1], modifier: 'keypad' }
      elsif key !~ /^[A-Z]/
        key = key.to_s.split('_').map{ |e| e.capitalize }.join
      end
      res || { key: key }
    when String
      key_desc # Plain string, nothing to do
    end
  end
end