selenium-webdriver 3.142.7 → 4.10.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 (186) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +611 -5
  3. data/Gemfile +5 -1
  4. data/LICENSE +1 -1
  5. data/NOTICE +2 -0
  6. data/README.md +4 -5
  7. data/bin/linux/selenium-manager +0 -0
  8. data/bin/macos/selenium-manager +0 -0
  9. data/bin/windows/selenium-manager.exe +0 -0
  10. data/lib/selenium/server.rb +94 -79
  11. data/lib/selenium/webdriver/atoms/findElements.js +121 -0
  12. data/lib/selenium/webdriver/atoms/getAttribute.js +100 -7
  13. data/lib/selenium/webdriver/atoms/isDisplayed.js +76 -78
  14. data/lib/selenium/webdriver/atoms/mutationListener.js +55 -0
  15. data/lib/selenium/webdriver/atoms.rb +2 -3
  16. data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
  17. data/lib/selenium/webdriver/bidi/browsing_context_info.rb +35 -0
  18. data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
  19. data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
  20. data/lib/selenium/webdriver/bidi/log/filter_by.rb +40 -0
  21. data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
  22. data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
  23. data/lib/selenium/webdriver/bidi/log_inspector.rb +143 -0
  24. data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
  25. data/lib/selenium/webdriver/bidi/session.rb +51 -0
  26. data/lib/selenium/webdriver/{common/keyboard.rb → bidi.rb} +21 -35
  27. data/lib/selenium/webdriver/chrome/driver.rb +9 -86
  28. data/lib/selenium/webdriver/chrome/features.rb +44 -0
  29. data/lib/selenium/webdriver/chrome/options.rb +9 -158
  30. data/lib/selenium/webdriver/chrome/profile.rb +3 -80
  31. data/lib/selenium/webdriver/chrome/service.rb +6 -33
  32. data/lib/selenium/webdriver/chrome.rb +5 -18
  33. data/lib/selenium/webdriver/chromium/driver.rb +61 -0
  34. data/lib/selenium/webdriver/{chrome/bridge.rb → chromium/features.rb} +51 -16
  35. data/lib/selenium/webdriver/chromium/options.rb +261 -0
  36. data/lib/selenium/webdriver/chromium/profile.rb +113 -0
  37. data/lib/selenium/webdriver/chromium/service.rb +42 -0
  38. data/lib/selenium/webdriver/chromium.rb +32 -0
  39. data/lib/selenium/webdriver/common/action_builder.rb +128 -238
  40. data/lib/selenium/webdriver/common/child_process.rb +124 -0
  41. data/lib/selenium/webdriver/common/driver.rb +94 -43
  42. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
  43. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +42 -0
  44. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
  45. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +49 -0
  46. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +87 -0
  47. data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_bidi.rb} +9 -9
  48. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +86 -0
  49. data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +36 -0
  50. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +42 -0
  51. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
  52. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +41 -0
  53. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +36 -0
  54. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -9
  55. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +143 -0
  56. data/lib/selenium/webdriver/common/driver_extensions/{has_remote_status.rb → has_logs.rb} +4 -4
  57. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +16 -1
  58. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +6 -27
  59. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +69 -0
  60. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -13
  61. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +75 -0
  62. data/lib/selenium/webdriver/common/driver_extensions/{rotatable.rb → prints_page.rb} +18 -20
  63. data/lib/selenium/webdriver/common/driver_finder.rb +47 -0
  64. data/lib/selenium/webdriver/common/element.rb +89 -29
  65. data/lib/selenium/webdriver/common/error.rb +53 -194
  66. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
  67. data/lib/selenium/webdriver/common/interactions/input_device.rb +10 -4
  68. data/lib/selenium/webdriver/common/interactions/interaction.rb +12 -22
  69. data/lib/selenium/webdriver/common/interactions/interactions.rb +24 -4
  70. data/lib/selenium/webdriver/common/interactions/key_actions.rb +10 -6
  71. data/lib/selenium/webdriver/common/interactions/key_input.rb +11 -27
  72. data/lib/selenium/webdriver/common/interactions/none_input.rb +10 -8
  73. data/lib/selenium/webdriver/common/interactions/pause.rb +49 -0
  74. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +71 -82
  75. data/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +45 -0
  76. data/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +63 -0
  77. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +15 -84
  78. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +60 -0
  79. data/lib/selenium/webdriver/common/interactions/pointer_press.rb +85 -0
  80. data/lib/selenium/webdriver/common/interactions/scroll.rb +59 -0
  81. data/lib/selenium/webdriver/common/interactions/scroll_origin.rb +48 -0
  82. data/lib/selenium/webdriver/common/interactions/typing_interaction.rb +54 -0
  83. data/lib/selenium/webdriver/common/interactions/wheel_actions.rb +113 -0
  84. data/lib/selenium/webdriver/common/{w3c_manager.rb → interactions/wheel_input.rb} +14 -17
  85. data/lib/selenium/webdriver/common/keys.rb +1 -0
  86. data/lib/selenium/webdriver/common/local_driver.rb +55 -0
  87. data/lib/selenium/webdriver/common/log_entry.rb +2 -2
  88. data/lib/selenium/webdriver/common/logger.rb +119 -19
  89. data/lib/selenium/webdriver/common/manager.rb +11 -38
  90. data/lib/selenium/webdriver/common/options.rb +169 -23
  91. data/lib/selenium/webdriver/common/platform.rb +14 -6
  92. data/lib/selenium/webdriver/common/port_prober.rb +4 -6
  93. data/lib/selenium/webdriver/common/profile_helper.rb +11 -9
  94. data/lib/selenium/webdriver/common/proxy.rb +8 -5
  95. data/lib/selenium/webdriver/common/search_context.rb +7 -9
  96. data/lib/selenium/webdriver/common/selenium_manager.rb +125 -0
  97. data/lib/selenium/webdriver/common/service.rb +26 -137
  98. data/lib/selenium/webdriver/common/service_manager.rb +144 -0
  99. data/lib/selenium/webdriver/common/shadow_root.rb +86 -0
  100. data/lib/selenium/webdriver/common/socket_lock.rb +4 -4
  101. data/lib/selenium/webdriver/common/socket_poller.rb +4 -4
  102. data/lib/selenium/webdriver/common/takes_screenshot.rb +65 -0
  103. data/lib/selenium/webdriver/common/target_locator.rb +31 -4
  104. data/lib/selenium/webdriver/common/timeouts.rb +31 -4
  105. data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +85 -0
  106. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +72 -0
  107. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +62 -0
  108. data/lib/selenium/webdriver/common/wait.rb +1 -1
  109. data/lib/selenium/webdriver/common/websocket_connection.rb +164 -0
  110. data/lib/selenium/webdriver/common/window.rb +6 -10
  111. data/lib/selenium/webdriver/common/zipper.rb +4 -10
  112. data/lib/selenium/webdriver/common.rb +42 -18
  113. data/lib/selenium/webdriver/devtools/console_event.rb +36 -0
  114. data/lib/selenium/webdriver/devtools/exception_event.rb +34 -0
  115. data/lib/selenium/webdriver/devtools/mutation_event.rb +35 -0
  116. data/lib/selenium/webdriver/devtools/network_interceptor.rb +173 -0
  117. data/lib/selenium/webdriver/devtools/pinned_script.rb +57 -0
  118. data/lib/selenium/webdriver/devtools/request.rb +65 -0
  119. data/lib/selenium/webdriver/devtools/response.rb +64 -0
  120. data/lib/selenium/webdriver/devtools.rb +96 -0
  121. data/lib/selenium/webdriver/edge/driver.rb +11 -27
  122. data/lib/selenium/webdriver/edge/features.rb +44 -0
  123. data/lib/selenium/webdriver/edge/options.rb +18 -43
  124. data/lib/selenium/webdriver/edge/profile.rb +33 -0
  125. data/lib/selenium/webdriver/edge/service.rb +7 -27
  126. data/lib/selenium/webdriver/edge.rb +11 -14
  127. data/lib/selenium/webdriver/firefox/driver.rb +38 -19
  128. data/lib/selenium/webdriver/firefox/extension.rb +8 -0
  129. data/lib/selenium/webdriver/firefox/features.rb +66 -0
  130. data/lib/selenium/webdriver/firefox/options.rb +77 -50
  131. data/lib/selenium/webdriver/firefox/profile.rb +17 -71
  132. data/lib/selenium/webdriver/firefox/service.rb +3 -13
  133. data/lib/selenium/webdriver/firefox/util.rb +1 -1
  134. data/lib/selenium/webdriver/firefox.rb +17 -28
  135. data/lib/selenium/webdriver/ie/driver.rb +5 -45
  136. data/lib/selenium/webdriver/ie/options.rb +15 -46
  137. data/lib/selenium/webdriver/ie/service.rb +11 -19
  138. data/lib/selenium/webdriver/ie.rb +3 -16
  139. data/lib/selenium/webdriver/remote/bridge/commands.rb +170 -0
  140. data/lib/selenium/webdriver/remote/bridge.rb +592 -87
  141. data/lib/selenium/webdriver/remote/capabilities.rb +182 -124
  142. data/lib/selenium/webdriver/remote/driver.rb +30 -15
  143. data/lib/selenium/webdriver/remote/http/common.rb +3 -8
  144. data/lib/selenium/webdriver/remote/http/curb.rb +1 -3
  145. data/lib/selenium/webdriver/remote/http/default.rb +23 -31
  146. data/lib/selenium/webdriver/remote/response.rb +17 -49
  147. data/lib/selenium/webdriver/remote.rb +14 -12
  148. data/lib/selenium/webdriver/safari/driver.rb +7 -29
  149. data/lib/selenium/webdriver/safari/{bridge.rb → features.rb} +3 -5
  150. data/lib/selenium/webdriver/safari/options.rb +12 -27
  151. data/lib/selenium/webdriver/safari/service.rb +13 -11
  152. data/lib/selenium/webdriver/safari.rb +14 -20
  153. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
  154. data/lib/selenium/webdriver/support/color.rb +24 -24
  155. data/lib/selenium/webdriver/support/event_firing_bridge.rb +4 -4
  156. data/lib/selenium/webdriver/support/guards/guard.rb +87 -0
  157. data/lib/selenium/webdriver/{firefox/marionette/bridge.rb → support/guards/guard_condition.rb} +21 -20
  158. data/lib/selenium/webdriver/support/guards.rb +95 -0
  159. data/lib/selenium/webdriver/support/relative_locator.rb +50 -0
  160. data/lib/selenium/webdriver/support/select.rb +6 -4
  161. data/lib/selenium/webdriver/support.rb +1 -0
  162. data/lib/selenium/webdriver/version.rb +1 -1
  163. data/lib/selenium/webdriver.rb +18 -17
  164. data/selenium-webdriver.gemspec +36 -18
  165. metadata +159 -89
  166. data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
  167. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -64
  168. data/lib/selenium/webdriver/common/mouse.rb +0 -89
  169. data/lib/selenium/webdriver/common/touch_action_builder.rb +0 -78
  170. data/lib/selenium/webdriver/common/touch_screen.rb +0 -123
  171. data/lib/selenium/webdriver/common/w3c_action_builder.rb +0 -212
  172. data/lib/selenium/webdriver/edge/bridge.rb +0 -76
  173. data/lib/selenium/webdriver/firefox/binary.rb +0 -187
  174. data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
  175. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  176. data/lib/selenium/webdriver/firefox/launcher.rb +0 -111
  177. data/lib/selenium/webdriver/firefox/legacy/driver.rb +0 -83
  178. data/lib/selenium/webdriver/firefox/marionette/driver.rb +0 -90
  179. data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
  180. data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
  181. data/lib/selenium/webdriver/remote/http/persistent.rb +0 -60
  182. data/lib/selenium/webdriver/remote/oss/bridge.rb +0 -594
  183. data/lib/selenium/webdriver/remote/oss/commands.rb +0 -223
  184. data/lib/selenium/webdriver/remote/w3c/bridge.rb +0 -605
  185. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +0 -310
  186. data/lib/selenium/webdriver/remote/w3c/commands.rb +0 -157
