selenium-webdriver 4.49.0 → 4.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +13 -0
  3. data/Gemfile +0 -0
  4. data/LICENSE +0 -0
  5. data/NOTICE +0 -0
  6. data/README.md +0 -0
  7. data/bin/linux-arm64/selenium-manager +0 -0
  8. data/bin/linux-x86_64/selenium-manager +0 -0
  9. data/bin/macos/selenium-manager +0 -0
  10. data/bin/selenium-manager-THIRD-PARTY-NOTICES.txt +74 -43
  11. data/bin/selenium-manager.cdx.json +421 -421
  12. data/bin/windows/selenium-manager.exe +0 -0
  13. data/lib/selenium/server.rb +0 -0
  14. data/lib/selenium/webdriver/atoms/findElements.js +14 -2
  15. data/lib/selenium/webdriver/atoms.rb +0 -0
  16. data/lib/selenium/webdriver/bidi/browser.rb +0 -0
  17. data/lib/selenium/webdriver/bidi/browsing_context.rb +0 -0
  18. data/lib/selenium/webdriver/bidi/error.rb +0 -0
  19. data/lib/selenium/webdriver/bidi/log_handler.rb +0 -0
  20. data/lib/selenium/webdriver/bidi/network/cookies.rb +0 -0
  21. data/lib/selenium/webdriver/bidi/network/credentials.rb +0 -0
  22. data/lib/selenium/webdriver/bidi/network/headers.rb +0 -0
  23. data/lib/selenium/webdriver/bidi/network/intercepted_auth.rb +0 -0
  24. data/lib/selenium/webdriver/bidi/network/intercepted_item.rb +0 -0
  25. data/lib/selenium/webdriver/bidi/network/intercepted_request.rb +0 -0
  26. data/lib/selenium/webdriver/bidi/network/intercepted_response.rb +0 -0
  27. data/lib/selenium/webdriver/bidi/network/url_pattern.rb +0 -0
  28. data/lib/selenium/webdriver/bidi/network.rb +0 -0
  29. data/lib/selenium/webdriver/bidi/protocol/bluetooth.rb +27 -23
  30. data/lib/selenium/webdriver/bidi/protocol/browser.rb +0 -0
  31. data/lib/selenium/webdriver/bidi/protocol/browsing_context.rb +58 -4
  32. data/lib/selenium/webdriver/bidi/protocol/digital_credentials.rb +69 -0
  33. data/lib/selenium/webdriver/bidi/protocol/domain.rb +0 -0
  34. data/lib/selenium/webdriver/bidi/protocol/emulation.rb +31 -0
  35. data/lib/selenium/webdriver/bidi/protocol/error_code.rb +0 -0
  36. data/lib/selenium/webdriver/bidi/protocol/input.rb +0 -0
  37. data/lib/selenium/webdriver/bidi/protocol/log.rb +0 -0
  38. data/lib/selenium/webdriver/bidi/protocol/moz_debugging.rb +334 -0
  39. data/lib/selenium/webdriver/bidi/protocol/moz_profiler.rb +108 -0
  40. data/lib/selenium/webdriver/bidi/protocol/network.rb +0 -0
  41. data/lib/selenium/webdriver/bidi/protocol/permissions.rb +0 -0
  42. data/lib/selenium/webdriver/bidi/protocol/script.rb +0 -0
  43. data/lib/selenium/webdriver/bidi/protocol/session.rb +0 -0
  44. data/lib/selenium/webdriver/bidi/protocol/speculation.rb +0 -0
  45. data/lib/selenium/webdriver/bidi/protocol/storage.rb +0 -0
  46. data/lib/selenium/webdriver/bidi/protocol/user_agent_client_hints.rb +0 -0
  47. data/lib/selenium/webdriver/bidi/protocol/web_extension.rb +41 -5
  48. data/lib/selenium/webdriver/bidi/protocol.rb +3 -0
  49. data/lib/selenium/webdriver/bidi/serialization/record.rb +0 -0
  50. data/lib/selenium/webdriver/bidi/serialization/union.rb +0 -0
  51. data/lib/selenium/webdriver/bidi/serialization.rb +0 -0
  52. data/lib/selenium/webdriver/bidi/session.rb +0 -0
  53. data/lib/selenium/webdriver/bidi/struct.rb +0 -0
  54. data/lib/selenium/webdriver/bidi/support/bidi_generate.rb +154 -38
  55. data/lib/selenium/webdriver/bidi/support/check_generated.rb +0 -0
  56. data/lib/selenium/webdriver/bidi/transport.rb +0 -0
  57. data/lib/selenium/webdriver/bidi.rb +0 -0
  58. data/lib/selenium/webdriver/chrome/driver.rb +0 -0
  59. data/lib/selenium/webdriver/chrome/features.rb +0 -0
  60. data/lib/selenium/webdriver/chrome/options.rb +0 -0
  61. data/lib/selenium/webdriver/chrome/profile.rb +0 -0
  62. data/lib/selenium/webdriver/chrome/service.rb +0 -0
  63. data/lib/selenium/webdriver/chrome.rb +0 -0
  64. data/lib/selenium/webdriver/chromium/driver.rb +0 -0
  65. data/lib/selenium/webdriver/chromium/features.rb +0 -0
  66. data/lib/selenium/webdriver/chromium/options.rb +0 -0
  67. data/lib/selenium/webdriver/chromium/profile.rb +0 -0
  68. data/lib/selenium/webdriver/chromium.rb +0 -0
  69. data/lib/selenium/webdriver/common/action_builder.rb +0 -0
  70. data/lib/selenium/webdriver/common/alert.rb +0 -0
  71. data/lib/selenium/webdriver/common/child_process.rb +0 -0
  72. data/lib/selenium/webdriver/common/client_config.rb +0 -0
  73. data/lib/selenium/webdriver/common/driver.rb +24 -0
  74. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -0
  75. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -0
  76. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
  77. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -0
  78. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -0
  79. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +0 -0
  80. data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -0
  81. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +0 -0
  82. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -0
  83. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -0
  84. data/lib/selenium/webdriver/common/driver_extensions/has_fedcm_dialog.rb +0 -0
  85. data/lib/selenium/webdriver/common/driver_extensions/has_file_downloads.rb +0 -0
  86. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -0
  87. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +0 -0
  88. data/lib/selenium/webdriver/common/driver_extensions/has_logs.rb +0 -0
  89. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -0
  90. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +0 -0
  91. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -0
  92. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +0 -0
  93. data/lib/selenium/webdriver/common/driver_extensions/has_session_events.rb +0 -0
  94. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -0
  95. data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +0 -0
  96. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +0 -0
  97. data/lib/selenium/webdriver/common/driver_finder.rb +0 -0
  98. data/lib/selenium/webdriver/common/element.rb +0 -0
  99. data/lib/selenium/webdriver/common/error.rb +0 -0
  100. data/lib/selenium/webdriver/common/fedcm/account.rb +0 -0
  101. data/lib/selenium/webdriver/common/fedcm/dialog.rb +0 -0
  102. data/lib/selenium/webdriver/common/fedcm.rb +0 -0
  103. data/lib/selenium/webdriver/common/file_reaper.rb +0 -0
  104. data/lib/selenium/webdriver/common/interactions/input_device.rb +0 -0
  105. data/lib/selenium/webdriver/common/interactions/interaction.rb +0 -0
  106. data/lib/selenium/webdriver/common/interactions/interactions.rb +0 -0
  107. data/lib/selenium/webdriver/common/interactions/key_actions.rb +0 -0
  108. data/lib/selenium/webdriver/common/interactions/key_input.rb +0 -0
  109. data/lib/selenium/webdriver/common/interactions/none_input.rb +0 -0
  110. data/lib/selenium/webdriver/common/interactions/pause.rb +0 -0
  111. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +0 -0
  112. data/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +0 -0
  113. data/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +0 -0
  114. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +0 -0
  115. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +0 -0
  116. data/lib/selenium/webdriver/common/interactions/pointer_press.rb +0 -0
  117. data/lib/selenium/webdriver/common/interactions/scroll.rb +0 -0
  118. data/lib/selenium/webdriver/common/interactions/scroll_origin.rb +0 -0
  119. data/lib/selenium/webdriver/common/interactions/typing_interaction.rb +0 -0
  120. data/lib/selenium/webdriver/common/interactions/wheel_actions.rb +0 -0
  121. data/lib/selenium/webdriver/common/interactions/wheel_input.rb +0 -0
  122. data/lib/selenium/webdriver/common/keys.rb +0 -0
  123. data/lib/selenium/webdriver/common/local_driver.rb +0 -0
  124. data/lib/selenium/webdriver/common/log_entry.rb +0 -0
  125. data/lib/selenium/webdriver/common/logger.rb +0 -0
  126. data/lib/selenium/webdriver/common/logs.rb +0 -0
  127. data/lib/selenium/webdriver/common/manager.rb +0 -0
  128. data/lib/selenium/webdriver/common/navigation.rb +0 -0
  129. data/lib/selenium/webdriver/common/network.rb +0 -0
  130. data/lib/selenium/webdriver/common/options.rb +0 -0
  131. data/lib/selenium/webdriver/common/platform.rb +0 -0
  132. data/lib/selenium/webdriver/common/port_prober.rb +0 -0
  133. data/lib/selenium/webdriver/common/print_options.rb +0 -0
  134. data/lib/selenium/webdriver/common/profile_helper.rb +0 -0
  135. data/lib/selenium/webdriver/common/proxy.rb +0 -0
  136. data/lib/selenium/webdriver/common/script.rb +0 -0
  137. data/lib/selenium/webdriver/common/search_context.rb +0 -0
  138. data/lib/selenium/webdriver/common/selenium_manager.rb +0 -0
  139. data/lib/selenium/webdriver/common/service.rb +0 -0
  140. data/lib/selenium/webdriver/common/service_manager.rb +0 -0
  141. data/lib/selenium/webdriver/common/shadow_root.rb +0 -0
  142. data/lib/selenium/webdriver/common/socket_lock.rb +0 -0
  143. data/lib/selenium/webdriver/common/socket_poller.rb +0 -0
  144. data/lib/selenium/webdriver/common/takes_screenshot.rb +0 -0
  145. data/lib/selenium/webdriver/common/target_locator.rb +0 -0
  146. data/lib/selenium/webdriver/common/timeouts.rb +0 -0
  147. data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +0 -0
  148. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +0 -0
  149. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +0 -0
  150. data/lib/selenium/webdriver/common/wait.rb +0 -0
  151. data/lib/selenium/webdriver/common/web_extension.rb +42 -0
  152. data/lib/selenium/webdriver/common/websocket_connection.rb +2 -2
  153. data/lib/selenium/webdriver/common/window.rb +0 -0
  154. data/lib/selenium/webdriver/common/zipper.rb +15 -11
  155. data/lib/selenium/webdriver/common.rb +1 -0
  156. data/lib/selenium/webdriver/devtools/console_event.rb +0 -0
  157. data/lib/selenium/webdriver/devtools/exception_event.rb +0 -0
  158. data/lib/selenium/webdriver/devtools/mutation_event.rb +0 -0
  159. data/lib/selenium/webdriver/devtools/network_interceptor.rb +0 -0
  160. data/lib/selenium/webdriver/devtools/pinned_script.rb +0 -0
  161. data/lib/selenium/webdriver/devtools/request.rb +0 -0
  162. data/lib/selenium/webdriver/devtools/response.rb +0 -0
  163. data/lib/selenium/webdriver/devtools.rb +0 -0
  164. data/lib/selenium/webdriver/edge/driver.rb +0 -0
  165. data/lib/selenium/webdriver/edge/features.rb +0 -0
  166. data/lib/selenium/webdriver/edge/options.rb +0 -0
  167. data/lib/selenium/webdriver/edge/profile.rb +0 -0
  168. data/lib/selenium/webdriver/edge/service.rb +0 -0
  169. data/lib/selenium/webdriver/edge.rb +0 -0
  170. data/lib/selenium/webdriver/firefox/driver.rb +0 -0
  171. data/lib/selenium/webdriver/firefox/features.rb +18 -7
  172. data/lib/selenium/webdriver/firefox/options.rb +0 -0
  173. data/lib/selenium/webdriver/firefox/profile.rb +0 -37
  174. data/lib/selenium/webdriver/firefox/profiles_ini.rb +0 -0
  175. data/lib/selenium/webdriver/firefox/service.rb +0 -0
  176. data/lib/selenium/webdriver/firefox/util.rb +0 -0
  177. data/lib/selenium/webdriver/firefox.rb +0 -2
  178. data/lib/selenium/webdriver/ie/driver.rb +0 -0
  179. data/lib/selenium/webdriver/ie/features.rb +0 -0
  180. data/lib/selenium/webdriver/ie/options.rb +0 -0
  181. data/lib/selenium/webdriver/ie/service.rb +0 -0
  182. data/lib/selenium/webdriver/ie.rb +0 -0
  183. data/lib/selenium/webdriver/remote/bidi_bridge.rb +23 -0
  184. data/lib/selenium/webdriver/remote/bridge/commands.rb +0 -0
  185. data/lib/selenium/webdriver/remote/bridge/locator_converter.rb +0 -0
  186. data/lib/selenium/webdriver/remote/bridge.rb +20 -6
  187. data/lib/selenium/webdriver/remote/capabilities.rb +0 -0
  188. data/lib/selenium/webdriver/remote/driver.rb +0 -0
  189. data/lib/selenium/webdriver/remote/features.rb +9 -8
  190. data/lib/selenium/webdriver/remote/http/common.rb +0 -0
  191. data/lib/selenium/webdriver/remote/http/curb.rb +0 -0
  192. data/lib/selenium/webdriver/remote/http/default.rb +0 -0
  193. data/lib/selenium/webdriver/remote/response.rb +0 -0
  194. data/lib/selenium/webdriver/remote/server_error.rb +0 -0
  195. data/lib/selenium/webdriver/remote.rb +0 -0
  196. data/lib/selenium/webdriver/safari/driver.rb +0 -0
  197. data/lib/selenium/webdriver/safari/features.rb +0 -0
  198. data/lib/selenium/webdriver/safari/options.rb +0 -0
  199. data/lib/selenium/webdriver/safari/service.rb +0 -0
  200. data/lib/selenium/webdriver/safari.rb +0 -0
  201. data/lib/selenium/webdriver/support/abstract_event_listener.rb +0 -0
  202. data/lib/selenium/webdriver/support/block_event_listener.rb +0 -0
  203. data/lib/selenium/webdriver/support/color.rb +0 -0
  204. data/lib/selenium/webdriver/support/escaper.rb +0 -0
  205. data/lib/selenium/webdriver/support/event_firing_bridge.rb +0 -0
  206. data/lib/selenium/webdriver/support/guards/guard.rb +0 -0
  207. data/lib/selenium/webdriver/support/guards/guard_condition.rb +0 -0
  208. data/lib/selenium/webdriver/support/guards.rb +0 -0
  209. data/lib/selenium/webdriver/support/relative_locator.rb +0 -0
  210. data/lib/selenium/webdriver/support/select.rb +0 -0
  211. data/lib/selenium/webdriver/support.rb +0 -0
  212. data/lib/selenium/webdriver/version.rb +1 -1
  213. data/lib/selenium/webdriver.rb +0 -0
  214. data/lib/selenium-webdriver.rb +0 -0
  215. data/selenium-webdriver.gemspec +0 -1
  216. metadata +7 -27
  217. data/lib/selenium/webdriver/firefox/extension.rb +0 -103
