1
0
Fork 0
mirror of https://github.com/teampoltergeist/poltergeist.git synced 2022-11-09 12:05:00 -05:00
teampoltergeist--poltergeist/lib/capybara/poltergeist/browser.rb

236 lines
4.6 KiB
Ruby
Raw Normal View History

require "capybara/poltergeist/errors"
require 'json'
require 'time'
2011-10-27 23:34:14 +01:00
module Capybara::Poltergeist
class Browser
ERROR_MAPPINGS = {
"Poltergeist.JavascriptError" => JavascriptError,
"Poltergeist.FrameNotFound" => FrameNotFound
}
attr_reader :server, :client, :logger
2011-10-27 23:34:14 +01:00
def initialize(server, client, logger = nil)
@server = server
@client = client
@logger = logger
end
2011-10-27 23:34:14 +01:00
def restart
server.restart
client.restart
self.debug = @debug if @debug
2011-10-27 23:34:14 +01:00
end
def visit(url)
command 'visit', url
2011-10-27 23:34:14 +01:00
end
def current_url
command 'current_url'
end
2012-06-04 08:58:27 +03:00
def status_code
command 'status_code'
end
2011-10-27 23:34:14 +01:00
def body
command 'body'
end
def source
command 'source'
end
2013-03-03 14:21:12 +00:00
def title
command 'title'
end
2013-03-02 14:05:48 +00:00
def find(method, selector)
result = command('find', method, selector)
result['ids'].map { |id| [result['page_id'], id] }
2011-10-27 23:34:14 +01:00
end
2013-03-02 14:50:22 +00:00
def find_within(page_id, id, method, selector)
command 'find_within', page_id, id, method, selector
2011-10-27 23:34:14 +01:00
end
2013-03-03 14:21:12 +00:00
def all_text(page_id, id)
command 'all_text', page_id, id
end
def visible_text(page_id, id)
command 'visible_text', page_id, id
2011-10-27 23:34:14 +01:00
end
def attribute(page_id, id, name)
command 'attribute', page_id, id, name.to_s
2011-10-27 23:34:14 +01:00
end
def value(page_id, id)
command 'value', page_id, id
2011-10-27 23:34:14 +01:00
end
def set(page_id, id, value)
command 'set', page_id, id, value
2011-10-27 23:34:14 +01:00
end
def select_file(page_id, id, value)
command 'select_file', page_id, id, value
2011-10-27 23:34:14 +01:00
end
def tag_name(page_id, id)
command('tag_name', page_id, id).downcase
end
def visible?(page_id, id)
command 'visible', page_id, id
2011-10-27 23:34:14 +01:00
end
2012-10-08 13:57:31 -07:00
def click_coordinates(x, y)
command 'click_coordinates', x, y
end
2011-10-27 23:34:14 +01:00
def evaluate(script)
command 'evaluate', script
end
def execute(script)
command 'execute', script
end
def within_frame(handle, &block)
if handle.is_a?(Capybara::Node::Base)
command 'push_frame', handle['id']
else
command 'push_frame', handle
end
2012-07-11 00:16:50 +01:00
yield
ensure
2011-10-27 23:34:14 +01:00
command 'pop_frame'
end
def within_window(name, &block)
command 'push_window', name
yield
ensure
command 'pop_window'
end
def click(page_id, id)
command 'click', page_id, id
2011-10-27 23:34:14 +01:00
end
def double_click(page_id, id)
command 'double_click', page_id, id
end
2013-03-03 15:18:05 +00:00
def hover(page_id, id)
command 'hover', page_id, id
end
def drag(page_id, id, other_id)
command 'drag', page_id, id, other_id
2011-10-27 23:34:14 +01:00
end
def select(page_id, id, value)
command 'select', page_id, id, value
2011-10-27 23:34:14 +01:00
end
def trigger(page_id, id, event)
2012-03-11 11:47:40 +00:00
command 'trigger', page_id, id, event.to_s
2011-10-27 23:34:14 +01:00
end
def reset
command 'reset'
end
def render(path, options = {})
command 'render', path.to_s, !!options[:full]
2011-10-27 23:34:14 +01:00
end
def resize(width, height)
command 'resize', width, height
end
def network_traffic
command('network_traffic').values.map do |event|
NetworkTraffic::Request.new(
event['request'],
event['responseParts'].map { |response| NetworkTraffic::Response.new(response) }
)
end
end
def equals(page_id, id, other_id)
command('equals', page_id, id, other_id)
end
def set_headers(headers)
command 'set_headers', headers
end
def response_headers
command 'response_headers'
end
def cookies
Hash[command('cookies').map { |cookie| [cookie['name'], Cookie.new(cookie)] }]
end
def set_cookie(cookie)
if cookie[:expires]
cookie[:expires] = cookie[:expires].to_i * 1000
end
command 'set_cookie', cookie
end
def remove_cookie(name)
command 'remove_cookie', name
end
def js_errors=(val)
command 'set_js_errors', !!val
end
def extensions=(names)
Array(names).each do |name|
command 'add_extension', name
end
end
def debug=(val)
@debug = val
command 'set_debug', !!val
end
2011-10-27 23:34:14 +01:00
def command(name, *args)
message = { 'name' => name, 'args' => args }
log message.inspect
json = JSON.load(server.send(JSON.generate(message)))
2011-10-27 23:34:14 +01:00
log json.inspect
if json['error']
klass = ERROR_MAPPINGS[json['error']['name']] || BrowserError
raise klass.new(json['error'])
else
json['response']
2011-10-27 23:34:14 +01:00
end
rescue DeadClient
restart
raise
2011-10-27 23:34:14 +01:00
end
2012-02-29 12:32:13 +00:00
private
2012-02-29 12:32:13 +00:00
def log(message)
logger.puts message if logger
end
2011-10-27 23:34:14 +01:00
end
end