@@ -20,7 +20,10 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  class Element
23
+ ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf'
24
+
23
25
  include SearchContext
26
+ include TakesScreenshot
24
27
 
25
28
  #
26
29
  # Creates a new Element
@@ -40,10 +43,10 @@ module Selenium
40
43
  def ==(other)
41
44
  other.is_a?(self.class) && ref == other.ref
42
45
  end
43
- alias_method :eql?, :==
46
+ alias eql? ==
44
47
 
45
48
  def hash
46
- @id.hash ^ @bridge.hash
49
+ [@id, @bridge].hash
47
50
  end
48
51
 
49
52
  #
@@ -89,13 +92,18 @@ module Selenium
89
92
  end
90
93
 
91
94
  #
92
- # Get the value of a the given attribute of the element. Will return the current value, even if
93
- # this has been modified after the page has been loaded. More exactly, this method will return
94
- # the value of the given attribute, unless that attribute is not present, in which case the
95
- # value of the property with the same name is returned. If neither value is set, nil is
96
- # returned. The "style" attribute is converted as best can be to a text representation with a
97
- # trailing semi-colon. The following are deemed to be "boolean" attributes, and will
98
- # return either "true" or "false":
95
+ # This method attempts to provide the most likely desired current value for the attribute
96
+ # of the element, even when that desired value is actually a JavaScript property.
97
+ # It is implemented with a custom JavaScript atom. To obtain the exact value of the attribute or property,
98
+ # use #dom_attribute or #property methods respectively.
99
+ #
100
+ # More exactly, this method will return the value of the property with the given name,
101
+ # if it exists. If it does not, then the value of the attribute with the given name is returned.
102
+ # If neither exists, null is returned.
103
+ #
104
+ # The "style" attribute is converted as best can be to a text representation with a trailing semicolon.
105
+ #
106
+ # The following are deemed to be "boolean" attributes, and will return either "true" or "false":
99
107
  #