File without changes
@@ -0,0 +1,42 @@
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
+ #
23
+ # A browser extension installed via Driver#install_web_extension.
24
+ # Wraps the identifier the browser assigned; pass it to Driver#uninstall_web_extension.
25
+ #
26
+ class WebExtension
27
+ #
28
+ # @return [String] identifier assigned to the extension by the browser
29
+ #
30
+
31
+ attr_reader :id
32
+
33
+ #
34
+ # @api private
35
+ #
36
+
37
+ def initialize(id)
38
+ @id = id
39
+ end
40
+ end # WebExtension
41
+ end # WebDriver
42
+ end # Selenium
@@ -105,7 +105,7 @@ module Selenium
105
105
 
106
106
  id = next_id
107
107
  data = payload.merge(id: id)
108
- WebDriver.logger.debug "WebSocket -> #{data}"[...MAX_LOG_MESSAGE_SIZE], id: :ws
108
+ WebDriver.logger.debug('WebSocket ->', id: :ws) { data.to_s[...MAX_LOG_MESSAGE_SIZE] }
109
109
  data = JSON.generate(data)
110
110
  out_frame = WebSocket::Frame::Outgoing::Client.new(version: ws.version, data: data, type: 'text')
111
111
 
@@ -200,7 +200,7 @@ module Selenium
200
200
  msg = JSON.parse(message)
