From 6b5ceb222f0f793a6ca76ef210583c20bdadbbd5 Mon Sep 17 00:00:00 2001 From: aguspe Date: Tue, 12 Nov 2024 19:05:32 +0100 Subject: [PATCH 1/9] Start the work on add_request_handler --- rb/lib/selenium/webdriver/bidi/network.rb | 20 +++++++++++++++++-- rb/lib/selenium/webdriver/common/network.rb | 15 +++++++++++++- .../lib/selenium/webdriver/bidi/network.rbs | 2 ++ .../lib/selenium/webdriver/common/network.rbs | 4 ++++ .../selenium/webdriver/bidi/network_spec.rb | 14 +++++++++++++ .../selenium/webdriver/network_spec.rb | 8 ++++++++ 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/rb/lib/selenium/webdriver/bidi/network.rb b/rb/lib/selenium/webdriver/bidi/network.rb index a6cdef3c344f6..75aea810b97f4 100644 --- a/rb/lib/selenium/webdriver/bidi/network.rb +++ b/rb/lib/selenium/webdriver/bidi/network.rb @@ -60,11 +60,27 @@ def continue_with_auth(request_id, username, password) ) end + def continue_with_request(**args) + @bidi.send_cmd( + 'network.continueWithRequest', + request: args[:request_id], + 'body' => args[:body], + 'cookies' => args[:cookies], + 'headers' => args[:headers], + 'method' => args[:method], + 'url' => args[:url] + ) + end + def on(event, &) event = EVENTS[event] if event.is_a?(Symbol) @bidi.add_callback(event, &) end - end # Network - end # BiDi + end + + # Network + end + + # BiDi end # WebDriver end # Selenium diff --git a/rb/lib/selenium/webdriver/common/network.rb b/rb/lib/selenium/webdriver/common/network.rb index c78980b954bff..ae48541c02e50 100644 --- a/rb/lib/selenium/webdriver/common/network.rb +++ b/rb/lib/selenium/webdriver/common/network.rb @@ -20,11 +20,12 @@ module Selenium module WebDriver class Network - attr_reader :auth_callbacks + attr_reader :auth_callbacks, :request_callbacks def initialize(bridge) @network = BiDi::Network.new(bridge.bidi) @auth_callbacks = {} + @request_callbacks = {} end def add_authentication_handler(username, password) @@ -47,6 +48,18 @@ def remove_authentication_handler(id) def clear_authentication_handlers @auth_callbacks.each_key { |id| remove_authentication_handler(id) } end + + def add_request_handler + intercept = @network.add_intercept(phases: [BiDi::Network::PHASES[:before_request]]) + request_id = @network.on(:before_request) do |event| + request_id = event['requestId'] + @network.continue_with_request(request_id: request_id) + end + + @request_callbacks[request_id] = intercept + + request_id + end end # Network end # WebDriver end # Selenium diff --git a/rb/sig/lib/selenium/webdriver/bidi/network.rbs b/rb/sig/lib/selenium/webdriver/bidi/network.rbs index 96dcdc47d89ed..44645cf05d250 100644 --- a/rb/sig/lib/selenium/webdriver/bidi/network.rbs +++ b/rb/sig/lib/selenium/webdriver/bidi/network.rbs @@ -12,6 +12,8 @@ module Selenium def add_intercept: (?phases: Array[String], ?contexts: BrowsingContext?, ?url_patterns: untyped?) -> Hash[String, String] + def continue_with_request: -> untyped + def remove_intercept: (String intercept) -> untyped def continue_with_auth: (String request_id, String username, String password) -> untyped diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index edd306ee3990a..aafcb23255b3c 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -3,12 +3,16 @@ module Selenium class Network @network: BiDi::Network + @request_callbacks: untyped + attr_reader auth_callbacks: Hash[String, String] def initialize: (Remote::Bridge bridge) -> void def add_authentication_handler: (String username, String password) -> String + def add_request_handler: -> untyped + def clear_authentication_handlers: -> Hash[nil, nil] def remove_authentication_handler: (String id) -> nil diff --git a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb index 7aef0ba9856aa..f3f3434856a05 100644 --- a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb @@ -56,6 +56,20 @@ class BiDi expect(driver.find_element(tag_name: 'h1').text).to eq('authorized') end end + + it 'continues with request' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver.bidi) + network.add_intercept(phases: [described_class::PHASES[:before_request]]) + network.on(:before_request) do |event| + request_id = event['requestId'] + network.continue_with_request(request_id: request_id) + end + + driver.navigate.to url_for('simple_page') + expect(driver.find_element(tag_name: 'h1').text).to eq('Simple Page') + end + end end end end diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 11776a4e2c73f..8db29c3eb7499 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -53,6 +53,14 @@ module WebDriver expect(network.auth_callbacks.count).to be 0 end end + + it 'adds a request handler' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + network.add_request_handler + expect(network.request_callbacks.count).to be 1 + end + end end end end From 8ec9975946ca779b6c7e11733c8ded8f521a8e79 Mon Sep 17 00:00:00 2001 From: aguspe Date: Tue, 12 Nov 2024 19:17:54 +0100 Subject: [PATCH 2/9] add delete and clear request handlers --- rb/lib/selenium/webdriver/bidi/network.rb | 10 +++------- rb/lib/selenium/webdriver/common/network.rb | 10 ++++++++++ .../lib/selenium/webdriver/common/network.rbs | 4 ++++ .../selenium/webdriver/network_spec.rb | 19 +++++++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/rb/lib/selenium/webdriver/bidi/network.rb b/rb/lib/selenium/webdriver/bidi/network.rb index 75aea810b97f4..ae55f9200efe4 100644 --- a/rb/lib/selenium/webdriver/bidi/network.rb +++ b/rb/lib/selenium/webdriver/bidi/network.rb @@ -26,7 +26,7 @@ class Network response_started: 'network.responseStarted', response_completed: 'network.responseCompleted', auth_required: 'network.authRequired', - FETCH_ERROR: 'network.fetchError' + fetch_error: 'network.fetchError' }.freeze PHASES = { @@ -76,11 +76,7 @@ def on(event, &) event = EVENTS[event] if event.is_a?(Symbol) @bidi.add_callback(event, &) end - end - - # Network - end - - # BiDi + end # Network + end # BiDi end # WebDriver end # Selenium diff --git a/rb/lib/selenium/webdriver/common/network.rb b/rb/lib/selenium/webdriver/common/network.rb index ae48541c02e50..96cd08b224b02 100644 --- a/rb/lib/selenium/webdriver/common/network.rb +++ b/rb/lib/selenium/webdriver/common/network.rb @@ -60,6 +60,16 @@ def add_request_handler request_id end + + def remove_request_handler(id) + intercept = @request_callbacks[id] + @network.remove_intercept(intercept['intercept']) + @request_callbacks.delete(id) + end + + def clear_request_handlers + @request_callbacks.each_key { |id| remove_request_handler(id) } + end end # Network end # WebDriver end # Selenium diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index aafcb23255b3c..b236c7d382b46 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -15,7 +15,11 @@ module Selenium def clear_authentication_handlers: -> Hash[nil, nil] + def clear_request_handlers: -> untyped + def remove_authentication_handler: (String id) -> nil + + def remove_request_handler: -> untyped end end end diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 8db29c3eb7499..700b92a1d7386 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -61,6 +61,25 @@ module WebDriver expect(network.request_callbacks.count).to be 1 end end + + it 'removes a request handler' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + id = network.add_request_handler + network.remove_request_handler(id) + expect(network.request_callbacks.count).to be 0 + end + end + + it 'clears all request handlers' do + reset_driver!(web_socket_url: true) do |driver| + network = described_class.new(driver) + network.add_request_handler + network.add_request_handler + network.clear_request_handlers + expect(network.request_callbacks.count).to be 0 + end + end end end end From 394f71702348bf846d5ada9762e417734898026c Mon Sep 17 00:00:00 2001 From: aguspe Date: Wed, 13 Nov 2024 21:50:42 +0100 Subject: [PATCH 3/9] Update test expectation --- rb/spec/integration/selenium/webdriver/bidi/network_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb index f3f3434856a05..80aad4de78e31 100644 --- a/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/bidi/network_spec.rb @@ -66,8 +66,8 @@ class BiDi network.continue_with_request(request_id: request_id) end - driver.navigate.to url_for('simple_page') - expect(driver.find_element(tag_name: 'h1').text).to eq('Simple Page') + driver.navigate.to url_for('formPage.html') + expect(driver.find_element(name: 'login')).to be_displayed end end end From 160f21d2b4393a3b09ec74fd0c8ecb2bce8614e8 Mon Sep 17 00:00:00 2001 From: aguspe Date: Sat, 16 Nov 2024 00:26:45 +0100 Subject: [PATCH 4/9] Implement single type of callbacks --- rb/lib/selenium/webdriver/common/network.rb | 21 +++++++++---------- .../lib/selenium/webdriver/common/network.rbs | 4 ++-- .../selenium/webdriver/network_spec.rb | 12 +++++------ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/rb/lib/selenium/webdriver/common/network.rb b/rb/lib/selenium/webdriver/common/network.rb index 96cd08b224b02..ddc5f74ac9911 100644 --- a/rb/lib/selenium/webdriver/common/network.rb +++ b/rb/lib/selenium/webdriver/common/network.rb @@ -20,12 +20,11 @@ module Selenium module WebDriver class Network - attr_reader :auth_callbacks, :request_callbacks + attr_reader :callbacks def initialize(bridge) @network = BiDi::Network.new(bridge.bidi) - @auth_callbacks = {} - @request_callbacks = {} + @callbacks = {} end def add_authentication_handler(username, password) @@ -34,19 +33,19 @@ def add_authentication_handler(username, password) request_id = event['requestId'] @network.continue_with_auth(request_id, username, password) end - @auth_callbacks[auth_id] = intercept + @callbacks[auth_id] = intercept auth_id end def remove_authentication_handler(id) - intercept = @auth_callbacks[id] + intercept = @callbacks[id] @network.remove_intercept(intercept['intercept']) - @auth_callbacks.delete(id) + @callbacks.delete(id) end def clear_authentication_handlers - @auth_callbacks.each_key { |id| remove_authentication_handler(id) } + @callbacks.each_key { |id| remove_authentication_handler(id) } end def add_request_handler @@ -56,19 +55,19 @@ def add_request_handler @network.continue_with_request(request_id: request_id) end - @request_callbacks[request_id] = intercept + @callbacks[request_id] = intercept request_id end def remove_request_handler(id) - intercept = @request_callbacks[id] + intercept = @callbacks[id] @network.remove_intercept(intercept['intercept']) - @request_callbacks.delete(id) + @callbacks.delete(id) end def clear_request_handlers - @request_callbacks.each_key { |id| remove_request_handler(id) } + @callbacks.each_key { |id| remove_request_handler(id) } end end # Network end # WebDriver diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index b236c7d382b46..b4f710c1fd7ba 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -3,9 +3,9 @@ module Selenium class Network @network: BiDi::Network - @request_callbacks: untyped + @callbacks: Hash[String, String] - attr_reader auth_callbacks: Hash[String, String] + attr_reader callbacks: Hash[String, String] def initialize: (Remote::Bridge bridge) -> void diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 700b92a1d7386..9c261725ce04d 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -31,7 +31,7 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) network.add_authentication_handler(username, password) - expect(network.auth_callbacks.count).to be 1 + expect(network.callbacks.count).to be 1 end end @@ -40,7 +40,7 @@ module WebDriver network = described_class.new(driver) id = network.add_authentication_handler(username, password) network.remove_authentication_handler(id) - expect(network.auth_callbacks.count).to be 0 + expect(network.callbacks.count).to be 0 end end @@ -50,7 +50,7 @@ module WebDriver network.add_authentication_handler(username, password) network.add_authentication_handler(username, password) network.clear_authentication_handlers - expect(network.auth_callbacks.count).to be 0 + expect(network.callbacks.count).to be 0 end end @@ -58,7 +58,7 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) network.add_request_handler - expect(network.request_callbacks.count).to be 1 + expect(network.callbacks.count).to be 1 end end @@ -67,7 +67,7 @@ module WebDriver network = described_class.new(driver) id = network.add_request_handler network.remove_request_handler(id) - expect(network.request_callbacks.count).to be 0 + expect(network.callbacks.count).to be 0 end end @@ -77,7 +77,7 @@ module WebDriver network.add_request_handler network.add_request_handler network.clear_request_handlers - expect(network.request_callbacks.count).to be 0 + expect(network.callbacks.count).to be 0 end end end From 02588f796ab27b1f098933d9403b7b08d3f565c7 Mon Sep 17 00:00:00 2001 From: aguspe Date: Sat, 16 Nov 2024 00:29:07 +0100 Subject: [PATCH 5/9] Update types --- rb/sig/lib/selenium/webdriver/common/network.rbs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index b4f710c1fd7ba..ba04a90d806c1 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -11,15 +11,15 @@ module Selenium def add_authentication_handler: (String username, String password) -> String - def add_request_handler: -> untyped + def add_request_handler: -> String def clear_authentication_handlers: -> Hash[nil, nil] - def clear_request_handlers: -> untyped + def clear_request_handlers: -> Hash[nil, nil] def remove_authentication_handler: (String id) -> nil - def remove_request_handler: -> untyped + def remove_request_handler: -> nil end end end From eacb7d70b7d16319a7362bac0ac92dd832c15e07 Mon Sep 17 00:00:00 2001 From: aguspe Date: Sat, 16 Nov 2024 00:30:12 +0100 Subject: [PATCH 6/9] Update types --- rb/sig/lib/selenium/webdriver/common/network.rbs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index ba04a90d806c1..893583e7f12a3 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -11,15 +11,15 @@ module Selenium def add_authentication_handler: (String username, String password) -> String - def add_request_handler: -> String + def add_request_handler: -> Integer def clear_authentication_handlers: -> Hash[nil, nil] def clear_request_handlers: -> Hash[nil, nil] - def remove_authentication_handler: (String id) -> nil + def remove_authentication_handler: (Integer id) -> nil - def remove_request_handler: -> nil + def remove_request_handler: (Integer id) -> nil end end end From f07a38af3d9151ca078400a0486526e09ebc4f00 Mon Sep 17 00:00:00 2001 From: aguspe Date: Sat, 16 Nov 2024 22:22:15 +0100 Subject: [PATCH 7/9] Simplify methods and have general callbacks --- rb/lib/selenium/webdriver/common/network.rb | 16 +++------------- rb/sig/lib/selenium/webdriver/common/network.rbs | 8 ++------ .../selenium/webdriver/network_spec.rb | 11 +++++------ 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/rb/lib/selenium/webdriver/common/network.rb b/rb/lib/selenium/webdriver/common/network.rb index ddc5f74ac9911..91bc0525c8340 100644 --- a/rb/lib/selenium/webdriver/common/network.rb +++ b/rb/lib/selenium/webdriver/common/network.rb @@ -38,14 +38,14 @@ def add_authentication_handler(username, password) auth_id end - def remove_authentication_handler(id) + def remove_handler(id) intercept = @callbacks[id] @network.remove_intercept(intercept['intercept']) @callbacks.delete(id) end - def clear_authentication_handlers - @callbacks.each_key { |id| remove_authentication_handler(id) } + def clear_handlers + @callbacks.each_key { |id| remove_handler(id) } end def add_request_handler @@ -59,16 +59,6 @@ def add_request_handler request_id end - - def remove_request_handler(id) - intercept = @callbacks[id] - @network.remove_intercept(intercept['intercept']) - @callbacks.delete(id) - end - - def clear_request_handlers - @callbacks.each_key { |id| remove_request_handler(id) } - end end # Network end # WebDriver end # Selenium diff --git a/rb/sig/lib/selenium/webdriver/common/network.rbs b/rb/sig/lib/selenium/webdriver/common/network.rbs index 893583e7f12a3..2ad03a748167e 100644 --- a/rb/sig/lib/selenium/webdriver/common/network.rbs +++ b/rb/sig/lib/selenium/webdriver/common/network.rbs @@ -13,13 +13,9 @@ module Selenium def add_request_handler: -> Integer - def clear_authentication_handlers: -> Hash[nil, nil] + def clear_handlers: -> Hash[nil, nil] - def clear_request_handlers: -> Hash[nil, nil] - - def remove_authentication_handler: (Integer id) -> nil - - def remove_request_handler: (Integer id) -> nil + def remove_handler: (Integer id) -> nil end end end diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 9c261725ce04d..4de50cc2578fa 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -22,8 +22,7 @@ module Selenium module WebDriver - describe Network, exclusive: {bidi: true, reason: 'only executed when bidi is enabled'}, - only: {browser: %i[chrome edge firefox]} do + describe Network do let(:username) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.first } let(:password) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.last } @@ -39,7 +38,7 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) id = network.add_authentication_handler(username, password) - network.remove_authentication_handler(id) + network.remove_handler(id) expect(network.callbacks.count).to be 0 end end @@ -49,7 +48,7 @@ module WebDriver network = described_class.new(driver) network.add_authentication_handler(username, password) network.add_authentication_handler(username, password) - network.clear_authentication_handlers + network.clear_handlers expect(network.callbacks.count).to be 0 end end @@ -66,7 +65,7 @@ module WebDriver reset_driver!(web_socket_url: true) do |driver| network = described_class.new(driver) id = network.add_request_handler - network.remove_request_handler(id) + network.remove_handler(id) expect(network.callbacks.count).to be 0 end end @@ -76,7 +75,7 @@ module WebDriver network = described_class.new(driver) network.add_request_handler network.add_request_handler - network.clear_request_handlers + network.clear_handlers expect(network.callbacks.count).to be 0 end end From a18ce0857a2dd9b0ff6f41ec40a34340fd2f121e Mon Sep 17 00:00:00 2001 From: Augustin Pequeno Date: Fri, 13 Dec 2024 22:34:45 +0100 Subject: [PATCH 8/9] Add removed guard --- rb/spec/integration/selenium/webdriver/network_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rb/spec/integration/selenium/webdriver/network_spec.rb b/rb/spec/integration/selenium/webdriver/network_spec.rb index 4de50cc2578fa..2ad4bc9f5365c 100644 --- a/rb/spec/integration/selenium/webdriver/network_spec.rb +++ b/rb/spec/integration/selenium/webdriver/network_spec.rb @@ -17,12 +17,12 @@ # specific language governing permissions and limitations # under the License. - require_relative 'spec_helper' module Selenium module WebDriver - describe Network do + describe Network, exclusive: {bidi: true, reason: 'only executed when bidi is enabled'}, + only: {browser: %i[chrome edge firefox]} do let(:username) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.first } let(:password) { SpecSupport::RackServer::TestApp::BASIC_AUTH_CREDENTIALS.last } From 8a5f8cc44f27a57b7da4ee543075fa92f016f045 Mon Sep 17 00:00:00 2001 From: Augustin Pequeno Date: Fri, 13 Dec 2024 23:19:33 +0100 Subject: [PATCH 9/9] add skip for flaky test --- rb/spec/integration/selenium/webdriver/fedcm_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rb/spec/integration/selenium/webdriver/fedcm_spec.rb b/rb/spec/integration/selenium/webdriver/fedcm_spec.rb index 608f3a4361294..aeee262e9a41a 100644 --- a/rb/spec/integration/selenium/webdriver/fedcm_spec.rb +++ b/rb/spec/integration/selenium/webdriver/fedcm_spec.rb @@ -50,7 +50,7 @@ module FedCM expect(dialog.title).to eq('Sign in to localhost with localhost') end - it 'returns the subtitle' do + it 'returns the subtitle', skip: 'Investigate flakiness only on pipeline' do expect(dialog.subtitle).to be_nil end