Skip to content

Commit e1292c8

Browse files
committed
[rb] fix downloading of Selenium Server
1 parent a25ad32 commit e1292c8

File tree

3 files changed

+67
-65
lines changed

3 files changed

+67
-65
lines changed

rb/lib/selenium/server.rb

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,41 @@ class Error < StandardError; end
5757

5858
CL_RESET = WebDriver::Platform.windows? ? '' : "\r\e[0K"
5959

60-
def self.get(required_version, opts = {})
61-
new(download(required_version), opts)
62-
end
60+
class << self
61+
#
62+
# Download the given version of the selenium-server jar and return instance
63+
#
64+
# @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
65+
# @param [Hash] opts
66+
# @return [Selenium::Server]
67+
#
6368

64-
#
65-
# Download the given version of the selenium-server-standalone jar.
66-
#
69+
def get(required_version = :latest, opts = {})
70+
new(download(required_version), opts)
71+
end
6772

68-
class << self
69-
def download(required_version)
73+
#
74+
# Download the given version of the selenium-server jar and return location
75+
#
76+
# @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
77+
# @return [String] location of downloaded file
78+
#
79+
80+
def download(required_version = :latest)
7081
required_version = latest if required_version == :latest
71-
download_file_name = "selenium-server-standalone-#{required_version}.jar"
82+
download_file_name = "selenium-server-#{required_version}.jar"
7283

7384
return download_file_name if File.exist? download_file_name
7485

7586
begin
87+
server = 'https://github.com/seleniumhq/selenium/releases/download'
88+
released = Net::HTTP.get_response(URI.parse("#{server}/selenium-#{required_version}/#{download_file_name}"))
89+
redirected = URI.parse released.header['location']
90+
7691
File.open(download_file_name, 'wb') do |destination|
77-
net_http_start('selenium-release.storage.googleapis.com') do |http|
78-
resp = http.request_get("/#{required_version[/(\d+\.\d+)\./, 1]}/#{download_file_name}") do |response|
92+
net_http_start('github-releases.githubusercontent.com') do |http|
93+
request = Net::HTTP::Get.new redirected
94+
resp = http.request(request) do |response|
7995
total = response.content_length
8096
progress = 0
8197
segment_count = 0
@@ -106,30 +122,35 @@ def download(required_version)
106122
end
107123

108124
#
109-
# Ask Google Code what the latest selenium-server-standalone version is.
125+
# Ask GitHub what the latest selenium-server version is.
110126
#
111127

112128
def latest
113-
require 'rexml/document'
114-
net_http_start('selenium-release.storage.googleapis.com') do |http|
115-
versions = REXML::Document.new(http.get('/').body).root.get_elements('//Contents/Key').map do |e|
116-
e.text[/selenium-server-standalone-(\d+\.\d+\.\d+)\.jar/, 1]
117-
end
118-
119-
versions.compact.map { |version| Gem::Version.new(version) }.max.version
120-
end
129+
@latest ||= begin
130+
net_http_start('api.github.com') do |http|
131+
json = http.get('/repos/seleniumhq/selenium/releases').body
132+
JSON.parse(json).map { |release|
133+
release['assets']
134+
}.flatten.map { |asset|
135+
asset['name'][/selenium-server-(\d+\.\d+\.\d+)\.jar/, 1]
136+
}.compact.map { |version|
137+
Gem::Version.new(version)
138+
}.max.version
139+
end
140+
end
121141
end
122142

143+
# @api private
144+
123145
def net_http_start(address, &block)
124146
http_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
125-
126147
if http_proxy
127148
http_proxy = "http://#{http_proxy}" unless http_proxy.start_with?('http://')
128149
uri = URI.parse(http_proxy)
129150

130151
Net::HTTP.start(address, nil, uri.host, uri.port, &block)
131152
else
132-
Net::HTTP.start(address, &block)
153+
Net::HTTP.start(address, use_ssl: true, &block)
133154
end
134155
end
135156
end
@@ -200,10 +221,6 @@ def <<(arg)
200221

201222
private
202223

203-
def selenium4?
204-
@jar.match?(/[^.]4\./) || @jar.include?('deploy')
205-
end
206-
207224
def stop_process
208225
return unless @process.alive?
209226

@@ -222,10 +239,7 @@ def process
222239
@process ||= begin
223240
# extract any additional_args that start with -D as options
224241
properties = @additional_args.dup - @additional_args.delete_if { |arg| arg[/^-D/] }
225-
args = ['-jar', @jar]
226-
args << @role if selenium4?
227-
args << (selenium4? ? '--port' : '-port')
228-
args << @port.to_s
242+
args = ['-jar', @jar, @role, '--port', @port.to_s]
229243
server_command = ['java'] + properties + args + @additional_args
230244
cp = ChildProcess.build(*server_command)
231245
WebDriver.logger.debug("Executing Process #{server_command}")