100
108
  # async, autofocus, autoplay, checked, compact, complete, controls, declare, defaultchecked,
101
109
  # defaultselected, defer, disabled, draggable, ended, formnovalidate, hidden, indeterminate,
@@ -103,29 +111,73 @@ module Selenium
103
111
  # nowrap, open, paused, pubdate, readonly, required, reversed, scoped, seamless, seeking,
104
112
  # selected, spellcheck, truespeed, willvalidate
105
113
  #
106
- # Finally, the following commonly mis-capitalized attribute/property names are evaluated as
107
- # expected:
114
+ # Finally, the following commonly mis-capitalized attribute/property names are evaluated as expected:
108
115
  #
109
- # class, readonly
116
+ # When the value of "class" is requested, the "className" property is returned.
117
+ # When the value of "readonly" is requested, the "readOnly" property is returned.
110
118
  #
111
119
  # @param [String] name attribute name
112
120
  # @return [String, nil] attribute value
113
121
  #
122
+ # @see #dom_attribute
123
+ # @see #property
124
+ #
114
125
 
115
126
  def attribute(name)
116
127
  bridge.element_attribute self, name
117
128
  end
118
129
 
119
130
  #
120
- # Get the value of a the given property with the same name of the element. If the value is not
121
- # set, nil is returned.
131
+ # Gets the value of a declared HTML attribute of this element.
132
+ #
133
+ # As opposed to the #attribute method, this method
134
+ # only returns attributes declared in the element's HTML markup.
135
+ #
136
+ # If the attribute is not set, nil is returned.
137
+ #
138
+ # @param [String] name attribute name
139
+ # @return [String, nil] attribute value
140
+ #
141
+ # @see #attribute
142
+ # @see #property
143
+ #
144
+
145
+ def dom_attribute(name)
146
+ bridge.element_dom_attribute @id, name
147
+ end
148
+
149
+ #
150
+ # Gets the value of a JavaScript property of this element
151
+ # This will return the current value,
152
+ # even if this has been modified after the page has been loaded.
153
+ # If the value is not set, nil is returned.
122
154
  #
