Follow new capybara driver naming/module conventions

This commit is contained in:
Joe Ferris 2012-07-08 12:17:08 -07:00
parent 9202683c22
commit 259a38f206
19 changed files with 227 additions and 219 deletions

View File

@ -1,5 +1,5 @@
$:.push File.expand_path("../lib", __FILE__) $:.push File.expand_path("../lib", __FILE__)
require "capybara/driver/webkit/version" require "capybara/webkit/version"
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = "capybara-webkit" s.name = "capybara-webkit"

View File

@ -1,157 +0,0 @@
require "capybara"
require "capybara/driver/webkit/version"
require "capybara/driver/webkit/node"
require "capybara/driver/webkit/connection"
require "capybara/driver/webkit/browser"
require "capybara/driver/webkit/socket_debugger"
require "capybara/driver/webkit/cookie_jar"
class Capybara::Driver::Webkit
class WebkitInvalidResponseError < StandardError
end
class WebkitNoResponseError < StandardError
end
class NodeNotAttachedError < Capybara::ElementNotFound
end
attr_reader :browser
def initialize(app, options={})
@app = app
@options = options
@rack_server = Capybara::Server.new(@app)
@rack_server.boot if Capybara.run_server
@browser = options[:browser] || Browser.new(Connection.new(options))
end
def enable_logging
browser.enable_logging
end
def current_url
browser.current_url
end
def requested_url
browser.requested_url
end
def visit(path)
browser.visit(url(path))
end
def find(query)
browser.find(query).map { |native| Node.new(self, native) }
end
def source
browser.source
end
def body
browser.body
end
def header(key, value)
browser.header(key, value)
end
def execute_script(script)
value = browser.execute_script script
value.empty? ? nil : value
end
def evaluate_script(script)
browser.evaluate_script script
end
def console_messages
browser.console_messages
end
def error_messages
browser.error_messages
end
def response_headers
browser.response_headers
end
def status_code
browser.status_code
end
def resize_window(width, height)
browser.resize_window(width, height)
end
def within_frame(frame_id_or_index)
browser.frame_focus(frame_id_or_index)
begin
yield
ensure
browser.frame_focus
end
end
def within_window(selector)
current_window = window_handle
browser.window_focus(selector)
begin
yield
ensure
browser.window_focus(current_window)
end
end
def window_handles
browser.get_window_handles
end
def window_handle
browser.get_window_handle
end
def wait?
true
end
def wait_until(*args)
end
def reset!
browser.reset!
end
def has_shortcircuit_timeout?
false
end
def render(path, options={})
options[:width] ||= 1000
options[:height] ||= 10
browser.render path, options[:width], options[:height]
end
def server_port
@rack_server.port
end
def cookies
@cookie_jar ||= CookieJar.new(browser)
end
def invalid_element_errors
[]
end
private
def url(path)
@rack_server.url(path)
end
end

View File

@ -1,12 +1,18 @@
require "capybara" require "capybara"
require "capybara/driver/webkit"
module Capybara
module Webkit
end
end
require "capybara/webkit/driver"
Capybara.register_driver :webkit do |app| Capybara.register_driver :webkit do |app|
Capybara::Driver::Webkit.new(app) Capybara::Webkit::Driver.new(app)
end end
Capybara.register_driver :webkit_debug do |app| Capybara.register_driver :webkit_debug do |app|
driver = Capybara::Driver::Webkit.new(app) driver = Capybara::Webkit::Driver.new(app)
driver.enable_logging driver.enable_logging
driver driver
end end

View File

@ -1,6 +1,6 @@
require 'json' require 'json'
class Capybara::Driver::Webkit module Capybara::Webkit
class Browser class Browser
def initialize(connection) def initialize(connection)
@connection = connection @connection = connection
@ -161,9 +161,9 @@ class Capybara::Driver::Webkit
result.strip! if result result.strip! if result
if result.nil? if result.nil?
raise WebkitNoResponseError, "No response received from the server." raise NoResponseError, "No response received from the server."
elsif result != 'ok' elsif result != 'ok'
raise WebkitInvalidResponseError, read_response raise InvalidResponseError, read_response
end end
result result

View File

@ -2,9 +2,9 @@ require 'socket'
require 'timeout' require 'timeout'
require 'thread' require 'thread'
class Capybara::Driver::Webkit module Capybara::Webkit
class Connection class Connection
SERVER_PATH = File.expand_path("../../../../../bin/webkit_server", __FILE__) SERVER_PATH = File.expand_path("../../../../bin/webkit_server", __FILE__)
WEBKIT_SERVER_START_TIMEOUT = 15 WEBKIT_SERVER_START_TIMEOUT = 15
attr_reader :port attr_reader :port

