From 03d36c9135f6ae67fd4d0d1f44931a69db2f905e Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:25:19 +0100 Subject: [PATCH 01/10] Add --websocket-port parameter to firefox service --- rb/lib/selenium/webdriver/firefox/service.rb | 9 +++++ rb/lib/selenium/webdriver/support.rb | 1 + rb/lib/selenium/webdriver/support/sockets.rb | 35 +++++++++++++++++++ .../selenium/web_driver/support/sockets.rbs | 9 +++++ .../webdriver/firefox/service_spec.rb | 15 ++++++++ .../webdriver/firefox/service_spec.rb | 23 +++++++++--- 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 rb/lib/selenium/webdriver/support/sockets.rb create mode 100644 rb/sig/selenium/web_driver/support/sockets.rbs diff --git a/rb/lib/selenium/webdriver/firefox/service.rb b/rb/lib/selenium/webdriver/firefox/service.rb index ce1526d1ef718..732efd089c721 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 << Support::Sockets.free_port.to_s + end + super + end end # Service end # Firefox end # WebDriver diff --git a/rb/lib/selenium/webdriver/support.rb b/rb/lib/selenium/webdriver/support.rb index 497beab3f5e79..945b43ab08048 100644 --- a/rb/lib/selenium/webdriver/support.rb +++ b/rb/lib/selenium/webdriver/support.rb @@ -24,3 +24,4 @@ require 'selenium/webdriver/support/select' require 'selenium/webdriver/support/color' require 'selenium/webdriver/support/relative_locator' +require 'selenium/webdriver/support/sockets' diff --git a/rb/lib/selenium/webdriver/support/sockets.rb b/rb/lib/selenium/webdriver/support/sockets.rb new file mode 100644 index 0000000000000..82d2a91ccaee4 --- /dev/null +++ b/rb/lib/selenium/webdriver/support/sockets.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +require 'socket' + +module Selenium + module WebDriver + module Support + module Sockets + def self.free_port + server = TCPServer.new('127.0.0.1', 0) + port = server.addr[1] + server.close + port + end + end # Sockets + end # Support + end # WebDriver +end # Selenium diff --git a/rb/sig/selenium/web_driver/support/sockets.rbs b/rb/sig/selenium/web_driver/support/sockets.rbs new file mode 100644 index 0000000000000..b8caff896775e --- /dev/null +++ b/rb/sig/selenium/web_driver/support/sockets.rbs @@ -0,0 +1,9 @@ +module Selenium + module WebDriver + module Support + module Sockets + def self.free_port: -> Integer + end + end + end +end diff --git a/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb b/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb index 8cd66cc67619c..e8b5e6a9e4abf 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 (websocket port)' 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..0b93ad5113384 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,24 @@ 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 + + context 'with websocket parameter' do + it 'validates the websocket parameter is present and there is a random port' 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 > 0 + expect(port).to be < 65_536 + end - expect(service.extra_args).to eq ['--foo', '--bar'] + it 'validates with --connect-existing that there is no --websocket-port and the port is not random' 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 @@ -83,7 +98,7 @@ module Firefox let(:driver) { Firefox::Driver } let(:service) do instance_double(described_class, launch: service_manager, executable_path: nil, 'executable_path=': nil, - class: described_class) + class: described_class) end let(:service_manager) { instance_double(ServiceManager, uri: 'http://example.com') } let(:bridge) { instance_double(Remote::Bridge, quit: nil, create_session: {}) } From 532901d509ce07dd5218e7d1519f57a89285ebb6 Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:30:27 +0100 Subject: [PATCH 02/10] Correct identation issue --- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 0b93ad5113384..10ef57c841b2e 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -98,7 +98,7 @@ module Firefox let(:driver) { Firefox::Driver } let(:service) do instance_double(described_class, launch: service_manager, executable_path: nil, 'executable_path=': nil, - class: described_class) + class: described_class) end let(:service_manager) { instance_double(ServiceManager, uri: 'http://example.com') } let(:bridge) { instance_double(Remote::Bridge, quit: nil, create_session: {}) } From 8f30cbe00c20a82a3e5651a4b8806a7dece15dd1 Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:41:25 +0100 Subject: [PATCH 03/10] Add guard to test --- rb/spec/integration/selenium/webdriver/firefox/service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb b/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb index e8b5e6a9e4abf..f9e3bf1cb105b 100644 --- a/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/integration/selenium/webdriver/firefox/service_spec.rb @@ -38,7 +38,7 @@ module Firefox expect(service_manager.uri).to be_a(URI) end - context 'with BiDi enabled (websocket port)' do + 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 From 7f9eacb98b11b35b640425884d26e1bf3c1f5fea Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:47:35 +0100 Subject: [PATCH 04/10] Improve unit test --- .../webdriver/firefox/service_spec.rb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 10ef57c841b2e..56697833b8246 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -77,16 +77,16 @@ module Firefox expect(service.extra_args).to include(*%w[--foo --bar]) end - context 'with websocket parameter' do - it 'validates the websocket parameter is present and there is a random port' 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 > 0 - expect(port).to be < 65_536 - end + it 'there is a random port' 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 > 0 + expect(port).to be < 65_536 + end - it 'validates with --connect-existing that there is no --websocket-port and the port is not random' do + 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']) @@ -98,7 +98,7 @@ module Firefox let(:driver) { Firefox::Driver } let(:service) do instance_double(described_class, launch: service_manager, executable_path: nil, 'executable_path=': nil, - class: described_class) + class: described_class) end let(:service_manager) { instance_double(ServiceManager, uri: 'http://example.com') } let(:bridge) { instance_double(Remote::Bridge, quit: nil, create_session: {}) } From 6d94f0e3cb67d9012acf70493a99620f928a6722 Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:48:56 +0100 Subject: [PATCH 05/10] Improve unit test --- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 56697833b8246..246cf063a6076 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -77,7 +77,7 @@ module Firefox expect(service.extra_args).to include(*%w[--foo --bar]) end - it 'there is a random port' do + 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 From b2bd960903b5aab6a5dc55f3b3a0643bd2f7356f Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 22:51:25 +0100 Subject: [PATCH 06/10] fix identation --- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 246cf063a6076..9443caca0361c 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -98,7 +98,7 @@ module Firefox let(:driver) { Firefox::Driver } let(:service) do instance_double(described_class, launch: service_manager, executable_path: nil, 'executable_path=': nil, - class: described_class) + class: described_class) end let(:service_manager) { instance_double(ServiceManager, uri: 'http://example.com') } let(:bridge) { instance_double(Remote::Bridge, quit: nil, create_session: {}) } From 82caee4ef3bf926c9770f59bfb4272886f22bea9 Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 23:08:31 +0100 Subject: [PATCH 07/10] Simplifying test and fixing formatting issue --- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index 9443caca0361c..ee01b0a84810e 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -81,8 +81,7 @@ module Firefox 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 > 0 - expect(port).to be < 65_536 + expect(port).to be.positive? end context 'with connect existing' do From 360c7b6126c156f616e0cd7342225552cb5fd7fa Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 19 Mar 2025 23:09:40 +0100 Subject: [PATCH 08/10] Simplifying test and fixing formatting issue --- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb index ee01b0a84810e..674e8b654192d 100644 --- a/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb +++ b/rb/spec/unit/selenium/webdriver/firefox/service_spec.rb @@ -81,7 +81,7 @@ module Firefox 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? + expect(port).to be_positive end context 'with connect existing' do From 6d808e88daa9ae6773fe7933594e19255cf46653 Mon Sep 17 00:00:00 2001 From: aguspe Date: Sat, 12 Apr 2025 22:00:18 +0200 Subject: [PATCH 09/10] Use the PortProber isntead of Sockets --- rb/lib/selenium/webdriver/firefox/service.rb | 2 +- rb/lib/selenium/webdriver/support.rb | 1 - rb/lib/selenium/webdriver/support/sockets.rb | 35 ------------------- .../selenium/web_driver/support/sockets.rbs | 9 ----- 4 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 rb/lib/selenium/webdriver/support/sockets.rb delete mode 100644 rb/sig/selenium/web_driver/support/sockets.rbs diff --git a/rb/lib/selenium/webdriver/firefox/service.rb b/rb/lib/selenium/webdriver/firefox/service.rb index 732efd089c721..9bec28a8d5fbb 100644 --- a/rb/lib/selenium/webdriver/firefox/service.rb +++ b/rb/lib/selenium/webdriver/firefox/service.rb @@ -30,7 +30,7 @@ def initialize(path: nil, port: nil, log: nil, args: nil) args ||= [] unless args.any? { |arg| arg.include?('--connect-existing') } args << '--websocket-port' - args << Support::Sockets.free_port.to_s + args << WebDriver::PortProber.above(4444).to_s end super end diff --git a/rb/lib/selenium/webdriver/support.rb b/rb/lib/selenium/webdriver/support.rb index 945b43ab08048..497beab3f5e79 100644 --- a/rb/lib/selenium/webdriver/support.rb +++ b/rb/lib/selenium/webdriver/support.rb @@ -24,4 +24,3 @@ require 'selenium/webdriver/support/select' require 'selenium/webdriver/support/color' require 'selenium/webdriver/support/relative_locator' -require 'selenium/webdriver/support/sockets' diff --git a/rb/lib/selenium/webdriver/support/sockets.rb b/rb/lib/selenium/webdriver/support/sockets.rb deleted file mode 100644 index 82d2a91ccaee4..0000000000000 --- a/rb/lib/selenium/webdriver/support/sockets.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -# Licensed to the Software Freedom Conservancy (SFC) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The SFC licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -require 'socket' - -module Selenium - module WebDriver - module Support - module Sockets - def self.free_port - server = TCPServer.new('127.0.0.1', 0) - port = server.addr[1] - server.close - port - end - end # Sockets - end # Support - end # WebDriver -end # Selenium diff --git a/rb/sig/selenium/web_driver/support/sockets.rbs b/rb/sig/selenium/web_driver/support/sockets.rbs deleted file mode 100644 index b8caff896775e..0000000000000 --- a/rb/sig/selenium/web_driver/support/sockets.rbs +++ /dev/null @@ -1,9 +0,0 @@ -module Selenium - module WebDriver - module Support - module Sockets - def self.free_port: -> Integer - end - end - end -end From 2aba2ab71beb6ff9f059d3ebf2f903b5cf28c31a Mon Sep 17 00:00:00 2001 From: aguspe Date: Tue, 29 Apr 2025 21:13:31 +0200 Subject: [PATCH 10/10] Change port to 9222 --- rb/lib/selenium/webdriver/firefox/service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/lib/selenium/webdriver/firefox/service.rb b/rb/lib/selenium/webdriver/firefox/service.rb index 9bec28a8d5fbb..45fc17a38547d 100644 --- a/rb/lib/selenium/webdriver/firefox/service.rb +++ b/rb/lib/selenium/webdriver/firefox/service.rb @@ -30,7 +30,7 @@ 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(4444).to_s + args << WebDriver::PortProber.above(9222).to_s end super end