123
155
  # @param [String] name property name
124
156
  # @return [String, nil] property value
125
157
  #
126
158
 
127
159
  def property(name)
128
- bridge.element_property self, name
160
+ bridge.element_property @id, name
161
+ end
162
+
163
+ #
164
+ # Gets the computed WAI-ARIA role of element
165
+ #
166
+ # @return [String]
167
+ #
168
+
169
+ def aria_role
170
+ bridge.element_aria_role @id
171
+ end
172
+
173
+ #
174
+ # Gets the computed WAI-ARIA label of element.
175
+ #
176
+ # @return [String]
177
+ #
178
+
179
+ def accessible_name
180
+ bridge.element_aria_label @id
129
181
  end
130
182
 
131
183
  #
@@ -155,7 +207,7 @@ module Selenium
155
207
  def send_keys(*args)
156
208
  bridge.send_keys_to_element @id, Keys.encode(args)
157
209
  end
158
- alias_method :send_key, :send_keys
210
+ alias send_key send_keys
159
211
 
160
212
  #
161
213
  # If this element is a text entry element, this will clear the value. Has no effect on other
@@ -223,7 +275,7 @@ module Selenium
223
275
  def css_value(prop)
224
276
  bridge.element_value_of_css_property @id, prop
225
277
  end
226
- alias_method :style, :css_value
278
+ alias style css_value
227
279
 
228
280
  #
229
281
  # Get the location of this element.
@@ -265,33 +317,42 @@ module Selenium
265
317
  bridge.element_size @id
266
318
  end
267
319
 
320
+ #
321
+ # Returns the shadow root of an element.
322
+ #
323
+ # @return [WebDriver::ShadowRoot]
324
+ #
325
+
326
+ def shadow_root
327
+ bridge.shadow_root @id
328
+ end
329
+
268
330
  #-------------------------------- sugar --------------------------------
269
331
 
270
332
  #
271
333
  # element.first(id: 'foo')
272
334
  #
273
335
 
274
- alias_method :first, :find_element
336
+ alias first find_element
275
337
 
276
338
  #
