Make selenium process management code more robust and informative
This commit is contained in:
parent
304baeb754
commit
91ea8cfa54
27
lib/webrat/core_extensions/tcp_socket.rb
Normal file
27
lib/webrat/core_extensions/tcp_socket.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
class TCPSocket
|
||||||
|
|
||||||
|
def self.wait_for_service_with_timeout(options)
|
||||||
|
start_time = Time.now
|
||||||
|
|
||||||
|
until listening_service?(options)
|
||||||
|
verbose_wait
|
||||||
|
|
||||||
|
if options[:timeout] && (Time.now > start_time + options[:timeout])
|
||||||
|
raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.wait_for_service_termination_with_timeout(options)
|
||||||
|
start_time = Time.now
|
||||||
|
|
||||||
|
while listening_service?(options)
|
||||||
|
verbose_wait
|
||||||
|
|
||||||
|
if options[:timeout] && (Time.now > start_time + options[:timeout])
|
||||||
|
raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -3,6 +3,7 @@ gem "selenium-client", ">=1.2.14"
|
|||||||
require "selenium/client"
|
require "selenium/client"
|
||||||
require "webrat/selenium/selenium_session"
|
require "webrat/selenium/selenium_session"
|
||||||
require "webrat/selenium/matchers"
|
require "webrat/selenium/matchers"
|
||||||
|
require "webrat/core_extensions/tcp_socket"
|
||||||
|
|
||||||
module Webrat
|
module Webrat
|
||||||
|
|
||||||
@ -16,9 +17,31 @@ module Webrat
|
|||||||
unless Webrat.configuration.selenium_server_address
|
unless Webrat.configuration.selenium_server_address
|
||||||
remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5)
|
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.jar_file = File.expand_path(__FILE__ + "../../../../vendor/selenium-server.jar")
|
||||||
|
|
||||||
|
silence_stream(STDOUT) do
|
||||||
remote_control.start :background => true
|
remote_control.start :background => true
|
||||||
end
|
end
|
||||||
TCPSocket.wait_for_service :host => (Webrat.configuration.selenium_server_address || "0.0.0.0"), :port => Webrat.configuration.selenium_server_port
|
end
|
||||||
|
|
||||||
|
$stderr.print "==> Started selenium RC server. Waiting for it to boot... "
|
||||||
|
silence_stream(STDOUT) do
|
||||||
|
TCPSocket.wait_for_service_with_timeout \
|
||||||
|
:host => (Webrat.configuration.selenium_server_address || "0.0.0.0"),
|
||||||
|
:port => Webrat.configuration.selenium_server_port,
|
||||||
|
:timeout => 15 # seconds
|
||||||
|
end
|
||||||
|
$stderr.print "Ready!\n"
|
||||||
|
|
||||||
|
at_exit do
|
||||||
|
silence_stream(STDOUT) do
|
||||||
|
Webrat.stop_selenium_server
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue SocketError
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts "==> Failed to boot the Selenium RC server... exiting!"
|
||||||
|
exit
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.stop_selenium_server #:nodoc:
|
def self.stop_selenium_server #:nodoc:
|
||||||
@ -45,15 +68,50 @@ module Webrat
|
|||||||
exec 'rackup', File.expand_path(Dir.pwd + '/config.ru'), '-p', Webrat.configuration.application_port.to_s
|
exec 'rackup', File.expand_path(Dir.pwd + '/config.ru'), '-p', Webrat.configuration.application_port.to_s
|
||||||
end
|
end
|
||||||
when :merb
|
when :merb
|
||||||
cmd = 'merb'
|
merb_cmd = 'merb'
|
||||||
if File.exist?('bin/merb')
|
if File.exist?('bin/merb')
|
||||||
cmd = 'bin/merb'
|
merb_cmd = 'bin/merb'
|
||||||
end
|
end
|
||||||
system("#{cmd} -d -p #{Webrat.configuration.application_port} -e #{Webrat.configuration.application_environment}")
|
cmd = "#{merb_cmd} -d -p #{Webrat.configuration.application_port} -e #{Webrat.configuration.application_environment}"
|
||||||
|
system cmd
|
||||||
else # rails
|
else # rails
|
||||||
system("mongrel_rails start -d --chdir='#{RAILS_ROOT}' --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &")
|
cmd = "mongrel_rails start -d --chdir='#{RAILS_ROOT}' --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &"
|
||||||
|
system cmd
|
||||||
end
|
end
|
||||||
TCPSocket.wait_for_service :host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i
|
|
||||||
|
$stderr.print "==> Started #{Webrat.configuration.application_framework} application server for Selenium. Waiting for it to boot... "
|
||||||
|
silence_stream(STDOUT) do
|
||||||
|
TCPSocket.wait_for_service_with_timeout \
|
||||||
|
:host => Webrat.configuration.application_address,
|
||||||
|
:port => Webrat.configuration.application_port.to_i,
|
||||||
|
:timeout => 30 # seconds
|
||||||
|
end
|
||||||
|
$stderr.print "Ready!\n"
|
||||||
|
|
||||||
|
at_exit do
|
||||||
|
silence_stream(STDOUT) do
|
||||||
|
Webrat.stop_app_server
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue SocketError
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts "==> Failed to boot the application server for selenium... exiting!"
|
||||||
|
|
||||||
|
case Webrat.configuration.application_framework
|
||||||
|
when :sinatra
|
||||||
|
when :merb
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts "Verify you can start a Merb server with the folliwing command:"
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts " #{cmd}"
|
||||||
|
else # rails
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts "Verify you can start a Rails server with the folliwing command:"
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts " #{cmd}"
|
||||||
|
end
|
||||||
|
exit
|
||||||
end
|
end
|
||||||
|
|
||||||
# Stop the appserver for the underlying framework under test
|
# Stop the appserver for the underlying framework under test
|
||||||
|
@ -189,16 +189,11 @@ module Webrat
|
|||||||
end
|
end
|
||||||
|
|
||||||
def setup #:nodoc:
|
def setup #:nodoc:
|
||||||
silence_stream(STDOUT) do
|
|
||||||
silence_stream(STDERR) do
|
|
||||||
Webrat.start_selenium_server
|
Webrat.start_selenium_server
|
||||||
Webrat.start_app_server
|
Webrat.start_app_server
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
create_browser
|
create_browser
|
||||||
$browser.start
|
$browser.start
|
||||||
teardown_at_exit
|
|
||||||
|
|
||||||
extend_selenium
|
extend_selenium
|
||||||
define_location_strategies
|
define_location_strategies
|
||||||
@ -210,14 +205,10 @@ module Webrat
|
|||||||
$browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
|
$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}")
|
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
|
$browser.set_speed(0) unless Webrat.configuration.selenium_server_address
|
||||||
end
|
|
||||||
|
|
||||||
def teardown_at_exit #:nodoc:
|
|
||||||
at_exit do
|
at_exit do
|
||||||
silence_stream(STDOUT) do
|
silence_stream(STDOUT) do
|
||||||
$browser.stop
|
$browser.stop
|
||||||
Webrat.stop_app_server
|
|
||||||
Webrat.stop_selenium_server
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user