rb/spec/integration/selenium/webdriver/spec_support/test_environment.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def remote_server_jar
109109
elsif File.exist?(built_jar) && ENV['DOWNLOAD_SERVER'].nil?
110110
built_jar
111111
else
112-
Selenium::Server.download(:latest)
112+
Selenium::Server.download
113113
end
114114

115115
WebDriver.logger.info "Server Location: #{jar}"

rb/spec/unit/selenium/server_spec.rb

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ module Selenium
111111
end
112112

113113
it 'downloads the specified version from the selenium site' do
114-
required_version = '10.2.0'
115-
expected_download_file_name = "selenium-server-standalone-#{required_version}.jar"
114+
required_version = '10.0.0'
115+
expected_download_file_name = "selenium-server-#{required_version}.jar"
116+
download = 'https://github.com/seleniumhq/selenium/releases/download'
116117

117-
stub_request(:get, 'http://selenium-release.storage.googleapis.com/10.2/selenium-server-standalone-10.2.0.jar')
118+
stub_request(:get, "#{download}/selenium-10.0.0/#{expected_download_file_name}")
118119
.to_return(body: 'this is pretending to be a jar file for testing purposes')
119120

120121
begin
@@ -154,7 +155,7 @@ module Selenium
154155

155156
it 'only downloads a jar if it is not present in the current directory' do
156157
required_version = '10.2.0'
157-
expected_download_file_name = "selenium-server-standalone-#{required_version}.jar"
158+
expected_download_file_name = "selenium-server-#{required_version}.jar"
158159

159160
allow(File).to receive(:exist?).with(expected_download_file_name).and_return true
160161

@@ -163,36 +164,23 @@ module Selenium
163164
end
164165

165166
it 'should know what the latest version available is' do
166-
latest_version = '2.42.2'
167-
example_xml = +"<?xml version='1.0' encoding='UTF-8'?><ListBucketResult "
168-
example_xml << "xmlns='http://doc.s3.amazonaws.com/2006-03-01'><Name>"
169-
example_xml << 'selenium-release</Name><Contents><Key>2.39/'
170-
example_xml << 'selenium-server-2.39.0.zip</Key></Contents><Contents>'
171-
example_xml << "<Key>2.42/selenium-server-standalone-#{latest_version}.jar"
172-
example_xml << '</Key></Contents></ListBucketResult>'
173-
stub_request(:get, 'http://selenium-release.storage.googleapis.com/').to_return(body: example_xml)
174-
175-
expect(Selenium::Server.latest).to eq(latest_version)
176-
end
177-
178-
it 'should download the latest version if that has been specified' do
179-
required_version = '2.42.2'
180-
minor_version = '2.42'
181-
expected_download_file_name = "selenium-server-standalone-#{required_version}.jar"
182-
183-
allow(Selenium::Server).to receive(:latest).and_return required_version
184-
stub_request(:get,
185-
"http://selenium-release.storage.googleapis.com/#{minor_version}/#{expected_download_file_name}")
186-
.to_return(body: 'this is pretending to be a jar file for testing purposes')
187-
188-
begin
189-
actual_download_file_name = Selenium::Server.download(:latest)
190-
expect(actual_download_file_name).to eq(expected_download_file_name)
191-
expect(File).to exist(expected_download_file_name)
192-
expect(Selenium::Server).to have_received(:latest)
193-
ensure
194-
FileUtils.rm_rf expected_download_file_name
195-
end
167+
expected_latest = '10.0.1'
168+
repo = 'https://api.github.com/repos/seleniumhq/selenium/releases'
169+
example_json = [{"url": "#{repo}/41272273",
170+
"assets": {
171+
"name": 'selenium-server-3.141.59.jar',
172+
"browser_download_url": "#{repo}/selenium-3.141.59/selenium-server-standalone-3.141.59.jar"
173+
}},
174+
{"url": "#{repo}/51272273",
175+
"assets": {
176+
"name": 'selenium-server-10.0.1.jar',
177+
"browser_download_url": "#{repo}/selenium-10.0.1/selenium-server-10.0.1.jar"
178+
}}
179+
]
180+
181+
stub_request(:get, repo).to_return(body: example_json.to_json)
182+
183+
expect(Selenium::Server.latest).to eq(expected_latest)
196184
end
197185

198186
it 'raises Selenium::Server::Error if the server is not launched within the timeout' do

0 commit comments

Comments
 (0)