277
339
  # element.all(class: 'bar')
278
340
  #
279
341
 
280
- alias_method :all, :find_elements
342
+ alias all find_elements
281
343
 
282
344
  #
283
345
  # element['class'] or element[:class] #=> "someclass"
284
346
  #
285
- alias_method :[], :attribute
347
+ alias [] attribute
286
348
 
287
- #
288
- # for SearchContext and execute_script
289
349
  #
290
350
  # @api private
351
+ # @see SearchContext
291
352
  #
292
353
 
293
354
  def ref
294
- @id
355
+ [:element, @id]
295
356
  end
296
357
 
297
358
  #
@@ -312,12 +373,7 @@ module Selenium
312
373
  #
313
374
 
314
375
  def as_json(*)
315
- key = if bridge.dialect == :w3c
316
- 'element-6066-11e4-a52e-4f735466cecf'
317
- else
318
- 'ELEMENT'
319
- end
320
- @id.is_a?(Hash) ? @id : {key => @id}
376
+ @id.is_a?(Hash) ? @id : {ELEMENT_KEY => @id}
321
377
  end
322
378
 
323
379
  private
@@ -330,6 +386,10 @@ module Selenium
330
386
 
331
387
  tn == 'option' || (tn == 'input' && %w[radio checkbox].include?(type))
332
388
  end
389
+
390
+ def screenshot
391
+ bridge.element_screenshot(@id)
392
+ end
333
393
  end # Element
334
394
  end # WebDriver
335
395
  end # Selenium
@@ -19,191 +19,148 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Error # rubocop:disable Metrics/ModuleLength
23
-
22
+ module Error
24
23
  #
25
- # Returns exception from code (Integer - OSS, String - W3C).
26
- # @param [Integer, String, nil] code
24
+ # Returns exception from its string representation.
25
+ # @param [String, nil] error
27
26
  #
28
27
 
29
- def self.for_code(code)
30
- case code
31
- when nil, 0
32
- nil
33
- when Integer
34
- Object.const_get(ERRORS.fetch(code).to_s)
35
- when String
36
- klass_name = code.split(' ').map(&:capitalize).join.sub(/Error$/, '')
37
- const_get("#{klass_name}Error", false)
38
- end
39
- rescue KeyError, NameError
28
+ def self.for_error(error)
29
+ return if error.nil?
30
+
31
+ klass_name = error.split.map(&:capitalize).join.sub(/Error$/, '')
32
+ const_get("#{klass_name}Error", false)
33
+ rescue NameError
40
34
  WebDriverError
41
35
  end
42
36
 
43
- class WebDriverError < StandardError; end
37
+ SUPPORT_MSG = 'For documentation on this error, please visit:'
38
+ ERROR_URL = 'https://www.selenium.dev/documentation/webdriver/troubleshooting/errors'
44
39
 
45
- class IndexOutOfBoundsError < WebDriverError; end # 1
46
- class NoCollectionError < WebDriverError; end # 2
47
- class NoStringError < WebDriverError; end # 3
48
- class NoStringLengthError < WebDriverError; end # 4
49
- class NoStringWrapperError < WebDriverError; end # 5
50
- class NoSuchDriverError < WebDriverError; end # 6
40
+ class WebDriverError < StandardError; end
51
41
 
52
42
  #
53
43
  # An element could not be located on the page using the given search parameters.
54
44
  #
55
45
 
56
- class NoSuchElementError < WebDriverError; end # 7
46
+ class NoSuchElementError < WebDriverError
47
+ def initialize(msg = '')
48
+ super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#no-such-element-exception")
49
+ end
50
+ end
57
51
 
58
52
  #
59
53
  # A command to switch to a frame could not be satisfied because the frame could not be found.
60
54
  #
61
55
 
62
- class NoSuchFrameError < WebDriverError; end # 8
56
+ class NoSuchFrameError < WebDriverError; end
63
57
 
64
58
  #
65
59
  # A command could not be executed because the remote end is not aware of it.
66
60
  #
67
61
 
68
- class UnknownCommandError < WebDriverError; end # 9
62
+ class UnknownCommandError < WebDriverError; end
69
63
 
70
64
  #
71
65
  # A command failed because the referenced element is no longer attached to the DOM.
72
66
  #
73
67
 
74
- class StaleElementReferenceError < WebDriverError; end # 10
68
+ class StaleElementReferenceError < WebDriverError
69
+ def initialize(msg = '')
70
+ super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#stale-element-reference-exception")
71
+ end
72
+ end
75
73
 
76
74
  #