View File

@ -3,7 +3,7 @@ require 'webrick'
# A simple cookie jar implementation. # A simple cookie jar implementation.
# Does not take special cookie attributes # Does not take special cookie attributes
# into account like expire, max-age, httponly, secure # into account like expire, max-age, httponly, secure
class Capybara::Driver::Webkit::CookieJar class Capybara::Webkit::CookieJar
attr_reader :browser attr_reader :browser
def initialize(browser) def initialize(browser)

View File

@ -0,0 +1,150 @@
require "capybara"
require "capybara/webkit/version"
require "capybara/webkit/node"
require "capybara/webkit/connection"
require "capybara/webkit/browser"
require "capybara/webkit/socket_debugger"
require "capybara/webkit/cookie_jar"
require "capybara/webkit/errors"
module Capybara::Webkit
class Driver
attr_reader :browser
def initialize(app, options={})
@app = app
@options = options
@rack_server = Capybara::Server.new(@app)
@rack_server.boot if Capybara.run_server
@browser = options[:browser] || Browser.new(Connection.new(options))
end
def enable_logging
browser.enable_logging
end
def current_url
browser.current_url
end
def requested_url
browser.requested_url
end
def visit(path)
browser.visit(url(path))
end
def find(query)
browser.find(query).map { |native| Node.new(self, native) }
end
def source
browser.source
end
def body
browser.body
end
def header(key, value)
browser.header(key, value)
end
def execute_script(script)
value = browser.execute_script script
value.empty? ? nil : value
end
def evaluate_script(script)
browser.evaluate_script script
end
def console_messages
browser.console_messages
end
def error_messages
browser.error_messages
end
def response_headers
browser.response_headers
end
def status_code
browser.status_code
end
def resize_window(width, height)
browser.resize_window(width, height)
end
def within_frame(frame_id_or_index)
browser.frame_focus(frame_id_or_index)
begin
yield
ensure
browser.frame_focus
end
end
def within_window(selector)
current_window = window_handle
browser.window_focus(selector)
begin
yield
ensure
browser.window_focus(current_window)
end
end
def window_handles
browser.get_window_handles
end
def window_handle
browser.get_window_handle
end
def wait?
true
end
def wait_until(*args)
end
def reset!
browser.reset!
end
def has_shortcircuit_timeout?
false
end
def render(path, options={})
options[:width] ||= 1000
options[:height] ||= 10
browser.render path, options[:width], options[:height]
end
def server_port
@rack_server.port
end
def cookies
@cookie_jar ||= CookieJar.new(browser)
end
def invalid_element_errors
[]
end
private
def url(path)
@rack_server.url(path)
end
end
end

View File

@ -0,0 +1,10 @@
module Capybara::Webkit
class InvalidResponseError < StandardError
end
class NoResponseError < StandardError
end
class NodeNotAttachedError < Capybara::ElementNotFound
end
end

View File

@ -1,4 +1,4 @@
class Capybara::Driver::Webkit module Capybara::Webkit
class Node < Capybara::Driver::Node class Node < Capybara::Driver::Node
NBSP = "\xC2\xA0" NBSP = "\xC2\xA0"
NBSP.force_encoding("UTF-8") if NBSP.respond_to?(:force_encoding) NBSP.force_encoding("UTF-8") if NBSP.respond_to?(:force_encoding)
@ -91,7 +91,7 @@ class Capybara::Driver::Webkit
if allow_unattached_nodes? || attached? if allow_unattached_nodes? || attached?
browser.command "Node", name, native, *args browser.command "Node", name, native, *args
else else
raise Capybara::Driver::Webkit::NodeNotAttachedError raise Capybara::Webkit::NodeNotAttachedError
end end
end end

View File

@ -1,6 +1,6 @@
# Wraps the TCP socket and prints data sent and received. Used for debugging # Wraps the TCP socket and prints data sent and received. Used for debugging
# the wire protocol. You can use this by passing a :socket_class to Browser. # the wire protocol. You can use this by passing a :socket_class to Browser.
class Capybara::Driver::Webkit module Capybara::Webkit
class SocketDebugger class SocketDebugger
def self.open(host, port) def self.open(host, port)
real_socket = TCPSocket.open(host, port) real_socket = TCPSocket.open(host, port)

View File