201
201
  @messages_mtx.synchronize { messages[msg['id']] = msg if msg.key?('id') }
202
202
 
203
- WebDriver.logger.debug "WebSocket <- #{msg}"[...MAX_LOG_MESSAGE_SIZE], id: :ws
203
+ WebDriver.logger.debug('WebSocket <-', id: :ws) { msg.to_s[...MAX_LOG_MESSAGE_SIZE] }
204
204
  msg
205
205
  end
206
206
 
File without changes
@@ -56,27 +56,31 @@ module Selenium
56
56
  end
57
57
 
58
58
  def zip(path)
59
- with_tmp_zip do |zip|
60
- ::Find.find(path) do |file|
61
- add_zip_entry zip, file, file.sub("#{path}/", '') unless File.directory?(file)
62
- end
59
+ encode_zip(path, path)
60
+ end
63
61
 
64
- zip.commit
65
- File.open(zip.name, 'rb') { |io| Base64.strict_encode64 io.read }
66
- end
62
+ # Keeps +path+ (a file or directory) as the archive's single top-level entry, unlike #zip
63
+ # which flattens a directory's contents; the Grid upload endpoint returns that one entry's path.
64
+ def zip_root(path)
65
+ encode_zip(path, File.dirname(path))
67
66
  end
68
67
 
