Skip to content

Commit

Permalink
Changed to use selenium-webdriver and it works!
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonas Nicklas and Kevin Fitzpatrick authored and jnicklas committed Nov 14, 2009
1 parent feb29e2 commit ac7d044
Show file tree
Hide file tree
Showing 11 changed files with 135 additions and 141 deletions.
9 changes: 9 additions & 0 deletions lib/webcat/cucumber.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,9 @@
require 'webcat'
require 'webcat/dsl'

if defined?(Rails)
Webcat.app = ActionController::Dispatcher.new
end

World(Webcat)

61 changes: 0 additions & 61 deletions lib/webcat/driver/selenium/rc_server.rb

This file was deleted.

Binary file removed lib/webcat/driver/selenium/selenium-server.jar
Binary file not shown.
95 changes: 54 additions & 41 deletions lib/webcat/driver/selenium_driver.rb
Original file line number Original file line Diff line number Diff line change
@@ -1,80 +1,93 @@
require 'selenium/client' require 'selenium-webdriver'
require 'webcat/driver/selenium/rc_server'
require 'webcat/core_ext/tcp_socket'



class Webcat::Driver::Selenium class Webcat::Driver::Selenium
class Node < Struct.new(:node) class Node < Struct.new(:node)
def text def text
node.text node.text
end end

def attribute(name) def [](name)
value = if name.to_sym == :class if name == :value
node.class_name node.value
else else
node.send(name.to_sym) node.attribute(name)
end end
return value if value and not value.empty? rescue Selenium::WebDriver::Error::WebDriverError
nil
end

def set(value)
if tag_name == 'input' and %w(text password hidden file).include?(type)
node.clear
node.send_keys(value.to_s)
elsif tag_name == 'input' and type == 'radio'
node.select
elsif tag_name == 'input' and type == 'checkbox'
node.toggle
elsif tag_name == "textarea"
node.clear
node.send_keys(value.to_s)
end
end

def select(option)
node.find_element(:xpath, ".//option[text()='#{option}']").select
end end

def click def click
node.click node.click
end end

def tag_name def tag_name
# FIXME: this might be the dumbest way ever of getting the tag name node.tag_name
# there has to be something better... end
node.to_xml[/^\s*<([a-z0-9\-\:]+)/, 1]
private

def type
self[:type]
end end

end end

attr_reader :app, :rack_server attr_reader :app, :rack_server


def self.server def self.driver
@server ||= Webcat::Selenium::SeleniumRCServer.new unless @driver
@driver = Selenium::WebDriver.for :firefox
at_exit do
@driver.quit
end
end
@driver
end end


def initialize(app) def initialize(app)
@app = app @app = app
@rack_server = Webcat::Server.new(@app) @rack_server = Webcat::Server.new(@app)
@rack_server.boot @rack_server.boot
self.class.server.boot
end end

def visit(path) def visit(path)
browser.open(url(path)) driver.navigate.to(url(path))
end end

def body def body
browser.html driver.page_source
end end

def find(selector) def find(selector)
browser.elements_by_xpath(selector).map { |node| Node.new(node) } driver.find_elements(:xpath, selector).map { |node| Node.new(node) }
end end


private private


def url(path) def url(path)
rack_server.url(path) rack_server.url(path)
end end


def browser def driver
unless @_browser self.class.driver
@_browser = Selenium::Client::Driver.new :host => 'localhost',
:port => 4444,
:browser => "*firefox",
:url => rack_server.url('/'),
:timeout_in_second => 10
@_browser.start_new_browser_session

at_exit do
@_browser.close_current_browser_session
end
end
@_browser
end end


end end

2 changes: 2 additions & 0 deletions lib/webcat/session.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ def driver
Webcat::Driver::RackTest.new(app) Webcat::Driver::RackTest.new(app)
when :culerity when :culerity
Webcat::Driver::Culerity.new(app) Webcat::Driver::Culerity.new(app)
when :selenium
Webcat::Driver::Selenium.new(app)
else else
raise Webcat::DriverNotFoundError, "no driver called #{mode} was found" raise Webcat::DriverNotFoundError, "no driver called #{mode} was found"
end end
Expand Down
4 changes: 2 additions & 2 deletions spec/driver/selenium_driver_spec.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
@driver = Webcat::Driver::Selenium.new(TestApp) @driver = Webcat::Driver::Selenium.new(TestApp)
end end


# it_should_behave_like "driver" it_should_behave_like "driver"
# it_should_behave_like "driver with javascript support" it_should_behave_like "driver with javascript support"
end end
2 changes: 1 addition & 1 deletion spec/drivers_spec.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
end end


it "should find the correct number of elements" do it "should find the correct number of elements" do
@driver.find('//a').size.should == 2 @driver.find('//a').size.should == 3
end end


it "should extract node texts" do it "should extract node texts" do
Expand Down
1 change: 1 addition & 0 deletions spec/fixtures/test_file.txt
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1 @@
ThisIsTheTestFile
23 changes: 23 additions & 0 deletions spec/session/selenium_session_spec.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,23 @@
require File.expand_path('../spec_helper', File.dirname(__FILE__))

describe Webcat::Session do
context 'with selenium driver' do
before do
@session = Webcat::Session.new(:selenium, TestApp)
end

describe '#driver' do
it "should be a rack test driver" do
@session.driver.should be_an_instance_of(Webcat::Driver::Selenium)
end
end

describe '#mode' do
it "should remember the mode" do
@session.mode.should == :selenium
end
end

it_should_behave_like "session"
end
end
Loading

0 comments on commit ac7d044

Please sign in to comment.