77
- # Raised to indicate that although an element is present on the DOM, it is not visible, and
78
- # so is not able to be interacted with.
75
+ # A command failed because the referenced shadow root is no longer attached to the DOM.
79
76
  #
80
77
 
81
- class ElementNotVisibleError < WebDriverError; end # 11
78
+ class DetachedShadowRootError < WebDriverError; end
82
79
 
83
80
  #
84
81
  # The target element is in an invalid state, rendering it impossible to interact with, for
85
82
  # example if you click a disabled element.
86
83
  #
87
84
 
88
- class InvalidElementStateError < WebDriverError; end # 12
85
+ class InvalidElementStateError < WebDriverError; end
89
86
 
90
87
  #
91
88
  # An unknown error occurred in the remote end while processing the command.
92
89
  #
93
90
 
94
- class UnknownError < WebDriverError; end # 13
95
- class ExpectedError < WebDriverError; end # 14
91
+ class UnknownError < WebDriverError; end
96
92
 
97
93
  #
98
- # An attempt was made to select an element that cannot be selected.
94
+ # An error occurred while executing JavaScript supplied by the user.
99
95
  #
100
96
 
101
- class ElementNotSelectableError < WebDriverError; end # 15
102
- class NoSuchDocumentError < WebDriverError; end # 16
97
+ class JavascriptError < WebDriverError; end
103
98
 
104
99
  #
105
- # An error occurred while executing JavaScript supplied by the user.
100
+ # An operation did not complete before its timeout expired.
106
101
  #
107
102
 
108
- class JavascriptError < WebDriverError; end # 17
109
- class NoScriptResultError < WebDriverError; end # 18
103
+ class TimeoutError < WebDriverError; end
110
104
 
111
105
  #
112
- # An error occurred while searching for an element by XPath.
106
+ # A command to switch to a window could not be satisfied because
107
+ # the window could not be found.
113
108
  #
114
109
 
115
- class XPathLookupError < WebDriverError; end # 19
116
- class NoSuchCollectionError < WebDriverError; end # 20
110
+ class NoSuchWindowError < WebDriverError; end
117
111
 
118
112
  #
119
- # An operation did not complete before its timeout expired.
113
+ # The element does not have a shadow root.
120
114
  #
121
115
 
122
- class TimeOutError < WebDriverError; end # 21
123
-
124
- class NullPointerError < WebDriverError; end # 22
125
- class NoSuchWindowError < WebDriverError; end # 23
116
+ class NoSuchShadowRootError < WebDriverError; end
126
117
 
127
118
  #
128
119
  # An illegal attempt was made to set a cookie under a different domain than the current page.
129
120
  #
130
121
 
131
- class InvalidCookieDomainError < WebDriverError; end # 24
122
+ class InvalidCookieDomainError < WebDriverError; end
132
123
 
133
124
  #
134
125
  # A command to set a cookie's value could not be satisfied.
135
126
  #
136
127
 
137
- class UnableToSetCookieError < WebDriverError; end # 25
138
-
139
- #
140
- # Raised when an alert dialog is present that has not been dealt with.
141
- #
142
- class UnhandledAlertError < WebDriverError; end # 26
128
+ class UnableToSetCookieError < WebDriverError; end
143
129
 
144
130
  #
145
131
  # An attempt was made to operate on a modal dialog when one was not open:
146
132
  #
147
- # * W3C dialect is NoSuchAlertError
148
- # * OSS dialect is NoAlertPresentError
149
- #
150
- # We want to allow clients to rescue NoSuchAlertError as a superclass for
151
- # dialect-agnostic implementation, so NoAlertPresentError should inherit from it.
152
- #
153
133
 
154
134
  class NoSuchAlertError < WebDriverError; end
155
- class NoAlertPresentError < NoSuchAlertError; end # 27
156
135
 
157
136
  #
158
137
  # A script did not complete before its timeout expired.
159
138
  #
160
139
 
161
- class ScriptTimeOutError < WebDriverError; end # 28
162
-
163
- #
164
- # The coordinates provided to an interactions operation are invalid.
165
- #
166
-
167
- class InvalidElementCoordinatesError < WebDriverError; end # 29
168
-
169
- #
170
- # Indicates that IME support is not available. This exception is rasied for every IME-related
171
- # method call if IME support is not available on the machine.
172
- #
173
-
174
- class IMENotAvailableError < WebDriverError; end # 30
175
-
176
- #
177
- # Indicates that activating an IME engine has failed.
178
- #
179
-
180
- class IMEEngineActivationFailedError < WebDriverError; end # 31
140
+ class ScriptTimeoutError < WebDriverError; end
181
141
 
182
142
  #
183
143
  # Argument was an invalid selector.