69
- def zip_file(path)
68
+ # Backwards-compatible name for the file-only behavior #zip_root now subsumes.
69
+ alias zip_file zip_root
70
+
71
+ private
72
+
73
+ def encode_zip(path, base)
70
74
  with_tmp_zip do |zip|
71
- add_zip_entry zip, path, File.basename(path)
75
+ ::Find.find(path) do |file|
76
+ add_zip_entry zip, file, file.sub("#{base}/", '') unless File.directory?(file)
77
+ end
72
78
 
73
79
  zip.commit
74
80
  File.open(zip.name, 'rb') { |io| Base64.strict_encode64 io.read }
75
81
  end
76
82
  end
77
83
 
78
- private
79
-
80
84
  def with_tmp_zip(&blk)
81
85
  # Don't use Tempfile since it lacks rb_file_s_rename permission on Windows.
82
86
  Dir.mktmpdir do |tmp_dir|
@@ -94,6 +94,7 @@ require 'selenium/webdriver/common/options'
94
94
  require 'selenium/webdriver/common/takes_screenshot'
95
95
  require 'selenium/webdriver/common/driver'
96
96
  require 'selenium/webdriver/common/element'
97
+ require 'selenium/webdriver/common/web_extension'
97
98
  require 'selenium/webdriver/common/shadow_root'
