Skip to content

Commit d00e91f

Browse files
committed
[rb] allow setting URL in browser bridges to connect to remote session
1 parent 07178f1 commit d00e91f

File tree

13 files changed

+190
-48
lines changed

13 files changed

+190
-48
lines changed

rb/lib/selenium/webdriver/chrome/bridge.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ module Chrome
2323
# @api private
2424
class Bridge < Remote::Bridge
2525
def initialize(opts = {})
26-
port = opts.delete(:port) || Service::DEFAULT_PORT
27-
service_args = opts.delete(:service_args) || {}
28-
29-
if opts[:service_log_path]
30-
service_args.merge!(service_log_path: opts.delete(:service_log_path))
31-
end
26+
opts[:desired_capabilities] = create_capabilities(opts)
3227

3328
unless opts.key?(:url)
29+
port = opts.delete(:port) || Service::DEFAULT_PORT
30+
service_args = opts.delete(:service_args) || {}
31+
32+
if opts[:service_log_path]
33+
service_args.merge!(service_log_path: opts.delete(:service_log_path))
34+
end
35+
3436
driver_path = opts.delete(:driver_path) || Chrome.driver_path
3537
@service = Service.new(driver_path, port, *extract_service_args(service_args))
3638
@service.start
3739
opts[:url] = @service.uri
3840
end
3941

40-
opts[:desired_capabilities] = create_capabilities(opts)
41-
4242
super(opts)
4343
end
4444

rb/lib/selenium/webdriver/firefox/bridge.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,23 @@ module Firefox
2323
# @api private
2424
class Bridge < Remote::Bridge
2525
def initialize(opts = {})
26-
port = opts.delete(:port) || DEFAULT_PORT
27-
profile = opts.delete(:profile)
26+
opts[:desired_capabilities] ||= Remote::Capabilities.firefox
27+
opts[:desired_capabilities].proxy = opts.delete(:proxy) if opts.key?(:proxy)
2828

29-
@launcher = create_launcher(port, profile)
30-
@launcher.launch
31-
opts[:url] = @launcher.url
29+
unless opts.key?(:url)
30+
port = opts.delete(:port) || DEFAULT_PORT
31+
profile = opts.delete(:profile)
3232

33-
caps = opts[:desired_capabilities] ||= Remote::Capabilities.firefox
34-
caps.proxy = opts.delete(:proxy) if opts.key?(:proxy)
35-
Binary.path = caps[:firefox_binary] if caps[:firefox_binary]
33+
Binary.path = opts[:desired_capabilities][:firefox_binary] if opts[:desired_capabilities][:firefox_binary]
34+
@launcher = create_launcher(port, profile)
35+
@launcher.launch
36+
opts[:url] = @launcher.url
37+
end
3638

3739
begin
3840
super(opts)
3941
rescue
40-
@launcher.quit
42+
@launcher.quit if @launcher
4143
raise
4244
end
4345
end
@@ -47,9 +49,7 @@ def browser
4749
end
4850

4951
def driver_extensions
50-
[
51-
DriverExtensions::TakesScreenshot
52-
]
52+
[DriverExtensions::TakesScreenshot]
5353
end
5454

5555
def quit

rb/lib/selenium/webdriver/firefox/w3c_bridge.rb

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@ module Firefox
2323
# @api private
2424
class W3CBridge < Remote::W3CBridge
2525
def initialize(opts = {})
26-
port = opts.delete(:port) || Service::DEFAULT_PORT
2726
opts[:desired_capabilities] = create_capabilities(opts)
28-
service_args = opts.delete(:service_args) || {}
2927

30-
driver_path = opts.delete(:driver_path) || Firefox.driver_path
31-
@service = Service.new(driver_path, port, *extract_service_args(service_args))
32-
@service.start
33-
opts[:url] = @service.uri
28+
unless opts.key?(:url)
29+
port = opts.delete(:port) || Service::DEFAULT_PORT
30+
service_args = opts.delete(:service_args) || {}
31+
32+
driver_path = opts.delete(:driver_path) || Firefox.driver_path
33+
@service = Service.new(driver_path, port, *extract_service_args(service_args))
34+
@service.start
35+
opts[:url] = @service.uri
36+
end
3437

3538
super(opts)
3639
end
@@ -40,10 +43,8 @@ def browser
4043
end
4144

4245
def driver_extensions
43-
[
44-
DriverExtensions::TakesScreenshot,
45-
DriverExtensions::HasWebStorage
46-
]
46+
[DriverExtensions::TakesScreenshot,
47+
DriverExtensions::HasWebStorage]
4748
end
4849

