require 'net/http' class SeleniumTestRunner def initialize(browser, browser_path) @browser = browser @browser_path = browser_path run end def run port = available_port server = IO.popen("ruby script/server -e test -p #{port} > #{RUBY_PLATFORM =~ /mswin/ ? 'NUL' : '/dev/null' } 2>&1") wait_until :max_time => 30 do !port_available? port end browser = IO.popen("#{@browser_path} #{url(port)}") wait_until :max_time => 600 do port_available? port end Process.kill 9, server.pid rescue nil Process.kill 9, browser.pid rescue nil result_file = "selenium_test_results_port_#{port}.log" if File.exists?(result_file) puts File.read(result_file) File.delete(result_file) else puts "Results file (#{result_file}) was not written" end end def available_port (3001..3100).find { |p| port_available? p } || raise('no available port found') end private def wait_until(options = {}, &block) waited = 0 interval, max = options[:interval] || 5, options[:max_time] || 120 until yield do waited += sleep interval return if waited > max end end def port_available?(port) Net::HTTP.get_response 'localhost', url(port), port false rescue true end def url(port) "http://localhost:#{port}/selenium/TestRunner.html?auto=true" end end