selenium-webdriver 4.28.0 → 4.29.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71aab5006f9982b59f81f1ba39119f70b84fec2603143f4445f4e0d8752169e5
4
- data.tar.gz: 79dcff0ad7a8a73789a7e4bbc415098736aaa21f292be121bae398c71f086434
3
+ metadata.gz: c7bd6340cd61180fd4c0c8753b7dd74972781b016492a8ef9f8c57ade61d26ea
4
+ data.tar.gz: 0f44ea455592315221ba1e994f353b7d6d359fe88a093e25bf558bb7f286258f
5
5
  SHA512:
6
- metadata.gz: d72ff0f3a97097dd479ad3bf0e7ad5f4d9b58d8c40545afd912ae0e211727ffd5da1cd3d52a8ec2973f8f86694424fd89ebb6fc394bac1171f6682ef5af6a6dd
7
- data.tar.gz: 9e21d1c768e945fb445d652a49f85a05f9e85e3cb1f5f60eed5b213fec43562857702a12c8624a3523e381082990ff87bc521519930a85bc3f708cd05c71967c
6
+ metadata.gz: 8bc2ad2827460f67b298abc21740300382957d1dddc97f5708f89571d68ba9f479d21d8131c838b8430a291dc0bb0eaef02f961f83186603540967f01bf8749d
7
+ data.tar.gz: 1b532269414d71bad4c262bb2fb4a34b084bac4fa39b341f16305265fffb1c2f9e47fc399bf8e97f06212d37d15fec9f6361df4d5d4a480896a61ecc126e7a3b
data/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ 4.29.0 (2025-02-17)
2
+ =========================
3
+ * Add CDP for Chrome 133 and remove 130
4
+ * [rb] Add Bidi Network Response Handler (#14900)
5
+ * [rb] Remove Firefox CDP (#15200)
6
+ * [rb][BiDi] Add support for provide response command (#15080)
7
+ * [rb][BiDi] Add set cache behaviour (#15114)
8
+
1
9
  4.28.0 (2025-01-16)
2
10
  =========================
3
11
  * Add CDP for Chrome 132 and remove 129
Binary file
Binary file
Binary file
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class BiDi
23
+ class Cookies < Hash
24
+ def initialize(cookies = {})
25
+ super()
26
+ merge!(cookies)
27
+ end
28
+
29
+ def as_json
30
+ self[:name] = self[:name].to_s
31
+ self[:value] = {type: 'string', value: self[:value].to_s}
32
+
33
+ [compact]
34
+ end
35
+ end
36
+ end # BiDi
37
+ end # WebDriver
38
+ end # Selenium
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class BiDi
23
+ class Credentials
24
+ attr_accessor :username, :password
25
+
26
+ def initialize(username: nil, password: nil)
27
+ @username = username
28
+ @password = password
29
+ end
30
+
31
+ def as_json
32
+ return nil unless username && password
33
+
34
+ {
35
+ type: 'password',
36
+ username: username,
37
+ password: password
38
+ }
39
+ end
40
+ end
41
+ end # BiDi
42
+ end # WebDriver
43
+ end # Selenium
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class BiDi
23
+ class Headers < Hash
24
+ def as_json
25
+ map do |name, val|
26
+ {
27
+ name: name.to_s,
28
+ value: {
29
+ type: 'string',
30
+ value: val.to_s
31
+ }
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end # BiDi
37
+ end # WebDriver
38
+ end # Selenium
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class BiDi
23
+ class InterceptedAuth < InterceptedItem
24
+ def authenticate(username, password)
25
+ network.continue_with_auth(id, username, password)
26
+ end
27
+
28
+ def skip
29
+ network.continue_without_auth(id)
30
+ end
31
+
32
+ def cancel
33
+ network.cancel_auth(id)
34
+ end
35
+ end
36
+ end # BiDi
37
+ end # WebDriver
38
+ end # Selenium
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ module Selenium
21
+ module WebDriver
22
+ class BiDi
23
+ class InterceptedItem
24
+ attr_reader :network, :request
25
+
26
+ def initialize(network, request)
27
+ @network = network
28
+ @request = request
29
+ end
30
+
31
+ def id
32
+ @id ||= @request['request']
33
+ end
34
+ end
35
+ end # BiDi
36
+ end # WebDriver
37
+ end # Selenium
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ require_relative 'cookies'
21
+ require_relative 'headers'
22
+
23
+ module Selenium
24
+ module WebDriver
25
+ class BiDi
26
+ class InterceptedRequest < InterceptedItem
27
+ attr_accessor :method, :url
28
+ attr_reader :body
29
+
30
+ def initialize(network, request)
31
+ super
32
+ @method = nil
33
+ @url = nil
34
+ @body = nil
35
+ end
36
+
37
+ def continue
38
+ network.continue_request(
39
+ id: id,
40
+ body: body,
41
+ cookies: cookies.as_json,
42
+ headers: headers.as_json,
43
+ method: method,
44
+ url: url
45
+ )
46
+ end
47
+
48
+ def fail
49
+ network.fail_request(id)
50
+ end
51
+
52
+ def body=(value)
53
+ @body = {
54
+ type: 'string',
55
+ value: value.to_json
56
+ }
57
+ end
58
+
59
+ def headers
60
+ @headers ||= Headers.new
61
+ end
62
+
63
+ def cookies(cookies = {})
64
+ @cookies ||= Cookies.new(cookies)
65
+ end
66
+ end
67
+ end # BiDi
68
+ end # WebDriver
69
+ end # Selenium
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ require_relative 'credentials'
21
+ require_relative 'headers'
22
+ require_relative 'cookies'
23
+
24
+ module Selenium
25
+ module WebDriver
26
+ class BiDi
27
+ class InterceptedResponse < InterceptedItem
28
+ attr_accessor :reason, :status
29
+ attr_reader :body
30
+
31
+ def initialize(network, request)
32
+ super
33
+ @reason = nil
34
+ @status = nil
35
+ @body = nil
36
+ end
37
+
38
+ def continue
39
+ network.continue_response(
40
+ id: id,
41
+ cookies: cookies.as_json,
42
+ headers: headers.as_json,
43
+ credentials: credentials.as_json,
44
+ reason: reason,
45
+ status: status
46
+ )
47
+ end
48
+
49
+ def provide_response
50
+ network.provide_response(
51
+ id: id,
52
+ cookies: cookies.as_json,
53
+ headers: headers.as_json,
54
+ body: body,
55
+ reason: reason,
56
+ status: status
57
+ )
58
+ end
59
+
60
+ def credentials(username: nil, password: nil)
61
+ @credentials ||= Credentials.new(username: username, password: password)
62
+ end
63
+
64
+ def headers
65
+ @headers ||= Headers.new
66
+ end
67
+
68
+ def cookies(cookies = {})
69
+ @cookies ||= Cookies.new(cookies)
70
+ end
71
+
72
+ def body=(value)
73
+ @body = {
74
+ type: 'string',
75
+ value: value.to_json
76
+ }
77
+ end
78
+ end
79
+ end # BiDi
80
+ end # WebDriver
81
+ end # Selenium
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ require 'uri'
21
+
22
+ module Selenium
23
+ module WebDriver
24
+ class BiDi
25
+ module UrlPattern
26
+ module_function
27
+
28
+ def format_pattern(url_patterns, pattern_type)
29
+ case pattern_type
30
+ when :string
31
+ to_url_string_pattern(url_patterns)
32
+ when :url
33
+ to_url_pattern(url_patterns)
34
+ else
35
+ raise ArgumentError, "Unknown pattern type: #{pattern_type}"
36
+ end
37
+ end
38
+
39
+ def to_url_pattern(*url_patterns)
40
+ url_patterns.flatten.map do |url_pattern|
41
+ uri = URI.parse(url_pattern)
42
+
43
+ {
44
+ type: 'pattern',
45
+ protocol: uri.scheme || '',
46
+ hostname: uri.host || '',
47
+ port: uri.port.to_s || '',
48
+ pathname: uri.path || '',
49
+ search: uri.query || ''
50
+ }
51
+ end
52
+ end
53
+
54
+ def to_url_string_pattern(*url_patterns)
55
+ url_patterns.flatten.map do |url_pattern|
56
+ {
57
+ type: 'string',
58
+ pattern: url_pattern
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end # BiDi
64
+ end # WebDriver
65
+ end # Selenium
@@ -16,6 +16,7 @@
16
16
  # KIND, either express or implied. See the License for the
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
+ require_relative 'network/url_pattern'
19
20
 
20
21
  module Selenium
21
22
  module WebDriver
@@ -39,8 +40,12 @@ module Selenium
39
40
  @bidi = bidi
40
41
  end
41
42
 
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)
44
49
  end
45
50
 
46
51
  def remove_intercept(intercept)
@@ -50,31 +55,83 @@ module Selenium
50
55
  def continue_with_auth(request_id, username, password)
51
56
  @bidi.send_cmd(
52
57
  'network.continueWithAuth',
53
- 'request' => request_id,
54
- 'action' => 'provideCredentials',
55
- 'credentials' => {
56
- 'type' => 'password',
57
- 'username' => username,
58
- 'password' => password
58
+ request: request_id,
59
+ action: 'provideCredentials',
60
+ credentials: {
61
+ type: 'password',
62
+ username: username,
63
+ password: password
59
64
  }
60
65
  )
61
66
  end
62
67
 
63
- def continue_with_request(**args)
68
+ def continue_without_auth(request_id)
64
69
  @bidi.send_cmd(
65
- 'network.continueWithRequest',
66
- request: args[:request_id],
67
- 'body' => args[:body],
68
- 'cookies' => args[:cookies],
69
- 'headers' => args[:headers],
70
- 'method' => args[:method],
71
- 'url' => args[:url]
70
+ 'network.continueWithAuth',
71
+ request: request_id,
72
+ action: 'default'
73
+ )
74
+ end
75
+
76
+ def cancel_auth(request_id)
77
+ @bidi.send_cmd(
78
+ 'network.continueWithAuth',
79
+ request: request_id,
80
+ action: 'cancel'
81
+ )
82
+ end
83
+
84
+ def continue_request(**args)
85
+ @bidi.send_cmd(
86
+ 'network.continueRequest',
87
+ request: args[:id],
88
+ body: args[:body],
89
+ cookies: args[:cookies],
90
+ headers: args[:headers],
91
+ method: args[:method],
92
+ url: args[:url]
93
+ )
94
+ end
95
+
96
+ def fail_request(request_id)
97
+ @bidi.send_cmd(
98
+ 'network.failRequest',
99
+ request: request_id
100
+ )
101
+ end
102
+
103
+ def continue_response(**args)
104
+ @bidi.send_cmd(
105
+ 'network.continueResponse',
106
+ request: args[:id],
107
+ cookies: args[:cookies],
108
+ credentials: args[:credentials],
109
+ headers: args[:headers],
110
+ reasonPhrase: args[:reason],
111
+ statusCode: args[:status]
72
112
  )
73
113
  end
74
114
 
115
+ def provide_response(**args)
116
+ @bidi.send_cmd(
117
+ 'network.provideResponse',
118
+ request: args[:id],
119
+ body: args[:body],
120
+ cookies: args[:cookies],
121
+ headers: args[:headers],
122
+ reasonPhrase: args[:reason],
123
+ statusCode: args[:status]
124
+ )
125
+ end
126
+
127
+ def set_cache_behavior(behavior, *contexts)
128
+ @bidi.send_cmd('network.setCacheBehavior', cacheBehavior: behavior, contexts: contexts)
129
+ end
130
+
75
131
  def on(event, &)
76
132
  event = EVENTS[event] if event.is_a?(Symbol)
77
133
  @bidi.add_callback(event, &)
134
+ @bidi.session.subscribe(event)
78
135
  end
79
136
  end # Network
80
137
  end # BiDi
@@ -26,6 +26,10 @@ module Selenium
26
26
  autoload :BrowsingContext, 'selenium/webdriver/bidi/browsing_context'
27
27
  autoload :Struct, 'selenium/webdriver/bidi/struct'
28
28
  autoload :Network, 'selenium/webdriver/bidi/network'
29
+ autoload :InterceptedRequest, 'selenium/webdriver/bidi/network/intercepted_request'
30
+ autoload :InterceptedResponse, 'selenium/webdriver/bidi/network/intercepted_response'
31
+ autoload :InterceptedAuth, 'selenium/webdriver/bidi/network/intercepted_auth'
32
+ autoload :InterceptedItem, 'selenium/webdriver/bidi/network/intercepted_item'
29
33
 
30
34
  def initialize(url:)
31
35
  @ws = WebSocketConnection.new(url: url)
@@ -17,47 +17,85 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
+ require 'forwardable'
21
+
20
22
  module Selenium
21
23
  module WebDriver
22
24
  class Network
23
- attr_reader :callbacks
25
+ extend Forwardable
26
+
27
+ attr_reader :callbacks, :network
28
+ alias bidi network
29
+
30
+ def_delegators :network, :continue_with_auth, :continue_with_request, :continue_with_response
24
31
 
25
32
  def initialize(bridge)
26
33
  @network = BiDi::Network.new(bridge.bidi)
27
34
  @callbacks = {}
28
35
  end
29
36
 
30
- def add_authentication_handler(username, password)
31
- intercept = @network.add_intercept(phases: [BiDi::Network::PHASES[:auth_required]])
32
- auth_id = @network.on(:auth_required) do |event|
33
- request_id = event['requestId']
34
- @network.continue_with_auth(request_id, username, password)
35
- end
36
- @callbacks[auth_id] = intercept
37
+ def remove_handler(id)
38
+ intercept = callbacks[id]
39
+ network.remove_intercept(intercept['intercept'])
40
+ callbacks.delete(id)
41
+ end
42
+
43
+ def clear_handlers
44
+ callbacks.each_key { |id| remove_handler(id) }
45
+ end
37
46
 
38
- auth_id
47
+ def add_authentication_handler(username = nil, password = nil, *filter, pattern_type: nil, &block)
48
+ selected_block =
49
+ if username && password
50
+ proc { |auth| auth.authenticate(username, password) }
51
+ else
52
+ block
53
+ end
54
+
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
+ )
39
63
  end
40
64
 
41
- def remove_handler(id)
42
- intercept = @callbacks[id]
43
- @network.remove_intercept(intercept['intercept'])
44
- @callbacks.delete(id)
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
+ )
45
74
  end
46
75
 
47
- def clear_handlers
48
- @callbacks.each_key { |id| remove_handler(id) }
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
+ )
49
85
  end
50
86
 
51
- def add_request_handler
52
- intercept = @network.add_intercept(phases: [BiDi::Network::PHASES[:before_request]])
53
- request_id = @network.on(:before_request) do |event|
54
- request_id = event['requestId']
55
- @network.continue_with_request(request_id: request_id)
56
- end
87
+ private
57
88
 
58
- @callbacks[request_id] = intercept
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)
91
+ callback_id = network.on(event_type) do |event|
92
+ request = event['request']
93
+ intercepted_item = intercept_type.new(network, request)
94
+ yield(intercepted_item)
95
+ end
59
96
 
60
- request_id
97
+ callbacks[callback_id] = intercept
98
+ callback_id
61
99
  end
62
100
  end # Network
63
101
  end # WebDriver
@@ -30,7 +30,6 @@ module Selenium
30
30
  DriverExtensions::FullPageScreenshot,
31
31
  DriverExtensions::HasContext,
32
32
  DriverExtensions::HasBiDi,
33
- DriverExtensions::HasDevTools,
34
33
  DriverExtensions::HasLogEvents,
35
34
  DriverExtensions::HasNetworkInterception,
36
35
  DriverExtensions::HasWebStorage,
@@ -46,23 +45,6 @@ module Selenium
46
45
  def browser
47
46
  :firefox
48
47
  end
49
-
50
- private
51
-
52
- def devtools_url
53
- if capabilities['moz:debuggerAddress'].nil?
54
- raise(Error::WebDriverError, 'DevTools is not supported by this version of Firefox; use v85 or higher')
55
- end
56
-
57
- uri = URI("http://#{capabilities['moz:debuggerAddress']}")
58
- response = Net::HTTP.get(uri.hostname, '/json/version', uri.port)
59
-
60
- JSON.parse(response)['webSocketDebuggerUrl']
61
- end
62
-
63
- def devtools_version
64
- Firefox::DEVTOOLS_VERSION
65
- end
66
48
  end # Driver
67
49
  end # Firefox
68
50
  end # WebDriver
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.28.0'
22
+ VERSION = '4.29.0'
23
23
  end # WebDriver
24
24
  end # Selenium
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.28.0
4
+ version: 4.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-01-20 00:00:00.000000000 Z
13
+ date: 2025-02-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: base64
@@ -298,6 +298,14 @@ files:
298
298
  - lib/selenium/webdriver/bidi/log_handler.rb
299
299
  - lib/selenium/webdriver/bidi/log_inspector.rb
300
300
  - lib/selenium/webdriver/bidi/network.rb
301
+ - lib/selenium/webdriver/bidi/network/cookies.rb
302
+ - lib/selenium/webdriver/bidi/network/credentials.rb
303
+ - lib/selenium/webdriver/bidi/network/headers.rb
304
+ - lib/selenium/webdriver/bidi/network/intercepted_auth.rb
305
+ - lib/selenium/webdriver/bidi/network/intercepted_item.rb
306
+ - lib/selenium/webdriver/bidi/network/intercepted_request.rb
307
+ - lib/selenium/webdriver/bidi/network/intercepted_response.rb
308
+ - lib/selenium/webdriver/bidi/network/url_pattern.rb
301
309
  - lib/selenium/webdriver/bidi/session.rb
302
310
  - lib/selenium/webdriver/bidi/struct.rb
303
311
  - lib/selenium/webdriver/chrome.rb