184
144
  #
185
145
 
186
- class InvalidSelectorError < WebDriverError; end # 32
146
+ class InvalidSelectorError < WebDriverError
147
+ def initialize(msg = '')
148
+ super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#invalid-selector-exception")
149
+ end
150
+ end
187
151
 
188
152
  #
189
153
  # A new session could not be created.
190
154
  #
191
155
 
192
- class SessionNotCreatedError < WebDriverError; end # 33
156
+ class SessionNotCreatedError < WebDriverError; end
193
157
 
194
158
  #
195
159
  # The target for mouse interaction is not in the browser's viewport and cannot be brought
196
160
  # into that viewport.
197
161
  #
198
162
 
199
- class MoveTargetOutOfBoundsError < WebDriverError; end # 34
200
-
201
- #
202
- # Indicates that the XPath selector is invalid
203
- #
204
-
205
- class InvalidXpathSelectorError < WebDriverError; end
206
- class InvalidXpathSelectorReturnTyperError < WebDriverError; end
163
+ class MoveTargetOutOfBoundsError < WebDriverError; end
207
164
 
208
165
  #
209
166
  # A command could not be completed because the element is not pointer or keyboard
@@ -271,113 +228,15 @@ module Selenium
271
228
 
272
229
  class UnsupportedOperationError < WebDriverError; end
273
230
 
274
- # Aliases for OSS dialect.
275
- ScriptTimeoutError = Class.new(ScriptTimeOutError)
276
- TimeoutError = Class.new(TimeOutError)
277
- NoAlertOpenError = Class.new(NoAlertPresentError)
278
-
279
- # Aliases for backwards compatibility.
280
- ObsoleteElementError = Class.new(StaleElementReferenceError)
281
- UnhandledError = Class.new(UnknownError)
282
- UnexpectedJavascriptError = Class.new(JavascriptError)
283
- ElementNotDisplayedError = Class.new(ElementNotVisibleError)
284
-
285
- #
286
- # @api private
287
- #
288
-
289
- ERRORS = {
290
- 1 => IndexOutOfBoundsError,
291
- 2 => NoCollectionError,
292
- 3 => NoStringError,
293
- 4 => NoStringLengthError,
294
- 5 => NoStringWrapperError,
295
- 6 => NoSuchDriverError,
296
- 7 => NoSuchElementError,
297
- 8 => NoSuchFrameError,
298
- 9 => UnknownCommandError,
299
- 10 => StaleElementReferenceError,
300
- 11 => ElementNotVisibleError,
301
- 12 => InvalidElementStateError,
302
- 13 => UnknownError,
303
- 14 => ExpectedError,
304
- 15 => ElementNotSelectableError,
305
- 16 => NoSuchDocumentError,
306
- 17 => JavascriptError,
307
- 18 => NoScriptResultError,
308
- 19 => XPathLookupError,
309
- 20 => NoSuchCollectionError,
310
- 21 => TimeOutError,
311
- 22 => NullPointerError,
312
- 23 => NoSuchWindowError,
313
- 24 => InvalidCookieDomainError,
314
- 25 => UnableToSetCookieError,
315
- 26 => UnhandledAlertError,
316
- 27 => NoAlertPresentError,
317
- 28 => ScriptTimeOutError,
318
- 29 => InvalidElementCoordinatesError,
319
- 30 => IMENotAvailableError,
320
- 31 => IMEEngineActivationFailedError,
321
- 32 => InvalidSelectorError,
322
- 33 => SessionNotCreatedError,
323
- 34 => MoveTargetOutOfBoundsError,
324
- # The following are W3C-specific errors,
325
- # they don't really need error codes, we just make them up!
326
- 51 => InvalidXpathSelectorError,
327
- 52 => InvalidXpathSelectorReturnTyperError,
328
- 60 => ElementNotInteractableError,
329
- 61 => InvalidArgumentError,
330
- 62 => NoSuchCookieError,
331
- 63 => UnableToCaptureScreenError
332
- }.freeze
333
-
334
- DEPRECATED_ERRORS = {
335
- IndexOutOfBoundsError: nil,
336
- NoCollectionError: nil,
337
- NoStringError: nil,
338
- NoStringLengthError: nil,
339
- NoStringWrapperError: nil,
340
- NoSuchDriverError: nil,
341
- ElementNotVisibleError: ElementNotInteractableError,
342
- InvalidElementStateError: ElementNotInteractableError,
343
- ElementNotSelectableError: ElementNotInteractableError,
344
- ExpectedError: nil,
345
- NoSuchDocumentError: nil,
346
- NoScriptResultError: nil,
347
- XPathLookupError: InvalidSelectorError,
348
- NoSuchCollectionError: nil,
349
- UnhandledAlertError: UnexpectedAlertOpenError,
350
- NoAlertPresentError: NoSuchAlertError,
351
- NoAlertOpenError: NoSuchAlertError,
352
- ScriptTimeOutError: ScriptTimeoutError,
353
- InvalidElementCoordinatesError: nil,
354
- IMENotAvailableError: nil,
355
- IMEEngineActivationFailedError: nil,
356
- InvalidXpathSelectorError: InvalidSelectorError,
357
- InvalidXpathSelectorReturnTyperError: InvalidSelectorError,
358
- TimeOutError: TimeoutError,
359
- ObsoleteElementError: StaleElementReferenceError,
360
- UnhandledError: UnknownError,
361
- UnexpectedJavascriptError: JavascriptError,
362
- ElementNotDisplayedError: ElementNotInteractableError
363
- }.freeze
364
-
365
- DEPRECATED_ERRORS.keys.each do |oss_error|
366
- remove_const oss_error
367
- end
231
+ #
232
+ # Indicates that driver was not specified and could not be located.
233
+ #
368
234
 