98
99
  require 'selenium/webdriver/common/websocket_connection'
99
100
  require 'selenium/webdriver/common/child_process'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -38,13 +38,7 @@ module Selenium
38
38
  end
39
39
 
40
40
  def install_addon(path, temporary)
41
- addon = if File.directory?(path)
42
- Zipper.zip(path)
43
- else
44
- File.open(path, 'rb') { |crx_file| Base64.strict_encode64 crx_file.read }
45
- end
46
-
47
- payload = {addon: addon}
41
+ payload = {addon: encode_extension(path)}
48
42
  payload[:temporary] = temporary unless temporary.nil?
49
43
  execute :install_addon, {}, payload
50
44
  end
@@ -53,6 +47,23 @@ module Selenium
53
47
  execute :uninstall_addon, {}, {id: id}
54
48
  end
55
49
 
50
+ def install_web_extension(path, allow_private_browsing: nil, permanent: nil)
51
+ unless bidi?
52
+ temporary = !permanent unless permanent.nil?
53
+ options = {temporary: temporary, allowPrivateBrowsing: allow_private_browsing}.compact
54
+ return WebDriver::WebExtension.new(execute(:install_addon, {}, {addon: encode_extension(path), **options}))
55
+ end
56
+
57
+ options = {allow_private_browsing:, permanent:}.compact
58
+ result = web_extension.moz.install(extension_data: web_extension_data(path), **options)
59
+ WebDriver::WebExtension.new(result.extension)
60
+ end
61
+
62
+ def uninstall_web_extension(extension_id)
63
+ bidi? ? web_extension.uninstall(extension: extension_id) : uninstall_addon(extension_id)
64
+ nil
65
+ end
66
+
56
67
  def full_screenshot
