Skip to content

Commit

Permalink
[rb] build server for remote testing instead of downloading the lates…
Browse files Browse the repository at this point in the history
…t release
  • Loading branch information
titusfortner committed Jul 15, 2020
1 parent f7f0fea commit 78c5f0b
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 49 deletions.
3 changes: 3 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,10 @@ task test_rb_remote: [
'//rb:remote-chrome-test',
'//rb:remote-firefox-test',
('//rb:remote-safari-test' if SeleniumRake::Checks.mac?),
# BUG - https://github.com/SeleniumHQ/selenium/issues/6791
# ('//rb:remote-safari-preview-test' if SeleniumRake::Checks.mac?),
('//rb:remote-ie-test' if SeleniumRake::Checks.windows?),
('//rb:remote-edge-test' unless SeleniumRake::Checks.linux?)
].compact

task test_py: [:py_prep_for_install_release, 'py:marionette_test']
Expand Down
41 changes: 35 additions & 6 deletions rb/build.desc
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ ruby_library(name = "chrome",
deps = [":common"]
)

ruby_library(name = "remote",
srcs = [
"lib/selenium/webdriver/remote/**/*.rb",
"lib/selenium/webdriver/remote.rb"
],
resources = [
{"//java/server/src/org/openqa/selenium/grid:selenium_server_deploy.jar": "rb/selenium_server_deploy.jar"}
],
deps = [":common"]
)

ruby_test(name = "chrome",
srcs = [
"spec/integration/selenium/webdriver/*_spec.rb",
Expand All @@ -84,7 +95,10 @@ ruby_test(name = "remote-chrome",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":chrome"]
deps = [
":chrome",
":remote"
]
)

ruby_library(name = "edge-html",
Expand Down Expand Up @@ -125,7 +139,10 @@ ruby_test(name = "remote-edge",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":edge-chrome"]
deps = [
":edge-chrome",
":remote"
]
)

ruby_library(name = "firefox",
Expand Down Expand Up @@ -158,7 +175,10 @@ ruby_test(name = "remote-firefox",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":firefox"]
deps = [
":firefox",
":remote"
]
)

ruby_library(name = "ie",
Expand Down Expand Up @@ -191,7 +211,10 @@ ruby_test(name = "remote-ie",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":ie"]
deps = [
":ie",
":remote"
]
)

ruby_library(name = "safari",
Expand Down Expand Up @@ -224,7 +247,10 @@ ruby_test(name = "remote-safari",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":safari"]
deps = [
":safari",
":remote"
]
)

ruby_test(name = "safari-preview",
Expand All @@ -249,7 +275,10 @@ ruby_test(name = "remote-safari-preview",
"rb/spec/integration",
"build/rb/lib"
],
deps = [":safari"]
deps = [
":safari",
":remote"
]
)

ruby_library(name = "devtools",
Expand Down
18 changes: 17 additions & 1 deletion rb/lib/selenium/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,13 @@ def net_http_start(address, &block)
end
end

#
# The Mode of the Server
# :standalone, #hub, #node
#

attr_accessor :role

#
# The server port
#
Expand Down Expand Up @@ -175,6 +182,7 @@ def initialize(jar, opts = {})

@jar = jar
@host = '127.0.0.1'
@role = opts.fetch(:role, 'standalone')
@port = opts.fetch(:port, 4444)
@timeout = opts.fetch(:timeout, 30)
@background = opts.fetch(:background, false)
Expand Down Expand Up @@ -216,6 +224,10 @@ def <<(arg)

private

def selenium4?
@jar.match?(/[^\.][4]\./) || @jar.include?('deploy')
end

def stop_process
return unless @process.alive?

Expand All @@ -234,7 +246,11 @@ 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
args = ['-jar', @jar]
args << @role if selenium4?
args << (selenium4? ? '--port' : '-port')
args << @port.to_s
server_command = ['java'] + properties + args + @additional_args
cp = ChildProcess.build(*server_command)
WebDriver.logger.debug("Executing Process #{server_command}")

Expand Down
2 changes: 2 additions & 0 deletions rb/spec/integration/selenium/webdriver/chrome/options_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ module Chrome
describe Options, exclusive: {browser: :chrome} do
subject(:options) { Options.new }

before { quit_driver }

it 'passes emulated device correctly' do
options.add_emulation(device_name: 'Nexus 5')

Expand Down
4 changes: 2 additions & 2 deletions rb/spec/integration/selenium/webdriver/remote/element_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module WebDriver
driver.file_detector = nil
end

context 'when uploading one file', only: {browser: %i[chrome firefox ie safari]} do
context 'when uploading one file' do
it 'uses the file detector' do
driver.navigate.to url_for('upload.html')

Expand All @@ -46,7 +46,7 @@ module WebDriver
end
end

context 'when uploading multiple files', only: {browser: %i[chrome firefox safari]} do
context 'when uploading multiple files' do
it 'uses the file detector' do
driver.navigate.to url_for('upload_multiple.html')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,23 @@ def remote_server?
end

def remote_server_jar
file_name = "selenium-server-standalone-#{Selenium::Server.latest}.jar"
locations = ["#{root}/#{file_name}", "#{root.join('rb/')}#{file_name}"]
@remote_server_jar = locations.find { |file| File.exist?(file) }
return @remote_server_jar if @remote_server_jar
local_selenium_jar = 'selenium_server_deploy.jar'
downloaded_selenium_jar = "selenium-server-standalone-#{Selenium::Server.latest}.jar"

Selenium::Server.download(:latest)
@remote_server_jar = locations.find { |file| File.exist?(file) }
directory_names = [root, root.join('rb'), root.join('build'), root.join('build/rb')]
file_names = [local_selenium_jar, downloaded_selenium_jar]
file_names.delete(local_selenium_jar) if ENV['DOWNLOAD_SERVER']

files = file_names.each_with_object([]) do |file, array|
directory_names.each { |dir| array << "#{dir}/#{file}" }
end

jar = files.find { |file| File.exist?(file) } ||
Selenium::Server.download(:latest) && files.find { |file| File.exist?(file) }

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

def quit
Expand All @@ -126,19 +136,6 @@ def root
@root ||= Pathname.new('../../../../../../../').realpath(__FILE__)
end

def remote_capabilities
opt = {}
browser_name = case browser
when :safari_preview
opt["safari.options"] = {technology_preview: true}
:safari
else
browser
end

WebDriver::Remote::Capabilities.send(browser_name, opt)
end

def create_driver!(**opts, &block)
check_for_previous_error

Expand Down Expand Up @@ -192,7 +189,7 @@ def check_for_previous_error

def create_remote_driver(opt = {})
options = opt.delete(:capabilities)
opt[:capabilities] = [remote_capabilities]
opt[:capabilities] = [WebDriver::Remote::Capabilities.send(browser)]
opt[:capabilities] << options if options
opt[:url] = ENV['WD_REMOTE_URL'] || remote_server.webdriver_url
opt[:http_client] ||= WebDriver::Remote::Http::Default.new
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ module WebDriver

let(:new_window) { driver.window_handles.find { |handle| handle != driver.window_handle } }

# Safari is using GET instead of POST (W3C vs JWP)
# Server - https://github.com/SeleniumHQ/selenium/issues/1795
it 'should find the active element', except: {driver: :remote, browser: :edge} do
it 'should find the active element' do
driver.navigate.to url_for('xhtmlTest.html')
expect(driver.switch_to.active_element).to be_an_instance_of(WebDriver::Element)
end
Expand Down
35 changes: 18 additions & 17 deletions rb/spec/unit/selenium/server_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,40 +32,40 @@ module Selenium
end

it 'uses the given jar file and port' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)

expect(ChildProcess).to receive(:build)
.with('java', '-jar', 'selenium-server-test.jar', '-port', '1234')
.with('java', '-jar', 'selenium_server_deploy.jar', 'standalone', '--port', '1234')
.and_return(mock_process)

server = Selenium::Server.new('selenium-server-test.jar', port: 1234, background: true)
server = Selenium::Server.new('selenium_server_deploy.jar', port: 1234, background: true)
allow(server).to receive(:socket).and_return(mock_poller)

server.start
end

it 'waits for the server process by default' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)

