class Selenium::Server
Wraps the remote server jar
Usage:
server = Selenium::Server.new('/path/to/selenium-server-standalone.jar') server.start
Automatically download the given version:
server = Selenium::Server.get '2.6.0' server.start
or the latest version:
server = Selenium::Server.get :latest server.start
Run the server in the background:
server = Selenium::Server.new(jar, :background => true) server.start
Add additional arguments:
server = Selenium::Server.new(jar) server << ["--additional", "args"] server.start
Constants
- CL_RESET
Attributes
Whether to launch the server in the background
Path to log file, or 'true' for stdout.
The server port
The server timeout
Public Class Methods
# File lib/selenium/server.rb, line 68 def download(required_version) required_version = latest if required_version == :latest download_file_name = "selenium-server-standalone-#{required_version}.jar" return download_file_name if File.exist? download_file_name begin File.open(download_file_name, 'wb') do |destination| net_http.start('selenium-release.storage.googleapis.com') do |http| resp = http.request_get("/#{required_version[/(\d+\.\d+)\./, 1]}/#{download_file_name}") do |response| total = response.content_length progress = 0 segment_count = 0 response.read_body do |segment| progress += segment.length segment_count += 1 if (segment_count % 15).zero? percent = (progress.to_f / total.to_f) * 100 print "#{CL_RESET}Downloading #{download_file_name}: #{percent.to_i}% (#{progress} / #{total})" segment_count = 0 end destination.write(segment) end end raise Error, "#{resp.code} for #{download_file_name}" unless resp.is_a? Net::HTTPSuccess end end rescue FileUtils.rm download_file_name if File.exist? download_file_name raise end download_file_name end
# File lib/selenium/server.rb, line 59 def self.get(required_version, opts = {}) new(download(required_version), opts) end
Ask Google Code what the latest selenium-server-standalone version is.
# File lib/selenium/server.rb, line 111 def latest require 'rexml/document' net_http.start('selenium-release.storage.googleapis.com') do |http| versions = REXML::Document.new(http.get('/').body).root.get_elements('//Contents/Key').map do |e| e.text[/selenium-server-standalone-(\d+\.\d+\.\d+)\.jar/, 1] end versions.compact.map { |version| Gem::Version.new(version) }.max.version end end
# File lib/selenium/server.rb, line 122 def net_http http_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY'] if http_proxy http_proxy = "http://#{http_proxy}" unless http_proxy.start_with?('http://') uri = URI.parse(http_proxy) Net::HTTP::Proxy(uri.host, uri.port) else Net::HTTP end end
@param [String] jar Path to the server jar. @param [Hash] opts the options to create the server process with
@option opts [Integer] :port Port the server should listen on (default: 4444). @option opts [Integer] :timeout Seconds to wait for server launch/shutdown (default: 30) @option opts [true,false] :background Run the server in the background (default: false) @option opts [true,false,String] :log Either a path to a log file,
or true to pass server log to stdout.
@raise [Errno::ENOENT] if the jar file does not exist
# File lib/selenium/server.rb, line 172 def initialize(jar, opts = {}) raise Errno::ENOENT, jar unless File.exist?(jar) @jar = jar @host = '127.0.0.1' @port = opts.fetch(:port, 4444) @timeout = opts.fetch(:timeout, 30) @background = opts.fetch(:background, false) @log = opts[:log] @additional_args = [] end
Public Instance Methods
# File lib/selenium/server.rb, line 208 def <<(arg) if arg.is_a?(Array) @additional_args += arg else @additional_args << arg.to_s end end
# File lib/selenium/server.rb, line 185 def start process.start poll_for_service process.wait unless @background end
# File lib/selenium/server.rb, line 192 def stop begin Net::HTTP.get(@host, '/selenium-server/driver/?cmd=shutDownSeleniumServer', @port) rescue Errno::ECONNREFUSED end stop_process if @process poll_for_shutdown @log_file&.close end
# File lib/selenium/server.rb, line 204 def webdriver_url "http://#{@host}:#{@port}/wd/hub" end
Private Instance Methods
# File lib/selenium/server.rb, line 255 def poll_for_service return if socket.connected? raise Error, "remote server not launched in #{@timeout} seconds" end
# File lib/selenium/server.rb, line 261 def poll_for_shutdown return if socket.closed? raise Error, "remote server not stopped in #{@timeout} seconds" end
# File lib/selenium/server.rb, line 232 def process @process ||= begin # extract any additional_args that start with -D as options properties = @additional_args.dup - @additional_args.delete_if { |arg| arg[/^-D/] } server_command = ['java'] + properties + ['-jar', @jar, '-port', @port.to_s] + @additional_args cp = ChildProcess.build(*server_command) WebDriver.logger.debug("Executing Process #{server_command}") io = cp.io if @log.is_a?(String) @log_file = File.open(@log, 'w') io.stdout = io.stderr = @log_file elsif @log io.inherit! end cp.detach = @background cp end end
# File lib/selenium/server.rb, line 267 def socket @socket ||= WebDriver::SocketPoller.new(@host, @port, @timeout) end
# File lib/selenium/server.rb, line 218 def stop_process return unless @process.alive? begin @process.poll_for_exit(5) rescue ChildProcess::TimeoutError @process.stop end rescue Errno::ECHILD # already dead ensure @process = nil end