changed selenium_port to application_port to reflect what the variable is used for ...

This commit is contained in:
cornel.borcean 2009-01-12 12:13:22 -06:00
parent 9825aee47e
commit 33d2cdcc53
5 changed files with 105 additions and 80 deletions

View File

@ -1,60 +1,60 @@
module Webrat module Webrat
# Configures Webrat. If this is not done, Webrat will be created # Configures Webrat. If this is not done, Webrat will be created
# with all of the default settings. # with all of the default settings.
def self.configure(configuration = Webrat::Configuration.new) def self.configure(configuration = Webrat::Configuration.new)
yield configuration if block_given? yield configuration if block_given?
@@configuration = configuration @@configuration = configuration
end end
def self.configuration # :nodoc: def self.configuration # :nodoc:
@@configuration ||= Webrat::Configuration.new @@configuration ||= Webrat::Configuration.new
end end
# Webrat can be configured using the Webrat.configure method. For example: # Webrat can be configured using the Webrat.configure method. For example:
# #
# Webrat.configure do |config| # Webrat.configure do |config|
# config.parse_with_nokogiri = false # config.parse_with_nokogiri = false
# end # end
class Configuration class Configuration
# Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used
attr_writer :parse_with_nokogiri attr_writer :parse_with_nokogiri
# Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc. # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
attr_accessor :mode # :nodoc: attr_accessor :mode # :nodoc:
# Save and open pages with error status codes (500-599) in a browser? Defualts to true. # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
attr_writer :open_error_files attr_writer :open_error_files
# Which environment should the selenium tests be run in? Defaults to selenium. # Which environment should the selenium tests be run in? Defaults to selenium.
attr_accessor :selenium_environment attr_accessor :selenium_environment
# Which port should the selenium tests be run on? Defaults to 3001. # Which port should the selenium tests be run on? Defaults to 3001.
attr_accessor :selenium_port attr_accessor :application_port
def initialize # :nodoc: def initialize # :nodoc:
self.open_error_files = true self.open_error_files = true
self.parse_with_nokogiri = !Webrat.on_java? self.parse_with_nokogiri = !Webrat.on_java?
self.selenium_environment = :selenium self.selenium_environment = :selenium
self.selenium_port = 3001 self.application_port = 3001
end end
def parse_with_nokogiri? #:nodoc: def parse_with_nokogiri? #:nodoc:
@parse_with_nokogiri ? true : false @parse_with_nokogiri ? true : false
end end
def open_error_files? #:nodoc: def open_error_files? #:nodoc:
@open_error_files ? true : false @open_error_files ? true : false
end end
# Allows setting of webrat's mode, valid modes are: # Allows setting of webrat's mode, valid modes are:
# :rails, :selenium, :rack, :sinatra, :mechanize, :merb # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
def mode=(mode) def mode=(mode)
@mode = mode @mode = mode
require("webrat/#{mode}") require("webrat/#{mode}")
end end
end end
end end

View File

@ -5,41 +5,41 @@ require "webrat/selenium/selenium_session"
require "webrat/selenium/matchers" require "webrat/selenium/matchers"
module Webrat module Webrat
def self.with_selenium_server #:nodoc: def self.with_selenium_server #:nodoc:
start_selenium_server start_selenium_server
yield yield
stop_selenium_server stop_selenium_server
end end
def self.start_selenium_server #:nodoc: def self.start_selenium_server #:nodoc:
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.jar_file = File.expand_path(__FILE__ + "../../../../vendor/selenium-server.jar")
remote_control.start :background => true remote_control.start :background => true
TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444 TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444
end end
def self.stop_selenium_server #:nodoc: def self.stop_selenium_server #:nodoc:
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 remote_control.stop
end end
def self.start_app_server #:nodoc: def self.start_app_server #:nodoc:
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid") pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.selenium_port} --environment=#{Webrat.configuration.selenium_environment} --pid #{pid_file} &") system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.selenium_environment} --pid #{pid_file} &")
TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.selenium_port.to_i TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.application_port.to_i
end end
def self.stop_app_server #:nodoc: def self.stop_app_server #:nodoc:
pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid") pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}" system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
end end
# To use Webrat's Selenium support, you'll need the selenium-client gem installed. # To use Webrat's Selenium support, you'll need the selenium-client gem installed.
# Activate it with (for example, in your <tt>env.rb</tt>): # Activate it with (for example, in your <tt>env.rb</tt>):
# #
# require "webrat" # require "webrat"
# #
# Webrat.configure do |config| # Webrat.configure do |config|
# config.mode = :selenium # config.mode = :selenium
# end # end

View File