@ -1,20 +1,20 @@
require 'spec_helper' require 'spec_helper'
require 'self_signed_ssl_cert' require 'self_signed_ssl_cert'
require 'stringio' require 'stringio'
require 'capybara/driver/webkit' require 'capybara/webkit/driver'
require 'socket' require 'socket'
require 'base64' require 'base64'
describe Capybara::Driver::Webkit::Browser do describe Capybara::Webkit::Browser do
let(:browser) { Capybara::Driver::Webkit::Browser.new(Capybara::Driver::Webkit::Connection.new) } let(:browser) { Capybara::Webkit::Browser.new(Capybara::Webkit::Connection.new) }
let(:browser_ignore_ssl_err) do let(:browser_ignore_ssl_err) do
Capybara::Driver::Webkit::Browser.new(Capybara::Driver::Webkit::Connection.new).tap do |browser| Capybara::Webkit::Browser.new(Capybara::Webkit::Connection.new).tap do |browser|
browser.ignore_ssl_errors browser.ignore_ssl_errors
end end
end end
let(:browser_skip_images) do let(:browser_skip_images) do
Capybara::Driver::Webkit::Browser.new(Capybara::Driver::Webkit::Connection.new).tap do |browser| Capybara::Webkit::Browser.new(Capybara::Webkit::Connection.new).tap do |browser|
browser.set_skip_image_loading(true) browser.set_skip_image_loading(true)
end end
end end
@ -254,7 +254,7 @@ describe Capybara::Driver::Webkit::Browser do
connection.stub(:gets).and_return("ok\n", "0\n") connection.stub(:gets).and_return("ok\n", "0\n")
connection.stub(:read).and_raise(StandardError.new("tried to read empty response")) connection.stub(:read).and_raise(StandardError.new("tried to read empty response"))
browser = Capybara::Driver::Webkit::Browser.new(connection) browser = Capybara::Webkit::Browser.new(connection)
expect { browser.visit("/") }.not_to raise_error(/empty response/) expect { browser.visit("/") }.not_to raise_error(/empty response/)
end end

View File

@ -1,7 +1,7 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit/connection' require 'capybara/webkit/connection'
describe Capybara::Driver::Webkit::Connection do describe Capybara::Webkit::Connection do
it "boots a server to talk to" do it "boots a server to talk to" do
url = @rack_server.url("/") url = @rack_server.url("/")
connection.puts "Visit" connection.puts "Visit"
@ -20,7 +20,7 @@ describe Capybara::Driver::Webkit::Connection do
it 'forwards stdout to the given IO object' do it 'forwards stdout to the given IO object' do
io = StringIO.new io = StringIO.new
redirected_connection = Capybara::Driver::Webkit::Connection.new(:stdout => io) redirected_connection = Capybara::Webkit::Connection.new(:stdout => io)
script = 'console.log("hello world")' script = 'console.log("hello world")'
redirected_connection.puts "Execute" redirected_connection.puts "Execute"
redirected_connection.puts 1 redirected_connection.puts 1
@ -35,11 +35,11 @@ describe Capybara::Driver::Webkit::Connection do
end end
it "chooses a new port number for a new connection" do it "chooses a new port number for a new connection" do
new_connection = Capybara::Driver::Webkit::Connection.new new_connection = Capybara::Webkit::Connection.new
new_connection.port.should_not == connection.port new_connection.port.should_not == connection.port
end end
let(:connection) { Capybara::Driver::Webkit::Connection.new } let(:connection) { Capybara::Webkit::Connection.new }
before(:all) do before(:all) do
@app = lambda do |env| @app = lambda do |env|

View File

