1
require "capybara/poltergeist/errors"
2
require "capybara/poltergeist/command"
6
module Capybara::Poltergeist
9
'Poltergeist.JavascriptError' => JavascriptError,
10
'Poltergeist.FrameNotFound' => FrameNotFound,
11
'Poltergeist.InvalidSelector' => InvalidSelector,
12
'Poltergeist.StatusFailError' => StatusFailError,
13
'Poltergeist.NoSuchWindowError' => NoSuchWindowError,
14
'Poltergeist.UnsupportedFeature' => UnsupportedFeature
17
attr_reader :server, :client, :logger
19
def initialize(server, client, logger = nil)
29
self.debug = @debug if defined?(@debug)
30
self.js_errors = @js_errors if defined?(@js_errors)
31
self.extensions = @extensions if @extensions
58
def parents(page_id, id)
59
command 'parents', page_id, id
62
def find(method, selector)
63
result = command('find', method, selector)
64
result['ids'].map { |id| [result['page_id'], id] }
67
def find_within(page_id, id, method, selector)
68
command 'find_within', page_id, id, method, selector
71
def all_text(page_id, id)
72
command 'all_text', page_id, id
75
def visible_text(page_id, id)
76
command 'visible_text', page_id, id
79
def delete_text(page_id, id)
80
command 'delete_text', page_id, id
83
def property(page_id, id, name)
84
command 'property', page_id, id, name.to_s
87
def attributes(page_id, id)
88
command 'attributes', page_id, id
91
def attribute(page_id, id, name)
92
command 'attribute', page_id, id, name.to_s
95
def value(page_id, id)
96
command 'value', page_id, id
99
def set(page_id, id, value)
100
command 'set', page_id, id, value
103
def select_file(page_id, id, value)
104
command 'select_file', page_id, id, value
107
def tag_name(page_id, id)
108
command('tag_name', page_id, id).downcase
111
def visible?(page_id, id)
112
command 'visible', page_id, id
115
def disabled?(page_id, id)
116
command 'disabled', page_id, id
119
def click_coordinates(x, y)
120
command 'click_coordinates', x, y
124
command 'evaluate', script
128
command 'execute', script
131
def within_frame(handle, &block)
132
if handle.is_a?(Capybara::Node::Base)
133
command 'push_frame', [handle.native.page_id, handle.native.id]
135
command 'push_frame', handle
144
command 'window_handle'
148
command 'window_handles'
151
def switch_to_window(handle)
152
command 'switch_to_window', handle
156
command 'open_new_window'
159
def close_window(handle)
160
command 'close_window', handle
163
def find_window_handle(locator)
164
return locator if window_handles.include? locator
166
handle = command 'window_handle', locator
167
raise NoSuchWindowError unless handle
171
def within_window(locator, &block)
172
original = window_handle
173
handle = find_window_handle(locator)
174
switch_to_window(handle)
177
switch_to_window(original)
180
def click(page_id, id)
181
command 'click', page_id, id
184
def right_click(page_id, id)
185
command 'right_click', page_id, id
188
def double_click(page_id, id)
189
command 'double_click', page_id, id
192
def hover(page_id, id)
193
command 'hover', page_id, id
196
def drag(page_id, id, other_id)
197
command 'drag', page_id, id, other_id
200
def drag_by(page_id, id, x, y)
201
command 'drag_by', page_id, id, x, y
204
def select(page_id, id, value)
205
command 'select', page_id, id, value
208
def trigger(page_id, id, event)
209
command 'trigger', page_id, id, event.to_s
216
def scroll_to(left, top)
217
command 'scroll_to', left, top
220
def render(path, options = {})
221
check_render_options!(options)
222
options[:full] = !!options[:full]
223
command 'render', path.to_s, options
226
def render_base64(format, options = {})
227
check_render_options!(options)
228
options[:full] = !!options[:full]
229
command 'render_base64', format.to_s, options
232
def set_zoom_factor(zoom_factor)
233
command 'set_zoom_factor', zoom_factor
236
def set_paper_size(size)
237
command 'set_paper_size', size
240
def resize(width, height)
241
command 'resize', width, height
244
def send_keys(page_id, id, keys)
245
command 'send_keys', page_id, id, normalize_keys(keys)
248
def path(page_id, id)
249
command 'path', page_id, id
253
command('network_traffic').values.map do |event|
254
NetworkTraffic::Request.new(
256
event['responseParts'].map { |response| NetworkTraffic::Response.new(response) },
257
event['error'] ? NetworkTraffic::Error.new(event['error']) : nil
262
def clear_network_traffic
263
command('clear_network_traffic')
266
def set_proxy(ip, port, type, user, password)
267
args = [ip, port, type]
269
args << password if password
270
command('set_proxy', *args)
273
def equals(page_id, id, other_id)
274
command('equals', page_id, id, other_id)
278
command 'get_headers'
281
def set_headers(headers)
282
command 'set_headers', headers
285
def add_headers(headers)
286
command 'add_headers', headers
289
def add_header(header, permanent)
290
command 'add_header', header, permanent
294
command 'response_headers'
298
Hash[command('cookies').map { |cookie| [cookie['name'], Cookie.new(cookie)] }]
301
def set_cookie(cookie)
303
cookie[:expires] = cookie[:expires].to_i * 1000
306
command 'set_cookie', cookie
309
def remove_cookie(name)
310
command 'remove_cookie', name
314
command 'clear_cookies'
317
def cookies_enabled=(flag)
318
command 'cookies_enabled', !!flag
321
def set_http_auth(user, password)
322
command 'set_http_auth', user, password
327
command 'set_js_errors', !!val
330
def extensions=(names)
332
Array(names).each do |name|
333
command 'add_extension', name
337
def url_whitelist=(whitelist)
338
command 'set_url_whitelist', *whitelist
341
def url_blacklist=(blacklist)
342
command 'set_url_blacklist', *blacklist
347
command 'set_debug', !!val
350
def clear_memory_cache
351
command 'clear_memory_cache'
354
def command(name, *args)
355
cmd = Command.new(name, *args)
358
response = server.send(cmd)
361
json = JSON.load(response)
364
klass = ERROR_MAPPINGS[json['error']['name']] || BrowserError
365
raise klass.new(json['error'])
383
command 'set_confirm_process', true
387
command 'set_confirm_process', false
391
# press "OK" with text (response) or default value
393
def accept_prompt(response)
394
command 'set_prompt_response', response || false
401
command 'set_prompt_response', nil
405
command 'modal_message'
411
logger.puts message if logger
414
def check_render_options!(options)
415
if !!options[:full] && options.has_key?(:selector)
416
warn "Ignoring :selector in #render since :full => true was given at #{caller.first}"
417
options.delete(:selector)
421
def normalize_keys(keys)
425
# [:Shift, "s"] => { modifier: "shift", key: "S" }
426
# [:Ctrl, :Left] => { modifier: "ctrl", key: :Left }
427
# [:Ctrl, :Shift, :Left] => { modifier: "ctrl,shift", key: :Left }
429
symbol = key[0...-1].map { |k| k.to_s.downcase }.join(',')
431
{ modifier: symbol.to_s.downcase, key: letter.capitalize }
433
{ key: key.capitalize } # Return a known sequence for PhantomJS
435
key # Plain string, nothing to do