@ -3,56 +3,56 @@ require "webrat/core/save_and_open_page"
module Webrat module Webrat
class TimeoutError < WebratError class TimeoutError < WebratError
end end
class SeleniumResponse class SeleniumResponse
attr_reader :body attr_reader :body
attr_reader :session attr_reader :session
def initialize(session, body) def initialize(session, body)
@session = session @session = session
@body = body @body = body
end end
def selenium def selenium
session.selenium session.selenium
end end
end end
class SeleniumSession class SeleniumSession
include Webrat::SaveAndOpenPage include Webrat::SaveAndOpenPage
def initialize(*args) # :nodoc: def initialize(*args) # :nodoc:
end end
def simulate def simulate
end end
def automate def automate
yield yield
end end
def visit(url) def visit(url)
selenium.open(url) selenium.open(url)
end end
webrat_deprecate :visits, :visit webrat_deprecate :visits, :visit
def fill_in(field_identifier, options) def fill_in(field_identifier, options)
locator = "webrat=#{Regexp.escape(field_identifier)}" locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.type(locator, "#{options[:with]}") selenium.type(locator, "#{options[:with]}")
end end
webrat_deprecate :fills_in, :fill_in webrat_deprecate :fills_in, :fill_in
def response def response
SeleniumResponse.new(self, response_body) SeleniumResponse.new(self, response_body)
end end
def response_body #:nodoc: def response_body #:nodoc:
selenium.get_html_source selenium.get_html_source
end end
def click_button(button_text_or_regexp = nil, options = {}) def click_button(button_text_or_regexp = nil, options = {})
if button_text_or_regexp.is_a?(Hash) && options == {} if button_text_or_regexp.is_a?(Hash) && options == {}
pattern, options = nil, button_text_or_regexp pattern, options = nil, button_text_or_regexp
@ -61,11 +61,11 @@ module Webrat
end end
pattern ||= '*' pattern ||= '*'
locator = "button=#{pattern}" locator = "button=#{pattern}"
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.click locator selenium.click locator
end end
webrat_deprecate :clicks_button, :click_button webrat_deprecate :clicks_button, :click_button
def click_link(link_text_or_regexp, options = {}) def click_link(link_text_or_regexp, options = {})
@ -74,53 +74,53 @@ module Webrat
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.click locator selenium.click locator
end end
webrat_deprecate :clicks_link, :click_link webrat_deprecate :clicks_link, :click_link
def click_link_within(selector, link_text, options = {}) def click_link_within(selector, link_text, options = {})
locator = "webratlinkwithin=#{selector}|#{link_text}" locator = "webratlinkwithin=#{selector}|#{link_text}"
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.click locator selenium.click locator
end end
webrat_deprecate :clicks_link_within, :click_link_within webrat_deprecate :clicks_link_within, :click_link_within
def select(option_text, options = {}) def select(option_text, options = {})
id_or_name_or_label = options[:from] id_or_name_or_label = options[:from]
if id_or_name_or_label if id_or_name_or_label
select_locator = "webrat=#{id_or_name_or_label}" select_locator = "webrat=#{id_or_name_or_label}"
else else
select_locator = "webratselectwithoption=#{option_text}" select_locator = "webratselectwithoption=#{option_text}"
end end
selenium.wait_for_element select_locator, 5 selenium.wait_for_element select_locator, 5
selenium.select(select_locator, option_text) selenium.select(select_locator, option_text)
end end
webrat_deprecate :selects, :select webrat_deprecate :selects, :select
def choose(label_text) def choose(label_text)
locator = "webrat=#{label_text}" locator = "webrat=#{label_text}"
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.click locator selenium.click locator
end end
webrat_deprecate :chooses, :choose webrat_deprecate :chooses, :choose
def check(label_text) def check(label_text)
locator = "webrat=#{label_text}" locator = "webrat=#{label_text}"
selenium.wait_for_element locator, 5 selenium.wait_for_element locator, 5
selenium.check locator selenium.check locator
end end
webrat_deprecate :checks, :check webrat_deprecate :checks, :check
def fire_event(field_identifier, event) def fire_event(field_identifier, event)
locator = "webrat=#{Regexp.escape(field_identifier)}" locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.fire_event(locator, "#{event}") selenium.fire_event(locator, "#{event}")
end end
def key_down(field_identifier, key_code) def key_down(field_identifier, key_code)
locator = "webrat=#{Regexp.escape(field_identifier)}" locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.key_down(locator, key_code) selenium.key_down(locator, key_code)
@ -130,7 +130,7 @@ module Webrat
locator = "webrat=#{Regexp.escape(field_identifier)}" locator = "webrat=#{Regexp.escape(field_identifier)}"
selenium.key_up(locator, key_code) selenium.key_up(locator, key_code)
end end
def wait_for(params={}) def wait_for(params={})
timeout = params[:timeout] || 5 timeout = params[:timeout] || 5
message = params[:message] || "Timeout exceeded" message = params[:message] || "Timeout exceeded"
@ -154,21 +154,21 @@ module Webrat
raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)") raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
true true
end end
def selenium def selenium
return $browser if $browser return $browser if $browser
setup setup
$browser $browser
end end
webrat_deprecate :browser, :selenium webrat_deprecate :browser, :selenium
def save_and_open_screengrab def save_and_open_screengrab
return unless File.exist?(saved_page_dir) return unless File.exist?(saved_page_dir)
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png" filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
if $browser.chrome_backend? if $browser.chrome_backend?
$browser.capture_entire_page_screenshot(filename, '') $browser.capture_entire_page_screenshot(filename, '')
else else
@ -176,25 +176,25 @@ module Webrat
end end
open_in_browser(filename) open_in_browser(filename)
end end
protected protected
def setup #:nodoc: def setup #:nodoc:
silence_stream(STDOUT) do silence_stream(STDOUT) do
Webrat.start_selenium_server Webrat.start_selenium_server
Webrat.start_app_server Webrat.start_app_server
end end
$browser = ::Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://0.0.0.0:3001") $browser = ::Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://0.0.0.0:3001")
$browser.set_speed(0) $browser.set_speed(0)
$browser.start $browser.start
teardown_at_exit teardown_at_exit
extend_selenium extend_selenium
define_location_strategies define_location_strategies
$browser.window_maximize $browser.window_maximize
end end
def teardown_at_exit #:nodoc: def teardown_at_exit #:nodoc:
at_exit do at_exit do
silence_stream(STDOUT) do silence_stream(STDOUT) do
@ -204,21 +204,21 @@ module Webrat
end end
end end
end end
def adjust_if_regexp(text_or_regexp) #:nodoc: def adjust_if_regexp(text_or_regexp) #:nodoc:
if text_or_regexp.is_a?(Regexp) if text_or_regexp.is_a?(Regexp)
"evalregex:#{text_or_regexp.inspect}" "evalregex:#{text_or_regexp.inspect}"
else else
"evalregex:/#{text_or_regexp}/" "evalregex:/#{text_or_regexp}/"
end end
end end
def extend_selenium #:nodoc: def extend_selenium #:nodoc:
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js") extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
extenions_js = File.read(extensions_file) extenions_js = File.read(extensions_file)
selenium.get_eval(extenions_js) selenium.get_eval(extenions_js)
end end
def define_location_strategies #:nodoc: def define_location_strategies #:nodoc:
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file| Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
strategy_js = File.read(file) strategy_js = File.read(file)