369
- def self.const_missing(const_name)
370
- super unless DEPRECATED_ERRORS.key?(const_name)
371
- if DEPRECATED_ERRORS[const_name]
372
- WebDriver.logger.deprecate("Selenium::WebDriver::Error::#{const_name}",
373
- "#{DEPRECATED_ERRORS[const_name]} (ensure the driver supports W3C WebDriver specification)")
374
- DEPRECATED_ERRORS[const_name]
375
- else
376
- WebDriver.logger.deprecate("Selenium::WebDriver::Error::#{const_name}")
377
- WebDriverError
235
+ class NoSuchDriverError < WebDriverError
236
+ def initialize(msg = '')
237
+ super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}/driver_location")
378
238
  end
379
239
  end
380
-
381
240
  end # Error
382
241
  end # WebDriver
383
242
  end # Selenium
@@ -26,8 +26,8 @@ module Selenium
26
26
  def key?(key)
27
27
  keys.include? key
28
28
  end
29
- alias_method :member?, :key?
30
- alias_method :has_key?, :key?
29
+ alias member? key?
30
+ alias has_key? key?
31
31
 
32
32
  def fetch(key)
33
33
  return self[key] if key? key
@@ -22,8 +22,15 @@ require 'securerandom'
22
22
  module Selenium
23
23
  module WebDriver
24
24
  module Interactions
25
+ #
26
+ # Superclass for the input device sources
27
+ # Manages Array of Interaction instances for the device
28
+ #
29
+ # @api private
30
+ #
31
+
25
32
  class InputDevice
26
- attr_reader :name, :actions
33
+ attr_reader :name, :actions, :type
27
34
 
28
35
  def initialize(name = nil)
29
36
  @name = name || SecureRandom.uuid
@@ -44,9 +51,8 @@ module Selenium
44
51
  add_action(Pause.new(self, duration))
45
52
  end
46
53
 
47
- def no_actions? # Determine if only pauses are present
48
- actions = @actions.reject { |action| action.type == Interaction::PAUSE }
49
- actions.empty?
54
+ def encode
55
+ {type: type, id: name, actions: @actions.map(&:encode)} unless @actions.empty?
50
56
  end
51
57
  end # InputDevice
52
58
  end # Interactions
@@ -20,34 +20,24 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Interactions
23
- class Interaction
24
- PAUSE = :pause
23
+ #
24
+ # Superclass for classes defining actions
25
+ # Do not initialize directly, only use subclass
26
+ #
27
+ # @api private
28
+ #
25
29
 
26
- attr_reader :source
30
+ class Interaction
31
+ attr_reader :type
27
32
 
28
33
  def initialize(source)
29
- raise TypeError, "#{source.type} is not a valid input type" unless Interactions::SOURCE_TYPES.include? source.type
30
-
31
- @source = source
34
+ assert_source(source)
32
35
  end
33
- end
34
36
 
35
- class Pause < Interaction
36
- def initialize(source, duration = nil)
37
- super(source)
38
- @duration = duration
37
+ def assert_source(_source)
38
+ raise NotImplementedError, 'subclass responsibility'
39
39
  end
40
-
41
- def type
42
- PAUSE
43
- end
44
-
45
- def encode
46
- output = {type: type}
47
- output[:duration] = (@duration * 1000).to_i if @duration
48
- output
49
- end
50
- end # Interaction
40
+ end
51
41
  end # Interactions
52
42
  end # WebDriver
53
43
  end # Selenium