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

79 lines
1.3 KiB
Ruby
Raw Normal View History

2011-02-19 03:53:06 +00:00
require 'socket'
require 'capybara/util/timeout'
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
start_server
connect
end
def visit(url)
command "Visit", url
2011-02-19 03:53:06 +00:00
end
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
2011-02-25 23:04:23 +00:00
def source
command("Source")
end
2011-02-25 22:53:36 +00:00
def url
command("Url")
end
2011-02-25 05:15:08 +00:00
def command(name, *args)
@socket.puts name
@socket.puts args.size.to_s
2011-02-25 05:15:08 +00:00
args.each { |arg| @socket.puts arg }
check
read_response
end
2011-02-26 18:02:43 +00:00
def evaluate_script(script)
json = command('Evaluate', script)
puts "Got JSON: #{json}"
JSON.parse("[#{json}]").first
end
2011-02-19 03:53:06 +00:00
private
def start_server
@pid = fork { exec("webkit_server") }
at_exit { Process.kill("INT", @pid) }
end
def connect
Capybara.timeout(5) do
attempt_connect
!@socket.nil?
end
end
def attempt_connect
@socket = TCPSocket.open("localhost", 9200)
rescue Errno::ECONNREFUSED
end
def check
result = @socket.gets.strip
2011-02-25 22:44:16 +00:00
2011-02-19 03:53:06 +00:00
unless result == 'ok'
raise WebkitError, read_response
2011-02-19 03:53:06 +00:00
end
end
def read_response
response_length = @socket.gets.to_i
@socket.read(response_length)
end
end
end