capybara-webkit/lib/capybara/driver/webkit/browser.rb

185 lines
3.7 KiB
Ruby
Raw Normal View History

2011-02-26 18:02:43 +00:00
require 'json'
2011-02-19 03:53:06 +00:00
class Capybara::Driver::Webkit
class Browser
def initialize(connection)
@connection = connection
2011-02-19 03:53:06 +00:00
end
def visit(url)
command "Visit", url
2011-02-19 03:53:06 +00:00
end
2011-06-08 09:36:45 +00:00
def header(key, value)
command("Header", key, value)
end
2011-02-19 03:53:06 +00:00
def find(query)
command("Find", query).split(",")
2011-02-19 03:53:06 +00:00
end
def reset!
command("Reset")
2011-02-19 03:53:06 +00:00
end
def body
command("Body")
end
2011-02-25 23:04:23 +00:00
def source
command("Source")
end
2011-08-12 20:50:43 +00:00
def status_code
command("Status").to_i
end
def console_messages
command("ConsoleMessages").split("\n").map do |messages|
parts = messages.split("|", 3)
{ :source => parts.first, :line_number => Integer(parts[1]), :message => parts.last }
end
end
def error_messages
console_messages.select do |message|
message[:message] =~ /Error:/
end
end
2011-08-19 15:57:39 +00:00
def response_headers
Hash[command("Headers").split("\n").map { |header| header.split(": ") }]
end
2011-02-25 22:53:36 +00:00
def url
command("Url")
end
def requested_url
command("RequestedUrl")
end
2012-02-05 16:43:48 +00:00
def current_url
command("CurrentUrl")
end
def frame_focus(frame_id_or_index=nil)
if frame_id_or_index.is_a? Fixnum
command("FrameFocus", "", frame_id_or_index.to_s)
elsif frame_id_or_index
command("FrameFocus", frame_id_or_index)
else
command("FrameFocus")
end
end
def ignore_ssl_errors
command("IgnoreSslErrors")
end
def set_skip_image_loading(skip_image_loading)
command("SetSkipImageLoading", skip_image_loading)
end
2012-03-28 15:46:07 +00:00
def window_focus(selector)
command("WindowFocus", selector)
end
def get_window_handles
JSON.parse(command('GetWindowHandles'))
2012-03-26 22:41:33 +00:00
end
alias_method :window_handles, :get_window_handles
def get_window_handle
command('GetWindowHandle')
end
alias_method :window_handle, :get_window_handle
2011-02-25 05:15:08 +00:00
def command(name, *args)
@connection.puts name
@connection.puts args.size
args.each do |arg|
@connection.puts arg.to_s.bytesize
@connection.print arg.to_s
end
2011-02-25 05:15:08 +00:00
check
read_response
end
2011-02-26 18:02:43 +00:00
def evaluate_script(script)
json = command('Evaluate', script)
JSON.parse("[#{json}]").first
end
2011-02-26 19:03:30 +00:00
def execute_script(script)
command('Execute', script)
end
def render(path, width, height)
command "Render", path, width, height
end
def set_cookie(cookie)
command "SetCookie", cookie
end
def clear_cookies
command "ClearCookies"
end
def get_cookies
2011-09-30 15:41:59 +00:00
command("GetCookies").lines.map{ |line| line.strip }.select{ |line| !line.empty? }
end
2011-10-14 21:13:06 +00:00
def set_proxy(options = {})
options = default_proxy_options.merge(options)
command("SetProxy", options[:host], options[:port], options[:user], options[:pass])
end
2011-09-24 21:55:18 +00:00
2011-10-14 21:13:06 +00:00
def clear_proxy
command("SetProxy")
2011-09-24 21:55:18 +00:00
end
def resize_window(width, height)
command("ResizeWindow", width.to_i, height.to_i)
end
2011-02-19 03:53:06 +00:00
private
def check
result = @connection.gets
result.strip! if result
2011-02-25 22:44:16 +00:00
if result.nil?
raise WebkitNoResponseError, "No response received from the server."
elsif result != 'ok'
raise WebkitInvalidResponseError, read_response
2011-02-19 03:53:06 +00:00
end
result
2011-02-19 03:53:06 +00:00
end
def read_response
response_length = @connection.gets.to_i
if response_length > 0
response = @connection.read(response_length)
response.force_encoding("UTF-8") if response.respond_to?(:force_encoding)
response
else
""
end
2011-02-19 03:53:06 +00:00
end
2011-10-14 21:13:06 +00:00
def default_proxy_options
{
:host => "localhost",
:port => "0",
:user => "",
:pass => ""
}
end
2011-02-19 03:53:06 +00:00
end
end