Skip to content

Commit 87dc1e6

Browse files
committed
Add filtering an url pattern support
1 parent d9e0ffc commit 87dc1e6

File tree

10 files changed

+239
-14
lines changed

10 files changed

+239
-14
lines changed

rb/lib/selenium/webdriver/bidi/network.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# KIND, either express or implied. See the License for the
1717
# specific language governing permissions and limitations
1818
# under the License.
19+
require_relative 'network/url_pattern'
1920

2021
module Selenium
2122
module WebDriver
@@ -39,8 +40,12 @@ def initialize(bidi)
3940
@bidi = bidi
4041
end
4142

42-
def add_intercept(phases: [], contexts: nil, url_patterns: nil)
43-
@bidi.send_cmd('network.addIntercept', phases: phases, contexts: contexts, urlPatterns: url_patterns)
43+
def add_intercept(phases: [], contexts: nil, url_patterns: nil, pattern_type: :string)
44+
url_patterns = url_patterns && pattern_type ? UrlPattern.format_pattern(url_patterns, pattern_type) : nil
45+
@bidi.send_cmd('network.addIntercept',
46+
phases: phases,
47+
contexts: contexts,
48+
urlPatterns: url_patterns)
4449
end
4550

4651
def remove_intercept(intercept)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: true
2+
3+
require 'uri'
4+
5+
module Selenium
6+
module WebDriver
7+
class BiDi
8+
module UrlPattern
9+
module_function
10+
11+
def format_pattern(url_patterns, pattern_type)
12+
case pattern_type
13+
when :string
14+
to_url_string_pattern(url_patterns)
15+
when :url
16+
to_url_pattern(url_patterns)
17+
else
18+
raise ArgumentError, "Unknown pattern type: #{pattern_type}"
19+
end
20+
end
21+
22+
def to_url_pattern(*url_patterns)
23+
url_patterns.flatten.map do |url_pattern|
24+
uri = URI.parse(url_pattern)
25+
26+
{
27+
type: 'pattern',
28+
protocol: uri.scheme || '',
29+
hostname: uri.host || '',
30+
port: uri.port.to_s || '',
31+
pathname: uri.path || '',
32+
search: uri.query || ''
33+
}
34+
end
35+
end
36+
37+
def to_url_string_pattern(*url_patterns)
38+
url_patterns.flatten.map do |url_pattern|
39+
{
40+
type: 'string',
41+
pattern: url_pattern
42+
}
43+
end
44+
end
45+
end
46+
end
47+
end
48+
end

rb/lib/selenium/webdriver/common/network.rb

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,50 @@ def clear_handlers
4444
callbacks.each_key { |id| remove_handler(id) }
4545
end
4646

47-
def add_authentication_handler(username = nil, password = nil, &block)
47+
def add_authentication_handler(username = nil, password = nil, *filter, pattern_type: nil, &block)
4848
selected_block =
4949
if username && password
5050
proc { |auth| auth.authenticate(username, password) }
5151
else
5252
block
5353
end
5454

55-
add_handler(:auth_required, BiDi::Network::PHASES[:auth_required], BiDi::InterceptedAuth, &selected_block)
55+
add_handler(
56+
:auth_required,
57+
BiDi::Network::PHASES[:auth_required],
58+
BiDi::InterceptedAuth,
59+
filter,
60+
pattern_type: pattern_type,
61+
&selected_block
62+
)
5663
end
5764

58-
def add_request_handler(&)
59-
add_handler(:before_request, BiDi::Network::PHASES[:before_request], BiDi::InterceptedRequest, &)
65+
def add_request_handler(*filter, pattern_type: nil, &)
66+
add_handler(
67+
:before_request,
68+
BiDi::Network::PHASES[:before_request],
69+
BiDi::InterceptedRequest,
70+
filter,
71+
pattern_type: pattern_type,
72+
&
73+
)
6074
end
6175

62-
def add_response_handler(&)
63-
add_handler(:response_started, BiDi::Network::PHASES[:response_started], BiDi::InterceptedResponse, &)
76+
def add_response_handler(*filter, pattern_type: nil, &)
77+
add_handler(
78+
:response_started,
79+
BiDi::Network::PHASES[:response_started],
80+
BiDi::InterceptedResponse,
81+
filter,
82+
pattern_type: pattern_type,
83+
&
84+
)
6485
end
6586

