Skip to content

Commit 5aade02

Browse files
authored
[rb] separate concerns between Service, DriverFinder, and Options (#17564)
1 parent 3b1c490 commit 5aade02

17 files changed

Lines changed: 59 additions & 56 deletions

File tree

rb/lib/selenium/webdriver/common/driver_finder.rb

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def self.path(options, service_class)
2626
new(options, service_class.new).driver_path
2727
end
2828

29+
# @param options [Options, nil] when nil driver parsed from Service::EXECUTABLE
30+
# @param service [Service]
2931
def initialize(options, service)
3032
@options = options
3133
@service = service
@@ -46,24 +48,19 @@ def browser_path?
4648
private
4749

4850
def paths
49-
@paths ||= resolve_paths
50-
rescue StandardError => e
51-
WebDriver.logger.error("Exception occurred: #{e.message}")
52-
WebDriver.logger.error("Backtrace:\n\t#{e.backtrace&.join("\n\t")}")
53-
raise Error::NoSuchDriverError, "Unable to obtain #{@service.class::EXECUTABLE}"
51+
@paths ||= begin
52+
path = @service.executable_path || resolve_class_path
53+
path ? paths_from_service(path) : paths_from_manager
54+
rescue StandardError => e
55+
WebDriver.logger.error("Exception occurred: #{e.message}")
56+
WebDriver.logger.error("Backtrace:\n\t#{e.backtrace&.join("\n\t")}")
57+
raise Error::NoSuchDriverError, "Unable to obtain #{@service.class::EXECUTABLE}"
58+
end
5459
end
5560

56-
def resolve_paths
61+
def resolve_class_path
5762
path = @service.class.driver_path
58-
path = path.call if path.is_a?(Proc)
59-
result = path ? paths_from_service(path) : paths_from_manager
60-
61-
# A binary (whether user-supplied or resolved by Selenium Manager) is the
62-
# source of truth for the browser version, so drop any named version that
63-
# would otherwise conflict with what the binary actually is.
64-
@options.browser_version = nil if @options.respond_to?(:binary) && @options.binary
65-
66-
result
63+
path.is_a?(Proc) ? path.call : path
6764
end
6865

6966
def paths_from_service(path)
@@ -79,11 +76,12 @@ def paths_from_manager
7976
browser_path: Platform.cygwin_path(output['browser_path'], only_cygwin: true)}
8077
Platform.assert_executable(formatted[:driver_path])
8178
Platform.assert_executable(formatted[:browser_path])
82-
@options.binary ||= formatted[:browser_path] if @options.respond_to?(:binary)
8379
formatted
8480
end
8581

8682
def to_args
83+
return ['--driver', @service.class::EXECUTABLE] unless @options
84+
8785
args = ['--browser', @options.browser_name]
8886
if @options.browser_version
8987
args << '--browser-version'

rb/lib/selenium/webdriver/common/local_driver.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,10 @@ def process_options(options, service)
4848
raise ArgumentError, ":options must be an instance of #{default_options.class}"
4949
end
5050

51-
service.executable_path ||= begin
52-
finder = WebDriver::DriverFinder.new(options, service)
53-
if options.respond_to?(:binary) && finder.browser_path?
54-
options.binary = finder.browser_path
55-
options.browser_version = nil
56-
end
57-
finder.driver_path
58-
end
51+
finder = WebDriver::DriverFinder.new(options, service)
52+
options.binary = finder.browser_path if options.respond_to?(:binary) && finder.browser_path?
53+
service.executable_path = finder.driver_path
54+
options.browser_version = nil if options.respond_to?(:binary) && options.binary
5955
options.as_json
6056
end
6157
end

rb/lib/selenium/webdriver/common/service.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,14 @@ def initialize(path: nil, port: nil, log: nil, args: nil)
8888
end
8989

9090
def launch
91-
@executable_path ||= env_path || find_driver_path
91+
@executable_path ||= env_path || DriverFinder.new(nil, self).driver_path
9292
ServiceManager.new(self).tap(&:start)
9393
end
9494

9595
def shutdown_supported
9696
self.class::SHUTDOWN_SUPPORTED
9797
end
9898

99-
def find_driver_path
100-
default_options = WebDriver.const_get("#{self.class.name&.split('::')&.[](2)}::Options").new
101-
DriverFinder.new(default_options, self).driver_path
102-
end
103-
10499
def env_path
105100
ENV.fetch(self.class::DRIVER_PATH_ENV_KEY, nil)
106101
end

rb/sig/lib/selenium/webdriver/common/driver_finder.rbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module Selenium
2020

2121
def paths: -> untyped
2222

23-
def resolve_paths: -> Hash[Symbol, String]
23+
def resolve_class_path: -> String?
2424

2525
def paths_from_service: (String path) -> Hash[Symbol, String]
2626

rb/sig/lib/selenium/webdriver/common/service.rbs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ module Selenium
5555

5656
def initialize: (?path: untyped?, ?port: untyped?, ?log: untyped?, ?args: untyped?) -> void
5757

58-
def find_driver_path: -> untyped
59-
6058
def launch: () -> untyped
6159

6260
def shutdown_supported: () -> untyped

rb/spec/integration/selenium/webdriver/chrome/service_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module Chrome
3131
after { service_manager.stop }
3232

3333
it 'auto uses chromedriver' do
34-
service.executable_path = DriverFinder.new(Options.new, described_class.new).driver_path
34+
service.executable_path = DriverFinder.new(nil, described_class.new).driver_path
3535

3636
expect(service_manager.uri).to be_a(URI)
3737
end

rb/spec/integration/selenium/webdriver/edge/service_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module Edge
3131
after { service_manager.stop }
3232

3333
it 'auto uses edgedriver' do
34-
service.executable_path = DriverFinder.new(Options.new, described_class.new).driver_path
34+
service.executable_path = DriverFinder.new(nil, described_class.new).driver_path
3535

3636
expect(service_manager.uri).to be_a(URI)
3737
end

rb/spec/integration/selenium/webdriver/firefox/service_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module Firefox
3131
after { service_manager.stop }
3232

3333
it 'auto uses geckodriver' do
34-
service.executable_path = DriverFinder.new(Options.new, described_class.new).driver_path
34+
service.executable_path = DriverFinder.new(nil, described_class.new).driver_path
3535

3636
expect(service_manager.uri).to be_a(URI)
3737
end

rb/spec/integration/selenium/webdriver/ie/service_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module IE
3131
after { service_manager.stop }
3232

3333
it 'auto uses iedriver' do
34-
service.executable_path = DriverFinder.new(Options.new, described_class.new).driver_path
34+
service.executable_path = DriverFinder.new(nil, described_class.new).driver_path
3535

3636
expect(service_manager.uri).to be_a(URI)
3737
end

rb/spec/integration/selenium/webdriver/safari/service_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module Safari
3131
after { service_manager.stop }
3232

3333
it 'auto uses safaridriver' do
34-
service.executable_path = DriverFinder.new(Options.new, described_class.new).driver_path
34+
service.executable_path = DriverFinder.new(nil, described_class.new).driver_path
3535

3636
expect(service_manager.uri).to be_a(URI)
3737
end

0 commit comments

Comments
 (0)