View File

@ -7,44 +7,44 @@ describe Webrat::Configuration do
it "should have a mode" do it "should have a mode" do
Webrat.configuration.should respond_to(:mode) Webrat.configuration.should respond_to(:mode)
end end
it "should use Nokogiri as the parser by default" do it "should use Nokogiri as the parser by default" do
Webrat.stub!(:on_java? => false) Webrat.stub!(:on_java? => false)
config = Webrat::Configuration.new config = Webrat::Configuration.new
config.should parse_with_nokogiri config.should parse_with_nokogiri
end end
it "should not use Nokogiri as the parser when on JRuby" do it "should not use Nokogiri as the parser when on JRuby" do
Webrat.stub!(:on_java? => true) Webrat.stub!(:on_java? => true)
config = Webrat::Configuration.new config = Webrat::Configuration.new
config.should_not parse_with_nokogiri config.should_not parse_with_nokogiri
end end
it "should open error files by default" do it "should open error files by default" do
config = Webrat::Configuration.new config = Webrat::Configuration.new
config.should open_error_files config.should open_error_files
end end
it "should use 'selenium' as the selenium environment by default" do it "should use 'selenium' as the selenium environment by default" do
config = Webrat::Configuration.new config = Webrat::Configuration.new
config.selenium_environment.should == :selenium config.selenium_environment.should == :selenium
end end
it "should use 3001 as the selenium port by default" do it "should use 3001 as the application port by default" do
config = Webrat::Configuration.new config = Webrat::Configuration.new
config.selenium_port.should == 3001 config.application_port.should == 3001
end end
it "should be configurable with a block" do it "should be configurable with a block" do
Webrat.configure do |config| Webrat.configure do |config|
config.open_error_files = false config.open_error_files = false
end end
config = Webrat.configuration config = Webrat.configuration
config.should_not open_error_files config.should_not open_error_files
end end
[:rails, [:rails,
:selenium, :selenium,
:rack, :rack,
:sinatra, :sinatra,
@ -56,4 +56,10 @@ describe Webrat::Configuration do
config.mode = mode config.mode = mode
end end
end end
end
describe "Selenium config" do
end
end

View File

@ -0,0 +1,19 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
require "action_controller"
require "action_controller/integration"
require "webrat/selenium"
RAILS_ROOT = "/"
describe Webrat, "Selenium" do
it "should start the app server with correct config options" do
pid_file = "file"
File.should_receive(:expand_path).with(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid").and_return pid_file
Webrat.should_receive(:system).with("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.selenium_environment} --pid #{pid_file} &")
TCPSocket.should_receive(:wait_for_service).with(:host => "0.0.0.0", :port => Webrat.configuration.application_port.to_i)
Webrat.start_app_server
end
end