From 33d2cdcc53bd46baaa1bbbcdc4748a9dec6b9db4 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 12:13:22 -0600 Subject: [PATCH 1/8] changed selenium_port to application_port to reflect what the variable is used for ... --- lib/webrat/core/configuration.rb | 30 ++++----- lib/webrat/selenium.rb | 18 ++--- lib/webrat/selenium/selenium_session.rb | 88 ++++++++++++------------- spec/private/core/configuration_spec.rb | 30 +++++---- spec/private/selenium/selenium_spec.rb | 19 ++++++ 5 files changed, 105 insertions(+), 80 deletions(-) create mode 100644 spec/private/selenium/selenium_spec.rb diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index b0dcfc1..d77e809 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -1,60 +1,60 @@ module Webrat - + # 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) yield configuration if block_given? @@configuration = configuration end - + def self.configuration # :nodoc: @@configuration ||= Webrat::Configuration.new end # Webrat can be configured using the Webrat.configure method. For example: - # + # # Webrat.configure do |config| # config.parse_with_nokogiri = false # end class Configuration - + # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used attr_writer :parse_with_nokogiri - + # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc. attr_accessor :mode # :nodoc: - + # Save and open pages with error status codes (500-599) in a browser? Defualts to true. attr_writer :open_error_files - + # Which environment should the selenium tests be run in? Defaults to selenium. attr_accessor :selenium_environment # Which port should the selenium tests be run on? Defaults to 3001. - attr_accessor :selenium_port + attr_accessor :application_port def initialize # :nodoc: self.open_error_files = true self.parse_with_nokogiri = !Webrat.on_java? self.selenium_environment = :selenium - self.selenium_port = 3001 + self.application_port = 3001 end - + def parse_with_nokogiri? #:nodoc: @parse_with_nokogiri ? true : false end - + def open_error_files? #:nodoc: @open_error_files ? true : false end - + # Allows setting of webrat's mode, valid modes are: # :rails, :selenium, :rack, :sinatra, :mechanize, :merb def mode=(mode) @mode = mode require("webrat/#{mode}") end - + end - + end \ No newline at end of file diff --git a/lib/webrat/selenium.rb b/lib/webrat/selenium.rb index 28a9485..11357f1 100644 --- a/lib/webrat/selenium.rb +++ b/lib/webrat/selenium.rb @@ -5,41 +5,41 @@ require "webrat/selenium/selenium_session" require "webrat/selenium/matchers" module Webrat - + def self.with_selenium_server #:nodoc: start_selenium_server yield stop_selenium_server end - + def self.start_selenium_server #:nodoc: 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 TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444 end - + def self.stop_selenium_server #:nodoc: remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5) remote_control.stop end - + def self.start_app_server #:nodoc: 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} &") - TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.selenium_port.to_i + 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.application_port.to_i end - + def self.stop_app_server #:nodoc: pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid") system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}" end - + # To use Webrat's Selenium support, you'll need the selenium-client gem installed. # Activate it with (for example, in your env.rb): # # require "webrat" - # + # # Webrat.configure do |config| # config.mode = :selenium # end diff --git a/lib/webrat/selenium/selenium_session.rb b/lib/webrat/selenium/selenium_session.rb index 460269e..c8f9e58 100644 --- a/lib/webrat/selenium/selenium_session.rb +++ b/lib/webrat/selenium/selenium_session.rb @@ -3,56 +3,56 @@ require "webrat/core/save_and_open_page" module Webrat class TimeoutError < WebratError end - + class SeleniumResponse attr_reader :body attr_reader :session - + def initialize(session, body) @session = session @body = body end - + def selenium session.selenium end end - + class SeleniumSession include Webrat::SaveAndOpenPage - + def initialize(*args) # :nodoc: end - + def simulate end - + def automate yield end - + def visit(url) selenium.open(url) end - + webrat_deprecate :visits, :visit - + def fill_in(field_identifier, options) locator = "webrat=#{Regexp.escape(field_identifier)}" selenium.wait_for_element locator, 5 selenium.type(locator, "#{options[:with]}") end - + webrat_deprecate :fills_in, :fill_in - + def response SeleniumResponse.new(self, response_body) end - + def response_body #:nodoc: selenium.get_html_source end - + def click_button(button_text_or_regexp = nil, options = {}) if button_text_or_regexp.is_a?(Hash) && options == {} pattern, options = nil, button_text_or_regexp @@ -61,11 +61,11 @@ module Webrat end pattern ||= '*' locator = "button=#{pattern}" - + selenium.wait_for_element locator, 5 selenium.click locator end - + webrat_deprecate :clicks_button, :click_button def click_link(link_text_or_regexp, options = {}) @@ -74,53 +74,53 @@ module Webrat selenium.wait_for_element locator, 5 selenium.click locator end - + webrat_deprecate :clicks_link, :click_link - + def click_link_within(selector, link_text, options = {}) locator = "webratlinkwithin=#{selector}|#{link_text}" selenium.wait_for_element locator, 5 selenium.click locator end - + webrat_deprecate :clicks_link_within, :click_link_within - + def select(option_text, options = {}) id_or_name_or_label = options[:from] - + if id_or_name_or_label select_locator = "webrat=#{id_or_name_or_label}" else select_locator = "webratselectwithoption=#{option_text}" end - + selenium.wait_for_element select_locator, 5 selenium.select(select_locator, option_text) end - + webrat_deprecate :selects, :select - + def choose(label_text) locator = "webrat=#{label_text}" selenium.wait_for_element locator, 5 selenium.click locator end - + webrat_deprecate :chooses, :choose - + def check(label_text) locator = "webrat=#{label_text}" selenium.wait_for_element locator, 5 selenium.check locator end - + webrat_deprecate :checks, :check def fire_event(field_identifier, event) locator = "webrat=#{Regexp.escape(field_identifier)}" 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) @@ -130,7 +130,7 @@ module Webrat locator = "webrat=#{Regexp.escape(field_identifier)}" selenium.key_up(locator, key_code) end - + def wait_for(params={}) timeout = params[:timeout] || 5 message = params[:message] || "Timeout exceeded" @@ -154,21 +154,21 @@ module Webrat raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)") true end - + def selenium return $browser if $browser setup $browser end - + webrat_deprecate :browser, :selenium - - + + def save_and_open_screengrab return unless File.exist?(saved_page_dir) - + filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png" - + if $browser.chrome_backend? $browser.capture_entire_page_screenshot(filename, '') else @@ -176,25 +176,25 @@ module Webrat end open_in_browser(filename) end - + protected - + def setup #:nodoc: 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 - + extend_selenium define_location_strategies $browser.window_maximize end - + def teardown_at_exit #:nodoc: at_exit do silence_stream(STDOUT) do @@ -204,21 +204,21 @@ module Webrat end end end - + def adjust_if_regexp(text_or_regexp) #:nodoc: if text_or_regexp.is_a?(Regexp) "evalregex:#{text_or_regexp.inspect}" else "evalregex:/#{text_or_regexp}/" - end + end end - + 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) 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) diff --git a/spec/private/core/configuration_spec.rb b/spec/private/core/configuration_spec.rb index b29d473..08e4ac3 100755 --- a/spec/private/core/configuration_spec.rb +++ b/spec/private/core/configuration_spec.rb @@ -7,44 +7,44 @@ describe Webrat::Configuration do it "should have a mode" do Webrat.configuration.should respond_to(:mode) end - + it "should use Nokogiri as the parser by default" do Webrat.stub!(:on_java? => false) config = Webrat::Configuration.new config.should parse_with_nokogiri end - + it "should not use Nokogiri as the parser when on JRuby" do Webrat.stub!(:on_java? => true) config = Webrat::Configuration.new config.should_not parse_with_nokogiri end - + it "should open error files by default" do config = Webrat::Configuration.new config.should open_error_files end - + it "should use 'selenium' as the selenium environment by default" do config = Webrat::Configuration.new config.selenium_environment.should == :selenium 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.selenium_port.should == 3001 + config.application_port.should == 3001 end - + it "should be configurable with a block" do Webrat.configure do |config| config.open_error_files = false end - + config = Webrat.configuration config.should_not open_error_files end - - [:rails, + + [:rails, :selenium, :rack, :sinatra, @@ -56,4 +56,10 @@ describe Webrat::Configuration do config.mode = mode end end -end \ No newline at end of file + + describe "Selenium config" do + + end + +end + diff --git a/spec/private/selenium/selenium_spec.rb b/spec/private/selenium/selenium_spec.rb new file mode 100644 index 0000000..3934af1 --- /dev/null +++ b/spec/private/selenium/selenium_spec.rb @@ -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 \ No newline at end of file From 8932544d466537885c16a9d551315a0348968157 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 12:21:24 -0600 Subject: [PATCH 2/8] changed description for the application_port variable --- lib/webrat/core/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index d77e809..46f7e53 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -30,7 +30,7 @@ module Webrat # Which environment should the selenium tests be run in? Defaults to selenium. attr_accessor :selenium_environment - # Which port should the selenium tests be run on? Defaults to 3001. + # Which port is the application running on for selenium testing? Defaults to 3001. attr_accessor :application_port def initialize # :nodoc: From 0ce92dfcd8616e950f74ae09bd467e42eab5d351 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 12:32:14 -0600 Subject: [PATCH 3/8] changed selenium_environment to application_environment and deprecated selenium_environment and selenium_port --- lib/webrat/core/configuration.rb | 10 +++++++--- lib/webrat/selenium.rb | 2 +- spec/private/core/configuration_spec.rb | 8 ++------ spec/private/selenium/selenium_spec.rb | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index 46f7e53..15be55e 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -1,3 +1,5 @@ +require "webrat/core_extensions/deprecate" + module Webrat # Configures Webrat. If this is not done, Webrat will be created @@ -27,16 +29,18 @@ module Webrat # Save and open pages with error status codes (500-599) in a browser? Defualts to true. attr_writer :open_error_files - # Which environment should the selenium tests be run in? Defaults to selenium. - attr_accessor :selenium_environment + # Which rails environment should the selenium tests be run in? Defaults to selenium. + attr_accessor :application_environment + webrat_deprecate :selenium_environment, :application_environment # Which port is the application running on for selenium testing? Defaults to 3001. attr_accessor :application_port + webrat_deprecate :selenium_port, :application_port def initialize # :nodoc: self.open_error_files = true self.parse_with_nokogiri = !Webrat.on_java? - self.selenium_environment = :selenium + self.application_environment = :selenium self.application_port = 3001 end diff --git a/lib/webrat/selenium.rb b/lib/webrat/selenium.rb index 11357f1..455d21c 100644 --- a/lib/webrat/selenium.rb +++ b/lib/webrat/selenium.rb @@ -26,7 +26,7 @@ module Webrat def self.start_app_server #:nodoc: pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid") - system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_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.application_environment} --pid #{pid_file} &") TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.application_port.to_i end diff --git a/spec/private/core/configuration_spec.rb b/spec/private/core/configuration_spec.rb index 08e4ac3..20900e3 100755 --- a/spec/private/core/configuration_spec.rb +++ b/spec/private/core/configuration_spec.rb @@ -25,9 +25,9 @@ describe Webrat::Configuration do config.should open_error_files end - it "should use 'selenium' as the selenium environment by default" do + it "should use 'selenium' as the application environment by default" do config = Webrat::Configuration.new - config.selenium_environment.should == :selenium + config.application_environment.should == :selenium end it "should use 3001 as the application port by default" do @@ -57,9 +57,5 @@ describe Webrat::Configuration do end end - describe "Selenium config" do - - end - end diff --git a/spec/private/selenium/selenium_spec.rb b/spec/private/selenium/selenium_spec.rb index 3934af1..424dc6f 100644 --- a/spec/private/selenium/selenium_spec.rb +++ b/spec/private/selenium/selenium_spec.rb @@ -11,7 +11,7 @@ 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} &") + Webrat.should_receive(:system).with("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_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 From 0edffe0ac4a8be35d6101471475a0b163dab0ff3 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 12:50:53 -0600 Subject: [PATCH 4/8] added selenium_server port and address and application address for configuring selenium more dynamically --- lib/webrat/core/configuration.rb | 11 ++++++ spec/private/core/configuration_spec.rb | 47 ++++++++++++++++--------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index 15be55e..fe7471d 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -37,11 +37,22 @@ module Webrat attr_accessor :application_port webrat_deprecate :selenium_port, :application_port + # Which server the application is running on for selenium testing? Defaults to localhost + attr_accessor :application_address + + # Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally) + attr_accessor :selenium_server_address + + # Which server Selenium port is running on. Defaults to 4444 + attr_accessor :selenium_server_port + def initialize # :nodoc: self.open_error_files = true self.parse_with_nokogiri = !Webrat.on_java? self.application_environment = :selenium self.application_port = 3001 + self.application_address = "localhost" + self.selenium_server_port = 4444 end def parse_with_nokogiri? #:nodoc: diff --git a/spec/private/core/configuration_spec.rb b/spec/private/core/configuration_spec.rb index 20900e3..dcc7be2 100755 --- a/spec/private/core/configuration_spec.rb +++ b/spec/private/core/configuration_spec.rb @@ -25,16 +25,6 @@ describe Webrat::Configuration do config.should open_error_files end - it "should use 'selenium' as the application environment by default" do - config = Webrat::Configuration.new - config.application_environment.should == :selenium - end - - it "should use 3001 as the application port by default" do - config = Webrat::Configuration.new - config.application_port.should == 3001 - end - it "should be configurable with a block" do Webrat.configure do |config| config.open_error_files = false @@ -45,11 +35,11 @@ describe Webrat::Configuration do end [:rails, - :selenium, - :rack, - :sinatra, - :merb, - :mechanize].each do |mode| + :selenium, + :rack, + :sinatra, + :merb, + :mechanize].each do |mode| it "should require correct lib when in #{mode} mode" do config = Webrat::Configuration.new config.should_receive(:require).with("webrat/#{mode}") @@ -57,5 +47,30 @@ describe Webrat::Configuration do end end -end + describe "Selenium" do + before :each do + @config = Webrat::Configuration.new + end + it "should use 'selenium' as the application environment by default" do + @config.application_environment.should == :selenium + end + + it "should use 3001 as the application port by default" do + @config.application_port.should == 3001 + end + + it 'should default application address to localhost' do + @config.application_address.should == 'localhost' + end + + it 'should default selenium server address to nil' do + @config.selenium_server_address.should be_nil + end + + it 'should default selenium server port to 4444' do + @config.selenium_server_port.should == 4444 + end + end + +end From e49c341fc00be1eba23896acc21de11ddca5d4e7 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 14:17:05 -0600 Subject: [PATCH 5/8] implemented start and stop selenium server only if the selenium_server_address is nil --- lib/webrat/selenium.rb | 15 +++++------ spec/private/selenium/selenium_spec.rb | 35 +++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/lib/webrat/selenium.rb b/lib/webrat/selenium.rb index 455d21c..b07be88 100644 --- a/lib/webrat/selenium.rb +++ b/lib/webrat/selenium.rb @@ -13,21 +13,22 @@ module Webrat end def self.start_selenium_server #:nodoc: - 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 - TCPSocket.wait_for_service :host => "0.0.0.0", :port => 4444 + unless Webrat.configuration.selenium_server_address + remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5) + remote_control.jar_file = File.expand_path(__FILE__ + "../../../../vendor/selenium-server.jar") + remote_control.start :background => true + end + TCPSocket.wait_for_service :host => (Webrat.configuration.selenium_server_address || "0.0.0.0"), :port => Webrat.configuration.selenium_server_port end def self.stop_selenium_server #:nodoc: - remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", 4444, 5) - remote_control.stop + ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5).stop unless Webrat.configuration.selenium_server_address end def self.start_app_server #:nodoc: pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid") system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &") - TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.application_port.to_i + TCPSocket.wait_for_service :host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i end def self.stop_app_server #:nodoc: diff --git a/spec/private/selenium/selenium_spec.rb b/spec/private/selenium/selenium_spec.rb index 424dc6f..571bf06 100644 --- a/spec/private/selenium/selenium_spec.rb +++ b/spec/private/selenium/selenium_spec.rb @@ -12,8 +12,41 @@ describe Webrat, "Selenium" 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.application_environment} --pid #{pid_file} &") - TCPSocket.should_receive(:wait_for_service).with(:host => "0.0.0.0", :port => Webrat.configuration.application_port.to_i) + TCPSocket.should_receive(:wait_for_service).with(:host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i) Webrat.start_app_server end + describe "start_selenium_server" do + it "should not start the local selenium server if the selenium_server_address is set" do + Webrat.configuration.selenium_server_address = 'foo address' + ::Selenium::RemoteControl::RemoteControl.should_not_receive(:new) + TCPSocket.should_receive(:wait_for_service).with(:host => Webrat.configuration.selenium_server_address, :port => Webrat.configuration.selenium_server_port) + Webrat.start_selenium_server + end + + it "should start the local selenium server if the selenium_server_address is set" do + remote_control = mock "selenium remote control" + ::Selenium::RemoteControl::RemoteControl.should_receive(:new).with("0.0.0.0", Webrat.configuration.selenium_server_port, 5).and_return remote_control + remote_control.should_receive(:jar_file=).with(/selenium-server\.jar/) + remote_control.should_receive(:start).with(:background => true) + TCPSocket.should_receive(:wait_for_service).with(:host => "0.0.0.0", :port => Webrat.configuration.selenium_server_port) + Webrat.start_selenium_server + end + end + + describe "stop_selenium_server" do + + it "should not attempt to stop the server if the selenium_server_address is set" do + Webrat.configuration.selenium_server_address = 'foo address' + ::Selenium::RemoteControl::RemoteControl.should_not_receive(:new) + Webrat.stop_selenium_server + end + + it "should stop the local server is the selenium_server_address is nil" do + remote_control = mock "selenium remote control" + ::Selenium::RemoteControl::RemoteControl.should_receive(:new).with("0.0.0.0", Webrat.configuration.selenium_server_port, 5).and_return remote_control + remote_control.should_receive(:stop) + Webrat.stop_selenium_server + end + end end \ No newline at end of file From c79d2216b288830b28bded289f1befc225bc227e Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 15:15:11 -0600 Subject: [PATCH 6/8] added selenium_browser_key to allow running on more than firefox, and completed the ability to configure to work with selenium grid." " --- lib/webrat/core/configuration.rb | 6 ++- lib/webrat/selenium/selenium_session.rb | 10 ++++- spec/private/core/configuration_spec.rb | 4 ++ .../private/selenium/selenium_session_spec.rb | 44 +++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 spec/private/selenium/selenium_session_spec.rb diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index fe7471d..0e4c522 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -46,13 +46,17 @@ module Webrat # Which server Selenium port is running on. Defaults to 4444 attr_accessor :selenium_server_port + # Set the key that Selenium uses to determine the browser running. Default *firefox + attr_accessor :selenium_browser_key + def initialize # :nodoc: self.open_error_files = true self.parse_with_nokogiri = !Webrat.on_java? self.application_environment = :selenium self.application_port = 3001 - self.application_address = "localhost" + self.application_address = 'localhost' self.selenium_server_port = 4444 + self.selenium_browser_key = '*firefox' end def parse_with_nokogiri? #:nodoc: diff --git a/lib/webrat/selenium/selenium_session.rb b/lib/webrat/selenium/selenium_session.rb index c8f9e58..90fdf39 100644 --- a/lib/webrat/selenium/selenium_session.rb +++ b/lib/webrat/selenium/selenium_session.rb @@ -185,8 +185,7 @@ module Webrat Webrat.start_app_server end - $browser = ::Selenium::Client::Driver.new("localhost", 4444, "*firefox", "http://0.0.0.0:3001") - $browser.set_speed(0) + create_browser $browser.start teardown_at_exit @@ -195,6 +194,13 @@ module Webrat $browser.window_maximize end + + def create_browser + $browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost", + Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}") + $browser.set_speed(0) unless Webrat.configuration.selenium_server_address + end + def teardown_at_exit #:nodoc: at_exit do silence_stream(STDOUT) do diff --git a/spec/private/core/configuration_spec.rb b/spec/private/core/configuration_spec.rb index dcc7be2..1b5ee98 100755 --- a/spec/private/core/configuration_spec.rb +++ b/spec/private/core/configuration_spec.rb @@ -71,6 +71,10 @@ describe Webrat::Configuration do it 'should default selenium server port to 4444' do @config.selenium_server_port.should == 4444 end + + it 'should default selenium browser key to *firefox' do + @config.selenium_browser_key.should == '*firefox' + end end end diff --git a/spec/private/selenium/selenium_session_spec.rb b/spec/private/selenium/selenium_session_spec.rb new file mode 100644 index 0000000..d92e497 --- /dev/null +++ b/spec/private/selenium/selenium_session_spec.rb @@ -0,0 +1,44 @@ +require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') +require "action_controller" +require "action_controller/integration" +require "webrat/selenium" + +describe Webrat::SeleniumSession do + + describe "create browser" do + + it "should start the local selenium client and set speed to 0 when selenium_server_address is nil" do + selenium_session = Webrat::SeleniumSession.new + browser = mock "mock browser" + ::Selenium::Client::Driver.should_receive(:new).with("localhost", Webrat.configuration.selenium_server_port, "*firefox", "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}").and_return browser + browser.should_receive(:set_speed).with(0) + selenium_session.send :create_browser + end + + it "should start the remote selenium client when selenium_server_address is set" do + Webrat.configuration.selenium_server_address = 'foo address' + selenium_session = Webrat::SeleniumSession.new + browser = mock "mock browser" + ::Selenium::Client::Driver.should_receive(:new).with(Webrat.configuration.selenium_server_address, Webrat.configuration.selenium_server_port, "*firefox", "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}").and_return browser + browser.should_not_receive(:set_speed) + selenium_session.send :create_browser + end + + it "should use the config specifications" do + Webrat.configuration.selenium_server_port = 'selenium port' + Webrat.configuration.selenium_server_address = 'selenium address' + Webrat.configuration.application_port = 'app port' + Webrat.configuration.application_address = 'app address' + Webrat.configuration.selenium_browser_key = 'browser key' + + selenium_session = Webrat::SeleniumSession.new + browser = mock "mock browser" + ::Selenium::Client::Driver.should_receive(:new).with('selenium address', + 'selenium port', 'browser key', + "http://app address:app port").and_return browser + browser.should_not_receive(:set_speed) + selenium_session.send :create_browser + end + end + +end \ No newline at end of file From 714d8679ed468b42968d7e69770a63bb8a5d98e0 Mon Sep 17 00:00:00 2001 From: Amos King Date: Tue, 6 Jan 2009 09:45:51 -0600 Subject: [PATCH 7/8] change attr_accessor :mode to attr_reader since there is a writer created after --- lib/webrat/core/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/webrat/core/configuration.rb b/lib/webrat/core/configuration.rb index 0e4c522..c2120b7 100755 --- a/lib/webrat/core/configuration.rb +++ b/lib/webrat/core/configuration.rb @@ -24,7 +24,7 @@ module Webrat attr_writer :parse_with_nokogiri # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc. - attr_accessor :mode # :nodoc: + attr_reader :mode # :nodoc: # Save and open pages with error status codes (500-599) in a browser? Defualts to true. attr_writer :open_error_files From 0a75799079e8b0a512a96ebb0fbebbfc468c0ce2 Mon Sep 17 00:00:00 2001 From: "cornel.borcean" Date: Mon, 12 Jan 2009 15:48:26 -0600 Subject: [PATCH 8/8] update History file --- History.txt | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/History.txt b/History.txt index 5b9cb73..ee5114f 100644 --- a/History.txt +++ b/History.txt @@ -5,17 +5,18 @@ * Removed init.rb auto-require of webrat/rails * Removed auto-require of webrat/rails when requiring webrat when RAILS_ENV is defined - + In your env.rb or test_helper.rb file, ensure you have something like: - + require "webrat" - + Webrat.configure do |config| config.mode = :rails end - + * Major enhancements + * Added Selenium grid configuration and support. (Amos King && Cornel Borcean) * Added select_time, select_date, and select_datetime to API. [#36] (Ben Mabey) * Use Hpricot and REXML when not parsing with Nokogiri (on JRuby, for example) @@ -62,7 +63,7 @@ * Added save_and_open_screengrab for Selenium mode (Luke Melia) * Bug fixes - + * Match against link _text_ which decodes character references. Useful for multibyte languages like Japanese (moronatural@gmail.com) * Fix params hash generation for Mechanize when Merb is not defined [#62] @@ -74,23 +75,23 @@ * Fixed bug where Webrat would lose complex parameters (like foo[bar[baz]][]) in Merb due to not correctly merging Mashes. (Drew Colthorp) * Extend Rails' ActionController::IntegrationTest instead of - ActionController::Integration::Session (Fixes using Webrat's #select method and + ActionController::Integration::Session (Fixes using Webrat's #select method and avoids usage of method_missing) - * Ensure that Webrat::MechanizeSession.request_page always uses an absolute + * Ensure that Webrat::MechanizeSession.request_page always uses an absolute URL. (Graham Ashton) * Strip anchor tags from URIs before passing to Rails integration session (Noah Davis) * Treat text and regexp when matching Selenium buttons (Ross Kaffenberger) * Allow SeleniumSession's click_button to be called without an argument without blowing up (Luke Melia) - + == 0.3.2 / 2008-11-08 * 1 Minor enhancement * Fixes behavior or have_tag when a block is passed. It passes the matched node(s) to the block for further specs again. (Carl Lerche) - + == 0.3.1 / 2008-11-07 * 1 Minor enhancement @@ -106,7 +107,7 @@ * Added experimental Selenium support (Luke Melia) * Add have_selector, have_xpath, have_tag and contain matchers from Merb * Switch from Hpricot to Nokogiri for XML parsing (thanks, Aaron Patterson) - + * 37 Minor enhancements * Added #within for manipulating the current page within a selector scope @@ -153,7 +154,7 @@ * Switched tests to specs, and from Mocha to RSpec's mocking library * Add support to click_button for IDs (Gwyn Morfey) * Miscellaneous core refactorings (Jan Suchal) - + * 8 Bug fixes * Fix initialization of WWW::Mechanize (Derek Kastner) @@ -165,7 +166,7 @@ * Don't explode if encountering inputs with no type attribute (assume text) * Fix bug where choosing a radio button in a series with a default submitted the incorrect field value (Luke Melia) - + == 0.2.0 / 2008-04-04 * 4 Major enhancements @@ -175,12 +176,12 @@ * Add basic support for Rails-generated JavaScript link tags * Add support for checkboxes (Patches from Kyle Hargraves and Jarkko Laine) * Add support for textarea fields (Sacha Schlegel) - + * 8 Minor enhancements - + * Added reloads method to reload the page (Kamal Fariz Mahyuddi) * Prevent making a request if clicking on local anchor link (Kamal Fariz Mahyuddi) - * Added clicks_link_within(selector, link_text), allowing restricting link search + * Added clicks_link_within(selector, link_text), allowing restricting link search to within a given css selector (Luke Melia) * Allow specifying the input name/label when doing a select (David Chelimsky) * Raise a specific exception if the developer tries to manipulate form elements @@ -188,7 +189,7 @@ * Add support for alternate POST, PUT and DELETE link clicking (Kyle Hargraves) * Change clicks_link to find the shortest matching link (Luke Melia) * Improve matching for labels in potentially ambiguous cases - + * 7 Bug fixes * Fix incorrect serializing of collection inputs, i.e. name contains []