57
68
  execute :full_page_screenshot
58
69
  end
File without changes
@@ -25,7 +25,6 @@ module Selenium
25
25
 
26
26
  VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
27
27
  WEBDRIVER_PREFS = {
28
- port: 'webdriver_firefox_port',
29
28
  log_file: 'webdriver.log.file'
30
29
  }.freeze
31
30
 
@@ -74,14 +73,12 @@ module Selenium
74
73
  @model = verify_model(model)
75
74
 
76
75
  @additional_prefs = read_model_prefs
77
- @extensions = {}
78
76
  end
79
77
 
80
78
  def layout_on_disk
81
79
  profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
82
80
  FileReaper << profile_dir
83
81
 
84
- install_extensions(profile_dir)
85
82
  delete_lock_files(profile_dir)
86
83
  delete_extensions_cache(profile_dir)
87
84
  update_user_prefs_in(profile_dir)
@@ -108,32 +105,11 @@ module Selenium
108
105
  @additional_prefs[key.to_s] = value
109
106
  end
110
107
 
111
- def port=(port)
112
- WebDriver.logger.deprecate('Firefox::Profile#port=', 'the Service class', id: :firefox_profile)
113
- self[WEBDRIVER_PREFS[:port]] = port
114
- end
115
-
116
- def secure_ssl=(value)
117
- WebDriver.logger.deprecate('Firefox::Profile#secure_ssl=', id: :firefox_profile)
118
- @secure_ssl = value
119
- end
120
-
121
- def load_no_focus_lib=(value)
122
- WebDriver.logger.deprecate('Firefox::Profile#load_no_focus_lib=', id: :firefox_profile)
123
- @load_no_focus_lib = value
124
- end
125
-
126
108
  def log_file=(file)
127
109
  @log_file = file
128
110
  self[WEBDRIVER_PREFS[:log_file]] = file
129
111
  end
130
112
 
131
- def add_extension(path, name = extension_name_for(path))
132
- WebDriver.logger.deprecate('Firefox::Profile#add_extension', 'Driver#install_addon',
133
- id: :firefox_profile)
134
- @extensions[name] = Extension.new(path)
135
- end
136
-
137
113
  def proxy=(proxy)
138
114
  raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy
139
115
 
@@ -169,15 +145,6 @@ module Selenium
169
145
  self["network.proxy.#{key}_port"] = Integer(port) if port
170
146
  end
171
147
 
172
- def install_extensions(directory)
173
- destination = File.join(directory, 'extensions')
174
-
175
- @extensions.each do |name, extension|
176
- WebDriver.logger.debug({extension: name}.inspect, id: :firefox_profile)
177
- extension.write_to(destination)
178
- end
179
- end
180
-
181
148
  def read_model_prefs
182
149
  return {} unless @model
183
150
 
@@ -194,10 +161,6 @@ module Selenium
194
161
  end
195
162
  end
196
163
 
197
- def extension_name_for(path)
198
- File.basename(path, File.extname(path))
199
- end
200
-
201
164
  def update_user_prefs_in(directory)
202
165
  path = File.join(directory, 'user.js')
203
166
  prefs = read_user_prefs(path)
File without changes
File without changes
File without changes
@@ -19,13 +19,11 @@
19
19
 
20
20
  require 'timeout'
21
21
  require 'socket'
22
- require 'rexml/document'
23
22
 
24
23
  module Selenium
25
24
  module WebDriver
26
25
  module Firefox
27
26
  autoload :Util, 'selenium/webdriver/firefox/util'
28
- autoload :Extension, 'selenium/webdriver/firefox/extension'
29
27
  autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
30
28
  autoload :Profile, 'selenium/webdriver/firefox/profile'
31
29
  autoload :Features, 'selenium/webdriver/firefox/features'
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -45,6 +45,16 @@ module Selenium
45
45
  end
46
46
  end
47
47
 