@ -1,7 +1,7 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit/cookie_jar' require 'capybara/webkit/cookie_jar'
describe Capybara::Driver::Webkit::CookieJar do describe Capybara::Webkit::CookieJar do
let(:browser) { let(:browser) {
browser = double("Browser") browser = double("Browser")
browser.stub(:get_cookies) { [ browser.stub(:get_cookies) { [
@ -13,7 +13,7 @@ describe Capybara::Driver::Webkit::CookieJar do
browser browser
} }
subject { Capybara::Driver::Webkit::CookieJar.new(browser) } subject { Capybara::Webkit::CookieJar.new(browser) }
describe "#find" do describe "#find" do
it "returns a cookie object" do it "returns a cookie object" do

View File

@ -1,8 +1,8 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit' require 'capybara/webkit/driver'
require 'mini_magick' require 'mini_magick'
describe Capybara::Driver::Webkit, "rendering an image" do describe Capybara::Webkit::Driver, "rendering an image" do
before(:all) do before(:all) do
# Set up the tmp directory and file name # Set up the tmp directory and file name
@ -23,7 +23,7 @@ describe Capybara::Driver::Webkit, "rendering an image" do
[body]] [body]]
end end
@driver = Capybara::Driver::Webkit.new(app, :browser => $webkit_browser) @driver = Capybara::Webkit::Driver.new(app, :browser => $webkit_browser)
@driver.visit("/hello/world?success=true") @driver.visit("/hello/world?success=true")
end end

View File

@ -1,7 +1,7 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit' require 'capybara/webkit/driver'
describe Capybara::Driver::Webkit, "#resize_window(width, height)" do describe Capybara::Webkit::Driver, "#resize_window(width, height)" do
before(:all) do before(:all) do
app = lambda do |env| app = lambda do |env|
@ -27,7 +27,7 @@ describe Capybara::Driver::Webkit, "#resize_window(width, height)" do
] ]
end end
@driver = Capybara::Driver::Webkit.new(app, :browser => $webkit_browser) @driver = Capybara::Webkit::Driver.new(app, :browser => $webkit_browser)
end end
DEFAULT_DIMENTIONS = "[1680x1050]" DEFAULT_DIMENTIONS = "[1680x1050]"

View File

@ -1,9 +1,9 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit' require 'capybara/webkit/driver'
require 'base64' require 'base64'
describe Capybara::Driver::Webkit do describe Capybara::Webkit::Driver do
subject { Capybara::Driver::Webkit.new(@app, :browser => $webkit_browser) } subject { Capybara::Webkit::Driver.new(@app, :browser => $webkit_browser) }
before do before do
subject.reset! subject.reset!
subject.visit("/hello/world?success=true") subject.visit("/hello/world?success=true")
@ -59,12 +59,12 @@ describe Capybara::Driver::Webkit do
it "raises error for missing frame by index" do it "raises error for missing frame by index" do
expect { subject.within_frame(1) { } }. expect { subject.within_frame(1) { } }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) to raise_error(Capybara::Webkit::InvalidResponseError)
end end
it "raise_error for missing frame by id" do it "raise_error for missing frame by id" do
expect { subject.within_frame("foo") { } }. expect { subject.within_frame("foo") { } }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) to raise_error(Capybara::Webkit::InvalidResponseError)
end end
it "returns an attribute's value" do it "returns an attribute's value" do
@ -132,7 +132,7 @@ describe Capybara::Driver::Webkit do
end end
it "raises error whose message references the actual missing url" do it "raises error whose message references the actual missing url" do
expect { subject.visit("/outer") }.to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError, /inner-not-found/) expect { subject.visit("/outer") }.to raise_error(Capybara::Webkit::InvalidResponseError, /inner-not-found/)
end end
end end
@ -250,7 +250,7 @@ describe Capybara::Driver::Webkit do
it "raises an error for an invalid xpath query" do it "raises an error for an invalid xpath query" do
expect { subject.find("totally invalid salad") }. expect { subject.find("totally invalid salad") }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError, /xpath/i) to raise_error(Capybara::Webkit::InvalidResponseError, /xpath/i)
end end
it "returns an attribute's value" do it "returns an attribute's value" do
@ -357,7 +357,7 @@ describe Capybara::Driver::Webkit do
it "raises an error for failing Javascript" do it "raises an error for failing Javascript" do
expect { subject.execute_script(%<invalid salad>) }. expect { subject.execute_script(%<invalid salad>) }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) to raise_error(Capybara::Webkit::InvalidResponseError)
end end
it "doesn't raise an error for Javascript that doesn't return anything" do it "doesn't raise an error for Javascript that doesn't return anything" do
@ -881,7 +881,7 @@ describe Capybara::Driver::Webkit do
wait_for_error_to_complete wait_for_error_to_complete
subject.find("//body") subject.find("//body")
}. }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError, %r{/error}) to raise_error(Capybara::Webkit::InvalidResponseError, %r{/error})
end end
def wait_for_error_to_complete def wait_for_error_to_complete
@ -912,7 +912,7 @@ describe Capybara::Driver::Webkit do
it "raises a webkit error and then continues" do it "raises a webkit error and then continues" do
subject.find("//input").first.click subject.find("//input").first.click
expect { subject.find("//p") }.to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) expect { subject.find("//p") }.to raise_error(Capybara::Webkit::InvalidResponseError)
subject.visit("/") subject.visit("/")
subject.find("//p").first.text.should == "hello" subject.find("//p").first.text.should == "hello"
end end
@ -1015,7 +1015,7 @@ describe Capybara::Driver::Webkit do
expect { expect {
subject.find("//body") subject.find("//body")
}. }.
to raise_error(Capybara::Driver::Webkit::WebkitNoResponseError, %r{response}) to raise_error(Capybara::Webkit::NoResponseError, %r{response})
make_the_server_come_back make_the_server_come_back
end end
@ -1121,12 +1121,12 @@ describe Capybara::Driver::Webkit do
end end
context "with socket debugger" do context "with socket debugger" do
let(:socket_debugger_class){ Capybara::Driver::Webkit::SocketDebugger } let(:socket_debugger_class){ Capybara::Webkit::SocketDebugger }
let(:browser_with_debugger){ let(:browser_with_debugger){
connection = Capybara::Driver::Webkit::Connection.new(:socket_class => socket_debugger_class) connection = Capybara::Webkit::Connection.new(:socket_class => socket_debugger_class)
Capybara::Driver::Webkit::Browser.new(connection) Capybara::Webkit::Browser.new(connection)
} }
let(:driver_with_debugger){ Capybara::Driver::Webkit.new(@app, :browser => browser_with_debugger) } let(:driver_with_debugger){ Capybara::Webkit::Driver.new(@app, :browser => browser_with_debugger) }
before(:all) do before(:all) do
@app = lambda do |env| @app = lambda do |env|
@ -1657,7 +1657,7 @@ describe Capybara::Driver::Webkit do
it "raises an error if the window is not found" do it "raises an error if the window is not found" do
expect { subject.within_window('myWindowDoesNotExist') }. expect { subject.within_window('myWindowDoesNotExist') }.
to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) to raise_error(Capybara::Webkit::InvalidResponseError)
end end
it "has a number of window handles equal to the number of open windows" do it "has a number of window handles equal to the number of open windows" do
@ -1740,7 +1740,7 @@ describe Capybara::Driver::Webkit do
subject.visit("/outer") subject.visit("/outer")
sleep 1 sleep 1
subject.find("//body") subject.find("//body")
end.to raise_error(Capybara::Driver::Webkit::WebkitInvalidResponseError) end.to raise_error(Capybara::Webkit::InvalidResponseError)
end end
end end
@ -1789,10 +1789,10 @@ describe Capybara::Driver::Webkit do
end end
let(:driver) do let(:driver) do
command = "#{Capybara::Driver::Webkit::Connection::SERVER_PATH} 2>&1" command = "#{Capybara::Webkit::Connection::SERVER_PATH} 2>&1"
connection = Capybara::Driver::Webkit::Connection.new(:command => command, :stdout => output) connection = Capybara::Webkit::Connection.new(:command => command, :stdout => output)
browser = Capybara::Driver::Webkit::Browser.new(connection) browser = Capybara::Webkit::Browser.new(connection)
Capybara::Driver::Webkit.new(@app, :browser => browser) Capybara::Webkit::Driver.new(@app, :browser => browser)
end end
let(:output) { StringIO.new } let(:output) { StringIO.new }