4950
def quit

rb/lib/selenium/webdriver/ie/bridge.rb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,22 @@ module IE
2626

2727
class Bridge < Remote::Bridge
2828
def initialize(opts = {})
29-
port = opts.delete(:port) || Service::DEFAULT_PORT
30-
service_args = opts.delete(:service_args) || {}
31-
service_args = match_legacy(opts, service_args)
32-
driver_path = opts.delete(:driver_path) || IE.driver_path
29+
opts[:desired_capabilities] ||= Remote::Capabilities.internet_explorer
3330

34-
@service = Service.new(driver_path, port, *extract_service_args(service_args))
35-
@service.start
36-
opts[:url] = @service.uri
31+
unless opts.key?(:url)
32+
port = opts.delete(:port) || Service::DEFAULT_PORT
33+
service_args = opts.delete(:service_args) || {}
34+
service_args = match_legacy(opts, service_args)
35+
driver_path = opts.delete(:driver_path) || IE.driver_path
36+
@service = Service.new(driver_path, port, *extract_service_args(service_args))
37+
@service.start
38+
opts[:url] = @service.uri
39+
end
3740

38-
caps = opts[:desired_capabilities] ||= Remote::Capabilities.internet_explorer
39-
caps[:ignore_protected_mode_settings] = true if opts.delete(:introduce_flakiness_by_ignoring_security_domains)
40-
caps[:native_events] = opts.delete(:native_events) != false
41+
if opts.delete(:introduce_flakiness_by_ignoring_security_domains)
42+
opts[:desired_capabilities][:ignore_protected_mode_settings] = true
43+
end
44+
opts[:desired_capabilities][:native_events] = opts.delete(:native_events) != false
4145

4246
super(opts)
4347
end
@@ -70,6 +74,9 @@ def extract_service_args(args)
7074
service_args << "--log-level=#{args.delete(:log_level).to_s.upcase}" if args.key?(:log_level)
7175
service_args << "--log-file=#{args.delete(:log_file)}" if args.key?(:log_file)
7276
service_args << "--implementation=#{args.delete(:implementation).to_s.upcase}" if args.key?(:implementation)
77+
service_args << "--host=#{args.delete(:host)}" if args.key?(:host)
78+
service_args << "--extract_path=#{args.delete(:extract_path)}" if args.key?(:extract_path)
79+
service_args << "--silent" if args[:silent] == true
7380
service_args
7481
end
7582
end # Bridge

rb/lib/selenium/webdriver/phantomjs/bridge.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ module PhantomJS
2626

2727
class Bridge < Remote::Bridge
2828
def initialize(opts = {})
29-
port = opts.delete(:port) || Service::DEFAULT_PORT
3029
opts[:desired_capabilities] ||= Remote::Capabilities.phantomjs
3130

3231
unless opts.key?(:url)
33-
driver_path = opts.delete(:driver_path) || PhantomJS.path
32+
port = opts.delete(:port) || Service::DEFAULT_PORT
33+
driver_path = opts.delete(:driver_path) || PhantomJS.driver_path
3434
args = opts.delete(:args) || opts[:desired_capabilities]['phantomjs.cli.args']
3535
@service = Service.new(driver_path, port, *args)
3636
@service.start

rb/lib/selenium/webdriver/safari/bridge.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,16 @@ module Safari
2424
class Bridge < Remote::Bridge
2525
def initialize(opts = {})
2626
opts[:desired_capabilities] ||= Remote::Capabilities.safari
27-
port = opts.delete(:port) || Service::DEFAULT_PORT
28-
service_args = opts.delete(:service_args) || {}
2927

30-
driver_path = opts.delete(:driver_path) || Safari.driver_path
31-
@service = Service.new(driver_path, port, *extract_service_args(service_args))
32-
@service.start
33-
opts[:url] = @service.uri
28+
unless opts.key?(:url)
29+
port = opts.delete(:port) || Service::DEFAULT_PORT
30+
service_args = opts.delete(:service_args) || {}
31+
32+
driver_path = opts.delete(:driver_path) || Safari.driver_path
33+
@service = Service.new(driver_path, port, *extract_service_args(service_args))
34+
@service.start
35+
opts[:url] = @service.uri
36+
end
3437

3538
super(opts)
3639
end

rb/spec/unit/selenium/webdriver/chrome/bridge_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ module Chrome
3636
allow(Service).to receive(:new).and_return(service)
3737
end
3838