48
+ def install_web_extension(path)
49
+ result = web_extension.install(extension_data: web_extension_data(path))
50
+ WebExtension.new(result.extension)
51
+ end
52
+
53
+ def uninstall_web_extension(id)
54
+ web_extension.uninstall(extension: id)
55
+ nil
56
+ end
57
+
48
58
  def get(url)
49
59
  browsing_context.navigate(context: window_handle, url: url, wait: readiness_state)
50
60
  nil
@@ -91,6 +101,19 @@ module Selenium
91
101
  @browsing_context ||= BiDi::Protocol::BrowsingContext.new(connection)
92
102
  end
93
103
 
104
+ def web_extension
105
+ @web_extension ||= BiDi::Protocol::WebExtension.new(connection)
106
+ end
107
+
108
+ # A directory only resolves on the machine running the browser, so upload it to the remote
109
+ # end and reference the returned path; archives and base64 bytes travel inline.
110
+ def web_extension_data(path)
111
+ return web_extension.extension_base64_encoded(value: encode_extension(path)) unless File.directory?(path)
112
+
113
+ path = upload(path) if respond_to?(:upload)
114
+ web_extension.extension_path(path: path)
115
+ end
116
+
94
117
  def readiness_state
95
118
  READINESS_STATE.fetch(capabilities[:page_load_strategy] || 'normal')
96
119
  end
File without changes
@@ -593,14 +593,18 @@ module Selenium
593
593
  execute :click_fedcm_dialog_button, {}, {dialogButton: 'ConfirmIdpLoginContinue'}
594
594
  end
595
595
 
596
- def bidi
597
- msg = 'BiDi must be enabled by setting #web_socket_url to true in options class'
598
- raise(WebDriver::Error::WebDriverError, msg)
596
+ def bidi(*)
597
+ raise WebDriver::Error::WebDriverError,
598
+ 'BiDi must be enabled by setting #web_socket_url to true in options class'
599
599
  end
600
+ alias connection bidi
601
+ alias web_extension bidi
602
+ alias install_web_extension bidi
603
+ alias uninstall_web_extension bidi
604
+ private :web_extension
600
605
 
601
- def connection
602
- msg = 'BiDi must be enabled by setting #web_socket_url to true in options class'
603
- raise(WebDriver::Error::WebDriverError, msg)
606
+ def bidi?
607
+ !@bidi.nil?
604
608
  end
605
609
 
606
610
  def command_list
@@ -609,6 +613,16 @@ module Selenium
609
613
 
610
614
  private
611
615
 
616
+ def encode_extension(path)
617
+ if File.directory?(path)
618
+ Zipper.zip(path)
619
+ elsif File.file?(path)
620
+ File.open(path, 'rb') { |file| Base64.strict_encode64(file.read) }
621
+ else
622
+ path # already base64-encoded bytes
623
+ end
624
+ end
625
+
612
626
  #
613
627
  # executes a command on the remote server.
614
628
  #
File without changes
File without changes
@@ -42,20 +42,21 @@ module Selenium
42
42
  end
43
43
 
44
44
  def upload(local_file)
45
- unless File.file?(local_file)
46
- WebDriver.logger.error("File detector only works with files. #{local_file.inspect} isn`t a file!",
47
- id: :file_detector)
48
- raise Error::WebDriverError, "You are trying to upload something that isn't a file."
49
- end
50
-
51
- execute :upload_file, {}, {file: Zipper.zip_file(local_file)}
45
+ execute :upload_file, {}, {file: Zipper.zip_root(local_file)}
52
46
  end
53
47
 
54
48
  def upload_if_necessary(keys)
55
49
  local_files = keys.first&.split("\n")&.filter_map { |key| @file_detector.call(Array(key)) }
56
50
  return keys unless local_files&.any?
57
51
 
58
- keys = local_files.map { |local_file| upload(local_file) }
52
+ keys = local_files.map do |local_file|
53
+ unless File.file?(local_file)
54
+ WebDriver.logger.error("File detector only works with files. #{local_file.inspect} isn`t a file!",
55
+ id: :file_detector)
56
+ raise Error::WebDriverError, "You are trying to upload something that isn't a file."
57
+ end
58
+ upload(local_file)
59
+ end
59
60
  Array(keys.join("\n"))
60
61
  end
