diff --git a/rb/lib/selenium/webdriver/firefox/service.rb b/rb/lib/selenium/webdriver/firefox/service.rb index ce1526d1ef718..45fc17a38547d 100644 --- a/rb/lib/selenium/webdriver/firefox/service.rb +++ b/rb/lib/selenium/webdriver/firefox/service.rb @@ -25,6 +25,15 @@ class Service < WebDriver::Service EXECUTABLE = 'geckodriver' SHUTDOWN_SUPPORTED = false DRIVER_PATH_ENV_KEY = 'SE_GECKODRIVER' + + def initialize(path: nil, port: nil, log: nil, args: nil) + args ||= [] + unless args.any? { |arg| arg.include?('--connect-existing') } + args << '--websocket-port' + args << WebDriver::PortProber.above(9222).to_s + end + super + end end # Service end # Firefox end # WebDriver diff --git a/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb b/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb index 8cd66cc67619c..f9e3bf1cb105b 100644 --- a/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb @@ -37,6 +37,21 @@ module Firefox it 'can be started outside driver' do expect(service_manager.uri).to be_a(URI) end + + context 'with BiDi enabled', exclusive: {bidi: true, reason: 'only executed when bidi is enabled'} do + it 'ensures two service instances use different websocket port' do + service1 = described_class.new + service2 = described_class.new + + ws_index1 = service1.args.index('--websocket-port') + ws_index2 = service2.args.index('--websocket-port') + + port1 = service1.args[ws_index1 + 1].to_i + port2 = service2.args[ws_index2 + 1].to_i + + expect(port1).not_to eq(port2) + end + end end end # Firefox end # WebDriver diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 811894e74f4e3..674e8b654192d 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -51,7 +51,7 @@ module Firefox it 'does not create args by default' do service = described_class.new - expect(service.extra_args).to be_empty + expect(service.extra_args.count).to eq 2 end it 'uses sets log path to stdout' do @@ -73,9 +73,23 @@ module Firefox end it 'uses provided args' do - service = described_class.new(args: ['--foo', '--bar']) + service = described_class.new(args: %w[--foo --bar]) + expect(service.extra_args).to include(*%w[--foo --bar]) + end - expect(service.extra_args).to eq ['--foo', '--bar'] + it 'there is a random port for websocket' do + service = described_class.new + ws_index = service.extra_args.index('--websocket-port') + port = service.extra_args[ws_index + 1].to_i + expect(port).to be_positive + end + + context 'with connect existing' do + it 'does not uses websocket-port' do + service = described_class.new(args: ['--connect-existing']) + expect(service.extra_args).not_to include('--websocket-port') + expect(service.extra_args).to eq(['--connect-existing']) + end end end