View File

@ -1,9 +1,9 @@
require 'spec_helper' require 'spec_helper'
require 'capybara/driver/webkit' require 'capybara/webkit/driver'
describe Capybara::Driver::Webkit do describe Capybara::Webkit::Driver do
before do before do
@driver = Capybara::Driver::Webkit.new(TestApp, :browser => $webkit_browser) @driver = Capybara::Webkit::Driver.new(TestApp, :browser => $webkit_browser)
end end
it_should_behave_like "driver" it_should_behave_like "driver"

View File

@ -22,13 +22,12 @@ end
require File.join(spec_dir, "spec_helper") require File.join(spec_dir, "spec_helper")
require 'capybara/driver/webkit/connection' require 'capybara/webkit'
require 'capybara/driver/webkit/browser' connection = Capybara::Webkit::Connection.new(:socket_class => TCPSocket, :stdout => nil)
connection = Capybara::Driver::Webkit::Connection.new(:socket_class => TCPSocket, :stdout => nil) $webkit_browser = Capybara::Webkit::Browser.new(connection)
$webkit_browser = Capybara::Driver::Webkit::Browser.new(connection)
Capybara.register_driver :reusable_webkit do |app| Capybara.register_driver :reusable_webkit do |app|
Capybara::Driver::Webkit.new(app, :browser => $webkit_browser) Capybara::Webkit::Driver.new(app, :browser => $webkit_browser)
end end
def with_env_vars(vars) def with_env_vars(vars)