expect(ChildProcess).to receive(:build)
.with('java', '-jar', 'selenium-server-test.jar', '-port', '4444')
.with('java', '-jar', 'selenium_server_deploy.jar', 'standalone', '--port', '4444')
.and_return(mock_process)

server = Selenium::Server.new('selenium-server-test.jar')
server = Selenium::Server.new('selenium_server_deploy.jar')
allow(server).to receive(:socket).and_return(mock_poller)

expect(mock_process).to receive(:wait)
server.start
end

it 'adds additional args' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)

expect(ChildProcess).to receive(:build)
.with('java', '-jar', 'selenium-server-test.jar', '-port', '4444', 'foo', 'bar')
.with('java', '-jar', 'selenium_server_deploy.jar', 'standalone', '--port', '4444', 'foo', 'bar')
.and_return(mock_process)

server = Selenium::Server.new('selenium-server-test.jar', background: true)
server = Selenium::Server.new('selenium_server_deploy.jar', background: true)
allow(server).to receive(:socket).and_return(mock_poller)

server << %w[foo bar]
Expand All @@ -74,18 +74,19 @@ module Selenium
end

it 'adds additional JAVA options args' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)

expect(ChildProcess).to receive(:build)
.with('java',
'-Dwebdriver.chrome.driver=/bin/chromedriver',
'-jar', 'selenium-server-test.jar',
'-port', '4444',
'-jar', 'selenium_server_deploy.jar',
'standalone',
'--port', '4444',
'foo',
'bar')
.and_return(mock_process)

server = Selenium::Server.new('selenium-server-test.jar', background: true)
server = Selenium::Server.new('selenium_server_deploy.jar', background: true)
allow(server).to receive(:socket).and_return(mock_poller)

server << %w[foo bar]
Expand Down Expand Up @@ -173,20 +174,20 @@ module Selenium
end

it 'raises Selenium::Server::Error if the server is not launched within the timeout' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)

poller = instance_double('SocketPoller')
expect(poller).to receive(:connected?).and_return(false)

server = Selenium::Server.new('selenium-server-test.jar', background: true)
server = Selenium::Server.new('selenium_server_deploy.jar', background: true)
allow(server).to receive(:socket).and_return(poller)

expect { server.start }.to raise_error(Selenium::Server::Error)
end

it 'sets options after instantiation' do
expect(File).to receive(:exist?).with('selenium-server-test.jar').and_return(true)
server = Selenium::Server.new('selenium-server-test.jar')
expect(File).to receive(:exist?).with('selenium_server_deploy.jar').and_return(true)
server = Selenium::Server.new('selenium_server_deploy.jar')
expect(server.port).to eq(4444)
expect(server.timeout).to eq(30)
expect(server.background).to be false
Expand Down

0 comments on commit 78c5f0b

Please sign in to comment.