39+
it 'accepts server URL' do
40+
expect(Service).not_to receive(:new)
41+
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
42+
43+
Bridge.new(http_client: http, url: 'http://example.com:4321')
44+
end
45+
3946
it 'sets the args capability' do
4047
Bridge.new(http_client: http, args: %w[--foo=bar])
4148

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# encoding: utf-8
2+
#
3+
# Licensed to the Software Freedom Conservancy (SFC) under one
4+
# or more contributor license agreements. See the NOTICE file
5+
# distributed with this work for additional information
6+
# regarding copyright ownership. The SFC licenses this file
7+
# to you under the Apache License, Version 2.0 (the
8+
# "License"); you may not use this file except in compliance
9+
# with the License. You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
#
13+
# Unless required by applicable law or agreed to in writing,
14+
# software distributed under the License is distributed on an
15+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
# KIND, either express or implied. See the License for the
17+
# specific language governing permissions and limitations
18+
# under the License.
19+
20+
require File.expand_path('../../spec_helper', __FILE__)
21+
22+
module Selenium
23+
module WebDriver
24+
module Edge
25+
describe Bridge do
26+
let(:resp) { {'sessionId' => 'foo', 'value' => @default_capabilities.as_json} }
27+
let(:service) { double(Service, start: nil, uri: 'http://example.com') }
28+
let(:caps) { {} }
29+
let(:http) { double(Remote::Http::Default, call: resp).as_null_object }
30+
31+
before do
32+
@default_capabilities = Remote::Capabilities.internet_explorer
33+
34+
allow(Remote::Capabilities).to receive(:internet_explorer).and_return(caps)
35+
allow(Service).to receive(:binary_path).and_return('/foo')
36+
allow(Service).to receive(:new).and_return(service)
37+
end
38+
39+
it 'accepts server URL' do
40+
expect(Service).not_to receive(:new)
41+
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
42+
43+
Bridge.new(http_client: http, url: 'http://example.com:4321')
44+
end
45+
46+
end
47+
end # Edge
48+
end # WebDriver
49+
end # Selenium

rb/spec/unit/selenium/webdriver/firefox/bridge_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ module Firefox
3434
allow(Launcher).to receive(:new).and_return(launcher)
3535
end
3636

37+
it 'accepts server URL' do
38+
expect(Launcher).not_to receive(:new)
39+
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
40+
41+
Bridge.new(http_client: http, url: 'http://example.com:4321')
42+
end
43+
3744
it 'sets the proxy capability' do
3845
proxy = Proxy.new(http: 'localhost:9090')
3946
expect(caps).to receive(:proxy=).with proxy
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# encoding: utf-8
2+
#
3+
# Licensed to the Software Freedom Conservancy (SFC) under one
4+
# or more contributor license agreements. See the NOTICE file
5+
# distributed with this work for additional information
6+
# regarding copyright ownership. The SFC licenses this file
7+
# to you under the Apache License, Version 2.0 (the
8+
# "License"); you may not use this file except in compliance
9+
# with the License. You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
#
13+
# Unless required by applicable law or agreed to in writing,
14+
# software distributed under the License is distributed on an
15+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
# KIND, either express or implied. See the License for the
17+
# specific language governing permissions and limitations
18+
# under the License.
19+
20+
require File.expand_path('../../spec_helper', __FILE__)
21+
22+
module Selenium
23+
module WebDriver
24+
module Firefox
25+
describe W3CBridge do
26+
let(:launcher) { double(Launcher, launch: nil, quit: nil, url: 'http://localhost:4444/wd/hub') }
27+
let(:resp) { {'sessionId' => 'foo', 'value' => @default_capabilities} }
28+
let(:http) { double(Remote::Http::Default, call: resp).as_null_object }
29+
let(:caps) { Remote::Capabilities.chrome }
30+
31+
before do
32+
@default_capabilities = Remote::Capabilities.firefox.as_json
33+
allow(Remote::Capabilities).to receive(:firefox).and_return(caps)
34+
allow(Launcher).to receive(:new).and_return(launcher)
35+
end
36+
37+
it 'accepts server URL' do
38+
expect(Service).not_to receive(:new)
39+
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
40+
41+
W3CBridge.new(http_client: http, url: 'http://example.com:4321')
42+
end
43+
44+
end
45+
end # Firefox
46+
end # WebDriver
47+
end # Selenium

0 commit comments

Comments
 (0)