6687
private
6788

68-
def add_handler(event_type, phase, intercept_type)
69-
intercept = network.add_intercept(phases: [phase])
89+
def add_handler(event_type, phase, intercept_type, filter, pattern_type: nil)
90+
intercept = network.add_intercept(phases: [phase], url_patterns: [filter].flatten, pattern_type: pattern_type)
7091
callback_id = network.on(event_type) do |event|
7192
request = event['request']
7293
intercepted_item = intercept_type.new(network, request)

rb/sig/lib/selenium/webdriver/bidi/network.rbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ module Selenium
1414

1515
def cancel_auth: -> untyped
1616

17-
def continue_with_request: (**untyped args) -> untyped
17+
def continue_request: -> untyped
1818

19-
def continue_with_response: (**untyped args) -> untyped
19+
def continue_response: -> untyped
2020

2121
def continue_without_auth: -> untyped
2222

23+
def fail_request: -> untyped
24+
2325
def remove_intercept: (String intercept) -> untyped
2426

2527
def continue_with_auth: (String request_id, String username, String password) -> untyped
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Selenium
2+
module WebDriver
3+
class BiDi
4+
module Cookies
5+
def add_cookie: (untyped name, untyped value) -> untyped
6+
7+
def remove_cookie: (untyped name) -> untyped
8+
9+
def set_cookie_header: (**untyped args) -> untyped
10+
end
11+
end
12+
end
13+
end
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Selenium
2+
module WebDriver
3+
class BiDi
4+
module Headers
5+
def add_header: (untyped name, untyped value) -> untyped
6+
7+
def remove_header: (untyped name) -> untyped
8+
end
9+
end
10+
end
11+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Selenium
2+
module WebDriver
3+
class BiDi
4+
module UrlPattern
5+
def self?.format_pattern: (untyped url_patterns, untyped pattern_type) -> untyped
6+
7+
def self?.to_url_pattern: (*untyped url_patterns) -> untyped
8+
9+
def self?.to_url_string_pattern: (*untyped url_patterns) -> untyped
10+
end
11+
end
12+
end
13+
end

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ module Selenium
2121

2222
def clear_handlers: -> Hash[nil, nil]
2323

24-
def fetch_id: -> String
25-
2624
def remove_handler: (Integer id) -> nil
25+
26+
private
27+
28+
def add_handler: -> untyped
2729
end
2830
end
2931
end

rb/spec/integration/selenium/webdriver/bidi/network_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,26 @@ class BiDi
3232
end
3333
end
3434

35+
it 'adds an intercept with a default pattern type' do
36+
reset_driver!(web_socket_url: true) do |driver|
37+
network = described_class.new(driver.bidi)
38+
pattern = 'http://localhost:4444/formPage.html'
39+
intercept = network.add_intercept(phases: [described_class::PHASES[:before_request]], url_patterns: pattern)
40+
expect(intercept).not_to be_nil
41+
end
42+
end
43+
44+
it 'adds an intercept with a url pattern' do
45+
reset_driver!(web_socket_url: true) do |driver|
46+
network = described_class.new(driver.bidi)
47+
pattern = 'http://localhost:4444/formPage.html'
48+
intercept = network.add_intercept(phases: [described_class::PHASES[:before_request]],
49+
url_patterns: pattern,
50+
pattern_type: :url)
51+
expect(intercept).not_to be_nil
52+
end
53+
end
54+
3555
it 'removes an intercept' do
3656
reset_driver!(web_socket_url: true) do |driver|
3757
network = described_class.new(driver.bidi)

rb/spec/integration/selenium/webdriver/network_spec.rb

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,36 @@ module WebDriver
3636
end
3737
end
3838