61
62
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.49.0'
22
+ VERSION = '4.50.0'
23
23
  end # WebDriver
24
24
  end # Selenium
File without changes
File without changes
@@ -51,7 +51,6 @@ Gem::Specification.new do |s|
51
51
 
52
52
  s.add_dependency 'base64', ['~> 0.2']
53
53
  s.add_dependency 'logger', ['~> 1.4']
54
- s.add_dependency 'rexml', ['~> 3.2', '>= 3.2.5']
55
54
  s.add_dependency 'rubyzip', ['>= 1.2.2', '< 4.0']
56
55
  s.add_dependency 'websocket', ['~> 1.0']
57
56
 
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.49.0
4
+ version: 4.50.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
8
8
  - Titus Fortner
9
9
  - Thomas Walpole
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2026-09-09 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: base64
@@ -40,26 +39,6 @@ dependencies:
40
39
  - - "~>"
41
40
  - !ruby/object:Gem::Version
42
41
  version: '1.4'
43
- - !ruby/object:Gem::Dependency
44
- name: rexml
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '3.2'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 3.2.5
53
- type: :runtime
54
- prerelease: false
55
- version_requirements: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '3.2'
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 3.2.5
63
42
  - !ruby/object:Gem::Dependency
64
43
  name: rubyzip
65
44
  requirement: !ruby/object:Gem::Requirement
@@ -303,11 +282,14 @@ files:
303
282
  - lib/selenium/webdriver/bidi/protocol/bluetooth.rb
304
283
  - lib/selenium/webdriver/bidi/protocol/browser.rb
305
284
  - lib/selenium/webdriver/bidi/protocol/browsing_context.rb
285
+ - lib/selenium/webdriver/bidi/protocol/digital_credentials.rb
306
286
  - lib/selenium/webdriver/bidi/protocol/domain.rb
307
287
  - lib/selenium/webdriver/bidi/protocol/emulation.rb
308
288
  - lib/selenium/webdriver/bidi/protocol/error_code.rb
309
289
  - lib/selenium/webdriver/bidi/protocol/input.rb
310
290
  - lib/selenium/webdriver/bidi/protocol/log.rb
291
+ - lib/selenium/webdriver/bidi/protocol/moz_debugging.rb
292
+ - lib/selenium/webdriver/bidi/protocol/moz_profiler.rb
311
293
  - lib/selenium/webdriver/bidi/protocol/network.rb
312
294
  - lib/selenium/webdriver/bidi/protocol/permissions.rb
313
295
  - lib/selenium/webdriver/bidi/protocol/script.rb
@@ -418,6 +400,7 @@ files:
418
400
  - lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb
419
401
  - lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb
420
402
  - lib/selenium/webdriver/common/wait.rb
403
+ - lib/selenium/webdriver/common/web_extension.rb
421
404
  - lib/selenium/webdriver/common/websocket_connection.rb
422
405
  - lib/selenium/webdriver/common/window.rb
423
406
  - lib/selenium/webdriver/common/zipper.rb
@@ -437,7 +420,6 @@ files:
437
420
  - lib/selenium/webdriver/edge/service.rb
438
421
  - lib/selenium/webdriver/firefox.rb
439
422
  - lib/selenium/webdriver/firefox/driver.rb
440
- - lib/selenium/webdriver/firefox/extension.rb
441
423
  - lib/selenium/webdriver/firefox/features.rb
442
424
  - lib/selenium/webdriver/firefox/options.rb
443
425
  - lib/selenium/webdriver/firefox/profile.rb
@@ -490,7 +472,6 @@ metadata:
490
472
  source_code_uri: https://github.com/SeleniumHQ/selenium/tree/trunk/rb
491
473
  rubygems_mfa_required: 'true'
492
474
  funding_uri: https://github.com/sponsors/SeleniumHQ
493
- post_install_message:
494
475
  rdoc_options: []
495
476
  require_paths:
496
477
  - lib
@@ -505,8 +486,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
505
486
  - !ruby/object:Gem::Version
506
487
  version: 1.3.1
507
488
  requirements: []
508
- rubygems_version: 3.5.22
509
- signing_key:
489
+ rubygems_version: 4.0.3
510
490
  specification_version: 4
511
491
  summary: Selenium is a browser automation tool for automated testing of webapps and
512
492
  more