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 22
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 416
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 427
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 315
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 311
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 82
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 102
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 98
def attributes(page_id, id)
  command 'attributes', page_id, id
end
body() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 53
def body
  command 'body'
end
clear_cookies() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 339
def clear_cookies
  command 'clear_cookies'
end
clear_memory_cache() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 380
def clear_memory_cache
  command 'clear_memory_cache'
end
clear_network_traffic() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 288
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 206
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 130
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 185
def close_window(handle)
  command 'close_window', handle
end
command(name, *args) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 384
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 323
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 343
def cookies_enabled=(flag)
  command 'cookies_enabled', !!flag
end
current_url() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 41
def current_url
  command 'current_url'
end
debug=(val) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 375
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 90
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 126
def disabled?(page_id, id)
  command 'disabled', page_id, id
end
dismiss_confirm() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 420
def dismiss_confirm
  command 'set_confirm_process', false
end
dismiss_prompt() click to toggle source

press “Cancel”

# File lib/capybara/poltergeist/browser.rb, line 434
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 214
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 222
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 226
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 299
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 134
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 138
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 142
def execute(script, *args)
  command 'execute', script, *args
end
extensions=(names) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 360
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 73
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 189
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 78
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 65
def frame_title
  command 'frame_title'
end
frame_url() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 45
def frame_url
  command 'frame_url'
end
get_headers() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 303
def get_headers
  command 'get_headers'
end
go_back() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 404
def go_back
  command 'go_back'
end
go_forward() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 408
def go_forward
  command 'go_forward'
end
hover(page_id, id) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 218
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 351
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 278
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 181
def open_new_window
  command 'open_new_window'
end
page_settings=(settings) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 356
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 69
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 274
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 94
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 412
def refresh
  command 'refresh'
end
render(path, options = {}) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 246
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 252
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 238
def reset
  command 'reset'
end
resize(width, height) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 266
def resize(width, height)
  command 'resize', width, height
end
response_headers() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 319
def response_headers
  command 'response_headers'
end
restart() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 28
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 210
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 242
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 230
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 114
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 270
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 110
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 307
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 347
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 262
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 292
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 258
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 57
def source
  command 'source'
end
status_code() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 49
def status_code
  command 'status_code'
end
switch_to_frame(handle) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 158
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 177
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 118
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 61
def title
  command 'title'
end
trigger(page_id, id, event) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 234
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 371
def url_blacklist=(blacklist)
  command 'set_url_blacklist', *blacklist
end
url_whitelist=(whitelist) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 367
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 106
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 122
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 86
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 37
def visit(url)
  command 'visit', url
end
window_handle() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 169
def window_handle
  command 'window_handle'
end
window_handles() click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 173
def window_handles
  command 'window_handles'
end
within_frame(handle) { || ... } click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 146
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 197
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 448
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 444
def log(message)
  logger.puts message if logger
end
normalize_keys(keys) click to toggle source
# File lib/capybara/poltergeist/browser.rb, line 467
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