39+
it 'adds an auth handler with a filter' do
40+
reset_driver!(web_socket_url: true) do |driver|
41+
network = described_class.new(driver)
42+
network.add_authentication_handler(username, password, url_for('basicAuth'))
43+
driver.navigate.to url_for('basicAuth')
44+
expect(driver.find_element(tag_name: 'h1').text).to eq('authorized')
45+
expect(network.callbacks.count).to be 1
46+
end
47+
end
48+
49+
it 'adds an auth handler with multiple filters' do
50+
reset_driver!(web_socket_url: true) do |driver|
51+
network = described_class.new(driver)
52+
network.add_authentication_handler(username, password, url_for('basicAuth'), url_for('formPage.html'))
53+
driver.navigate.to url_for('basicAuth')
54+
expect(driver.find_element(tag_name: 'h1').text).to eq('authorized')
55+
expect(network.callbacks.count).to be 1
56+
end
57+
end
58+
59+
it 'adds an auth handler with a pattern type' do
60+
reset_driver!(web_socket_url: true) do |driver|
61+
network = described_class.new(driver)
62+
network.add_authentication_handler(username, password, url_for('basicAuth'), pattern_type: :url)
63+
driver.navigate.to url_for('basicAuth')
64+
expect(driver.find_element(tag_name: 'h1').text).to eq('authorized')
65+
expect(network.callbacks.count).to be 1
66+
end
67+
end
68+
3969
it 'removes an auth handler' do
4070
reset_driver!(web_socket_url: true) do |driver|
4171
network = described_class.new(driver)
@@ -81,6 +111,36 @@ module WebDriver
81111
end
82112
end
83113

114+
it 'adds a request handler with a filter' do
115+
reset_driver!(web_socket_url: true) do |driver|
116+
network = described_class.new(driver)
117+
network.add_request_handler(url_for('formPage.html'), &:continue)
118+
driver.navigate.to url_for('formPage.html')
119+
expect(driver.find_element(name: 'login')).to be_displayed
120+
expect(network.callbacks.count).to be 1
121+
end
122+
end
123+
124+
it 'adds a request handler with multiple filters' do
125+
reset_driver!(web_socket_url: true) do |driver|
126+
network = described_class.new(driver)
127+
network.add_request_handler(url_for('formPage.html'), url_for('basicAuth'), &:continue)
128+
driver.navigate.to url_for('formPage.html')
129+
expect(driver.find_element(name: 'login')).to be_displayed
130+
expect(network.callbacks.count).to be 1
131+
end
132+
end
133+
134+
it 'adds a request handler with a pattern type' do
135+
reset_driver!(web_socket_url: true) do |driver|
136+
network = described_class.new(driver)
137+
network.add_request_handler(url_for('formPage.html'), pattern_type: :url, &:continue)
138+
driver.navigate.to url_for('formPage.html')
139+
expect(driver.find_element(name: 'login')).to be_displayed
140+
expect(network.callbacks.count).to be 1
141+
end
142+
end
143+
84144
it 'adds a request handler with attributes' do
85145
reset_driver!(web_socket_url: true) do |driver|
86146
network = described_class.new(driver)
@@ -158,6 +218,36 @@ module WebDriver
158218
end
159219
end
160220

221+
it 'adds a response handler with a filter' do
222+
reset_driver!(web_socket_url: true) do |driver|
223+
network = described_class.new(driver)
224+
network.add_response_handler(url_for('formPage.html'), &:continue)
225+
driver.navigate.to url_for('formPage.html')
226+
expect(driver.find_element(name: 'login')).to be_displayed
227+
expect(network.callbacks.count).to be 1
228+
end
229+
end
230+
231+
it 'adds a response handler with multiple filters' do
232+
reset_driver!(web_socket_url: true) do |driver|
233+
network = described_class.new(driver)
234+
network.add_response_handler(url_for('formPage.html'), url_for('basicAuth'), &:continue)
235+
driver.navigate.to url_for('formPage.html')
236+
expect(driver.find_element(name: 'login')).to be_displayed
237+
expect(network.callbacks.count).to be 1
238+
end
239+
end
240+
241+
it 'adds a response handler with a pattern type' do
242+
reset_driver!(web_socket_url: true) do |driver|
243+
network = described_class.new(driver)
244+
network.add_response_handler(url_for('formPage.html'), pattern_type: :url, &:continue)
245+
driver.navigate.to url_for('formPage.html')
246+
expect(driver.find_element(name: 'login')).to be_displayed
247+
expect(network.callbacks.count).to be 1
248+
end
249+
end
250+
161251
it 'adds a response handler with attributes' do
162252
reset_driver!(web_socket_url: true) do |driver|
163253
network = described_class.new(driver)

0 commit comments

Comments
 (0)