Cleaning up Selenium support. Mongrel and Selenium servers start/shutdown automatically

This commit is contained in:
Bryan Helmkamp 2008-11-23 19:46:37 -05:00
parent e6cb40b66e
commit da68aa8bce
6 changed files with 92 additions and 33 deletions

View File

@ -29,7 +29,3 @@ end
Webrat.require_xml
require "webrat/core"
# TODO: This is probably not a good idea.
# Probably better for webrat users to require "webrat/rails" etc. directly
require "webrat/rails" if defined?(RAILS_ENV)

View File

@ -45,7 +45,8 @@ module Webrat
:set_hidden_field, :submit_form,
:request_page, :current_dom,
:selects_date, :selects_time, :selects_datetime,
:select_date, :select_time, :select_datetime
:select_date, :select_time, :select_datetime,
:wait_for_page_to_load
end

View File

@ -1,4 +1,4 @@
require "webrat/core"
require "webrat"
require "cgi"
gem "extlib"

View File

@ -1,3 +1,5 @@
require "webrat"
module Webrat
class RailsSession < Session #:nodoc:

View File

@ -1,3 +1,4 @@
require "webrat"
gem "selenium-client", ">=1.2.9"
require "selenium/client"
require "webrat/selenium/selenium_session"
@ -13,19 +14,46 @@ module Webrat
end
def self.start_selenium_server
remote_control = Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
remote_control.jar_file = File.expand_path(__FILE__ + "../../../../vendor/selenium-server.jar")
remote_control.start :background => true
puts "Waiting for Remote Control to be up and running..."
TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444
puts "Selenium Remote Control at 0.0.0.0:4444 ready"
end
def self.stop_selenium_server
puts "Stopping Selenium Remote Control running at 0.0.0.0:4444..."
remote_control = Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5)
remote_control.stop
puts "Stopped Selenium Remote Control running at 0.0.0.0:4444"
end
def self.start_app_server
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=3001 --environment=selenium --pid #{pid_file} &")
TCPSocket.wait_for_service :host => "0.0.0.0", :port => 3001
end
def self.stop_app_server
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
end
module Selenium
module Rails
class World < ::ActionController::IntegrationTest
def initialize #:nodoc:
@_result = Test::Unit::TestResult.new
end
end
end
end
end
module ::ActionController
module Integration
class Session #:nodoc:
include Webrat::Methods
end
end
end

View File

@ -1,27 +1,26 @@
module Webrat
class SeleniumSession
def initialize(selenium_driver) #:nodoc:
@selenium = selenium_driver
def initialize(*args) # :nodoc:
extend_selenium
define_location_strategies
end
def visit(url)
@selenium.open(url)
selenium.open(url)
end
alias_method :visits, :visit
def fill_in(field_identifier, options)
locator = "webrat=#{Regexp.escape(field_identifier)}"
@selenium.type(locator, "#{options[:with]}")
selenium.type(locator, "#{options[:with]}")
end
alias_method :fills_in, :fill_in
def response_body #:nodoc:
@selenium.get_html_source
selenium.get_html_source
end
def click_button(button_text_or_regexp = nil, options = {})
@ -31,7 +30,7 @@ module Webrat
pattern = adjust_if_regexp(button_text_or_regexp)
end
pattern ||= '*'
@selenium.click("button=#{pattern}")
selenium.click("button=#{pattern}")
wait_for_result(options[:wait])
end
@ -39,14 +38,14 @@ module Webrat
def click_link(link_text_or_regexp, options = {})
pattern = adjust_if_regexp(link_text_or_regexp)
@selenium.click("webratlink=#{pattern}")
selenium.click("webratlink=#{pattern}")
wait_for_result(options[:wait])
end
alias_method :clicks_link, :click_link
def click_link_within(selector, link_text, options = {})
@selenium.click("webratlinkwithin=#{selector}|#{link_text}")
selenium.click("webratlinkwithin=#{selector}|#{link_text}")
wait_for_result(options[:wait])
end
@ -63,15 +62,15 @@ module Webrat
end
def wait_for_page_to_load(timeout = 15000)
@selenium.wait_for_page_to_load(timeout)
selenium.wait_for_page_to_load(timeout)
end
def wait_for_ajax(timeout = 15000)
@selenium.wait_for_condition "Ajax.activeRequestCount == 0", timeout
selenium.wait_for_condition "Ajax.activeRequestCount == 0", timeout
end
def wait_for_effects(timeout = 15000)
@selenium.wait_for_condition "window.Effect.Queue.size() == 0", timeout
selenium.wait_for_condition "window.Effect.Queue.size() == 0", timeout
end
def wait_for_ajax_and_effects
@ -87,48 +86,81 @@ module Webrat
else
select_locator = "webratselectwithoption=#{option_text}"
end
@selenium.select(select_locator, option_text)
selenium.select(select_locator, option_text)
end
alias_method :selects, :select
def choose(label_text)
@selenium.click("webrat=#{label_text}")
selenium.click("webrat=#{label_text}")
end
alias_method :chooses, :choose
def check(label_text)
@selenium.check("webrat=#{label_text}")
selenium.check("webrat=#{label_text}")
end
alias_method :checks, :check
def is_ordered(*args) #:nodoc:
@selenium.is_ordered(*args)
selenium.is_ordered(*args)
end
def dragdrop(*args) #:nodoc:
@selenium.dragdrop(*args)
selenium.dragdrop(*args)
end
def fire_event(field_identifier, event)
locator = "webrat=#{Regexp.escape(field_identifier)}"
@selenium.fire_event(locator, "#{event}")
selenium.fire_event(locator, "#{event}")
end
def key_down(field_identifier, key_code)
locator = "webrat=#{Regexp.escape(field_identifier)}"
@selenium.key_down(locator, key_code)
selenium.key_down(locator, key_code)
end
def key_up(field_identifier, key_code)
locator = "webrat=#{Regexp.escape(field_identifier)}"
@selenium.key_up(locator, key_code)
selenium.key_up(locator, key_code)
end
def browser
return $browser if $browser
setup
$browser
end
protected
def setup
silence_stream(STDOUT) do
Webrat.start_selenium_server
Webrat.start_app_server
end
$browser = ::Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://0.0.0.0:3001")
$browser.set_speed(0)
$browser.start
teardown_at_exit
end
def selenium
browser
end
def teardown_at_exit
at_exit do
silence_stream(STDOUT) do
$browser.stop
Webrat.stop_app_server
Webrat.stop_selenium_server
end
end
end
def adjust_if_regexp(text_or_regexp) #:nodoc:
if text_or_regexp.is_a?(Regexp)
"evalregex:#{text_or_regexp.inspect}"
@ -140,14 +172,14 @@ module Webrat
def extend_selenium #:nodoc:
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
extenions_js = File.read(extensions_file)
@selenium.get_eval(extenions_js)
selenium.get_eval(extenions_js)
end
def define_location_strategies #:nodoc:
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
strategy_js = File.read(file)
strategy_name = File.basename(file, '.js')
@selenium.add_location_strategy(strategy_name, strategy_js)
selenium.add_location_strategy(strategy_name, strategy_js)
end
end
end