selenium-webdriver 3.142.7 → 4.0.3
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.
- checksums.yaml +5 -5
- data/CHANGES +350 -5
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/NOTICE +2 -0
- data/README.md +4 -5
- data/lib/selenium/server.rb +69 -63
- data/lib/selenium/webdriver/atoms/findElements.js +122 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +100 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +76 -78
- data/lib/selenium/webdriver/atoms/mutationListener.js +55 -0
- data/lib/selenium/webdriver/chrome/driver.rb +26 -83
- data/lib/selenium/webdriver/chrome/{bridge.rb → features.rb} +50 -12
- data/lib/selenium/webdriver/chrome/options.rb +129 -58
- data/lib/selenium/webdriver/chrome/profile.rb +6 -3
- data/lib/selenium/webdriver/chrome/service.rb +8 -15
- data/lib/selenium/webdriver/chrome.rb +10 -9
- data/lib/selenium/webdriver/common/action_builder.rb +97 -249
- data/lib/selenium/webdriver/common/driver.rb +112 -23
- data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +43 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +89 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +77 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_cdp.rb} +10 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +45 -0
- data/lib/selenium/webdriver/{firefox/util.rb → common/driver_extensions/has_devtools.rb} +16 -19
- data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +38 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +144 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_logs.rb +30 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +17 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +6 -27
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +136 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +77 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +1 -0
- data/lib/selenium/webdriver/common/driver_extensions/{rotatable.rb → prints_page.rb} +18 -20
- data/lib/selenium/webdriver/common/element.rb +82 -22
- data/lib/selenium/webdriver/common/error.rb +32 -196
- data/lib/selenium/webdriver/common/interactions/interaction.rb +4 -1
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +5 -5
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +13 -13
- data/lib/selenium/webdriver/common/log_entry.rb +2 -2
- data/lib/selenium/webdriver/common/logger.rb +50 -15
- data/lib/selenium/webdriver/common/manager.rb +15 -15
- data/lib/selenium/webdriver/common/options.rb +154 -23
- data/lib/selenium/webdriver/common/platform.rb +6 -1
- data/lib/selenium/webdriver/common/port_prober.rb +4 -6
- data/lib/selenium/webdriver/common/profile_helper.rb +11 -9
- data/lib/selenium/webdriver/common/proxy.rb +6 -3
- data/lib/selenium/webdriver/common/search_context.rb +7 -3
- data/lib/selenium/webdriver/common/service.rb +17 -125
- data/lib/selenium/webdriver/common/service_manager.rb +151 -0
- data/lib/selenium/webdriver/common/shadow_root.rb +87 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
- data/lib/selenium/webdriver/common/socket_poller.rb +2 -2
- data/lib/selenium/webdriver/common/takes_screenshot.rb +66 -0
- data/lib/selenium/webdriver/common/target_locator.rb +32 -4
- data/lib/selenium/webdriver/common/timeouts.rb +31 -4
- data/lib/selenium/webdriver/common/wait.rb +1 -1
- data/lib/selenium/webdriver/common/window.rb +0 -4
- data/lib/selenium/webdriver/common/zipper.rb +1 -9
- data/lib/selenium/webdriver/common.rb +23 -17
- data/lib/selenium/webdriver/devtools/console_event.rb +38 -0
- data/lib/selenium/webdriver/devtools/exception_event.rb +36 -0
- data/lib/selenium/webdriver/devtools/mutation_event.rb +37 -0
- data/lib/selenium/webdriver/devtools/pinned_script.rb +59 -0
- data/lib/selenium/webdriver/devtools/request.rb +67 -0
- data/lib/selenium/webdriver/devtools/response.rb +66 -0
- data/lib/selenium/webdriver/devtools.rb +182 -0
- data/lib/selenium/webdriver/edge/driver.rb +7 -29
- data/lib/selenium/webdriver/edge/features.rb +44 -0
- data/lib/selenium/webdriver/edge/options.rb +11 -48
- data/lib/selenium/webdriver/{common/w3c_manager.rb → edge/profile.rb} +7 -19
- data/lib/selenium/webdriver/edge/service.rb +10 -26
- data/lib/selenium/webdriver/edge.rb +11 -14
- data/lib/selenium/webdriver/firefox/driver.rb +31 -19
- data/lib/selenium/webdriver/firefox/extension.rb +8 -0
- data/lib/selenium/webdriver/firefox/features.rb +66 -0
- data/lib/selenium/webdriver/firefox/options.rb +70 -49
- data/lib/selenium/webdriver/firefox/profile.rb +21 -71
- data/lib/selenium/webdriver/firefox/service.rb +5 -9
- data/lib/selenium/webdriver/firefox.rb +22 -20
- data/lib/selenium/webdriver/ie/driver.rb +1 -47
- data/lib/selenium/webdriver/ie/options.rb +13 -44
- data/lib/selenium/webdriver/ie/service.rb +13 -15
- data/lib/selenium/webdriver/ie.rb +8 -7
- data/lib/selenium/webdriver/remote/bridge.rb +558 -86
- data/lib/selenium/webdriver/remote/capabilities.rb +159 -123
- data/lib/selenium/webdriver/remote/commands.rb +163 -0
- data/lib/selenium/webdriver/remote/driver.rb +22 -12
- data/lib/selenium/webdriver/remote/http/common.rb +0 -5
- data/lib/selenium/webdriver/remote/http/default.rb +17 -20
- data/lib/selenium/webdriver/remote/http/persistent.rb +11 -6
- data/lib/selenium/webdriver/remote/response.rb +16 -47
- data/lib/selenium/webdriver/remote.rb +15 -13
- data/lib/selenium/webdriver/safari/driver.rb +3 -31
- data/lib/selenium/webdriver/safari/{bridge.rb → features.rb} +3 -3
- data/lib/selenium/webdriver/safari/options.rb +10 -29
- data/lib/selenium/webdriver/safari/service.rb +4 -8
- data/lib/selenium/webdriver/safari.rb +17 -9
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
- data/lib/selenium/webdriver/support/cdp/domain.rb.erb +63 -0
- data/lib/selenium/webdriver/support/cdp_client_generator.rb +108 -0
- data/lib/selenium/webdriver/support/color.rb +2 -2
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +4 -4
- data/lib/selenium/webdriver/support/guards/guard.rb +89 -0
- data/lib/selenium/webdriver/{firefox/marionette/bridge.rb → support/guards/guard_condition.rb} +22 -19
- data/lib/selenium/webdriver/support/guards.rb +95 -0
- data/lib/selenium/webdriver/support/relative_locator.rb +51 -0
- data/lib/selenium/webdriver/support/select.rb +3 -3
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +12 -12
- data/selenium-webdriver.gemspec +28 -12
- metadata +128 -69
- data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -64
- data/lib/selenium/webdriver/common/keyboard.rb +0 -70
- data/lib/selenium/webdriver/common/mouse.rb +0 -89
- data/lib/selenium/webdriver/common/touch_action_builder.rb +0 -78
- data/lib/selenium/webdriver/common/touch_screen.rb +0 -123
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +0 -212
- data/lib/selenium/webdriver/edge/bridge.rb +0 -76
- data/lib/selenium/webdriver/firefox/binary.rb +0 -187
- data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +0 -111
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +0 -83
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +0 -90
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/remote/oss/bridge.rb +0 -594
- data/lib/selenium/webdriver/remote/oss/commands.rb +0 -223
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +0 -605
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +0 -310
- data/lib/selenium/webdriver/remote/w3c/commands.rb +0 -157
|
@@ -19,191 +19,134 @@
|
|
|
19
19
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
|
-
module Error
|
|
22
|
+
module Error
|
|
23
23
|
|
|
24
24
|
#
|
|
25
|
-
# Returns exception from
|
|
26
|
-
# @param [
|
|
25
|
+
# Returns exception from its string representation.
|
|
26
|
+
# @param [String, nil] error
|
|
27
27
|
#
|
|
28
28
|
|
|
29
|
-
def self.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
29
|
+
def self.for_error(error)
|
|
30
|
+
return if error.nil?
|
|
31
|
+
|
|
32
|
+
klass_name = error.split(' ').map(&:capitalize).join.sub(/Error$/, '')
|
|
33
|
+
const_get("#{klass_name}Error", false)
|
|
34
|
+
rescue NameError
|
|
40
35
|
WebDriverError
|
|
41
36
|
end
|
|
42
37
|
|
|
43
38
|
class WebDriverError < StandardError; end
|
|
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
|
|
51
|
-
|
|
52
40
|
#
|
|
53
41
|
# An element could not be located on the page using the given search parameters.
|
|
54
42
|
#
|
|
55
43
|
|
|
56
|
-
class NoSuchElementError < WebDriverError; end
|
|
44
|
+
class NoSuchElementError < WebDriverError; end
|
|
57
45
|
|
|
58
46
|
#
|
|
59
47
|
# A command to switch to a frame could not be satisfied because the frame could not be found.
|
|
60
48
|
#
|
|
61
49
|
|
|
62
|
-
class NoSuchFrameError < WebDriverError; end
|
|
50
|
+
class NoSuchFrameError < WebDriverError; end
|
|
63
51
|
|
|
64
52
|
#
|
|
65
53
|
# A command could not be executed because the remote end is not aware of it.
|
|
66
54
|
#
|
|
67
55
|
|
|
68
|
-
class UnknownCommandError < WebDriverError; end
|
|
56
|
+
class UnknownCommandError < WebDriverError; end
|
|
69
57
|
|
|
70
58
|
#
|
|
71
59
|
# A command failed because the referenced element is no longer attached to the DOM.
|
|
72
60
|
#
|
|
73
61
|
|
|
74
|
-
class StaleElementReferenceError < WebDriverError; end
|
|
62
|
+
class StaleElementReferenceError < WebDriverError; end
|
|
75
63
|
|
|
76
64
|
#
|
|
77
|
-
#
|
|
78
|
-
# so is not able to be interacted with.
|
|
65
|
+
# A command failed because the referenced shadow root is no longer attached to the DOM.
|
|
79
66
|
#
|
|
80
67
|
|
|
81
|
-
class
|
|
68
|
+
class DetachedShadowRootError < WebDriverError; end
|
|
82
69
|
|
|
83
70
|
#
|
|
84
71
|
# The target element is in an invalid state, rendering it impossible to interact with, for
|
|
85
72
|
# example if you click a disabled element.
|
|
86
73
|
#
|
|
87
74
|
|
|
88
|
-
class InvalidElementStateError < WebDriverError; end
|
|
75
|
+
class InvalidElementStateError < WebDriverError; end
|
|
89
76
|
|
|
90
77
|
#
|
|
91
78
|
# An unknown error occurred in the remote end while processing the command.
|
|
92
79
|
#
|
|
93
80
|
|
|
94
|
-
class UnknownError < WebDriverError; end
|
|
95
|
-
class ExpectedError < WebDriverError; end # 14
|
|
81
|
+
class UnknownError < WebDriverError; end
|
|
96
82
|
|
|
97
83
|
#
|
|
98
|
-
# An
|
|
84
|
+
# An error occurred while executing JavaScript supplied by the user.
|
|
99
85
|
#
|
|
100
86
|
|
|
101
|
-
class
|
|
102
|
-
class NoSuchDocumentError < WebDriverError; end # 16
|
|
87
|
+
class JavascriptError < WebDriverError; end
|
|
103
88
|
|
|
104
89
|
#
|
|
105
|
-
# An
|
|
90
|
+
# An operation did not complete before its timeout expired.
|
|
106
91
|
#
|
|
107
92
|
|
|
108
|
-
class
|
|
109
|
-
class NoScriptResultError < WebDriverError; end # 18
|
|
93
|
+
class TimeoutError < WebDriverError; end
|
|
110
94
|
|
|
111
95
|
#
|
|
112
|
-
#
|
|
96
|
+
# A command to switch to a window could not be satisfied because
|
|
97
|
+
# the window could not be found.
|
|
113
98
|
#
|
|
114
99
|
|
|
115
|
-
class
|
|
116
|
-
class NoSuchCollectionError < WebDriverError; end # 20
|
|
100
|
+
class NoSuchWindowError < WebDriverError; end
|
|
117
101
|
|
|
118
102
|
#
|
|
119
|
-
#
|
|
103
|
+
# The element does not have a shadow root.
|
|
120
104
|
#
|
|
121
105
|
|
|
122
|
-
class
|
|
123
|
-
|
|
124
|
-
class NullPointerError < WebDriverError; end # 22
|
|
125
|
-
class NoSuchWindowError < WebDriverError; end # 23
|
|
106
|
+
class NoSuchShadowRootError < WebDriverError; end
|
|
126
107
|
|
|
127
108
|
#
|
|
128
109
|
# An illegal attempt was made to set a cookie under a different domain than the current page.
|
|
129
110
|
#
|
|
130
111
|
|
|
131
|
-
class InvalidCookieDomainError < WebDriverError; end
|
|
112
|
+
class InvalidCookieDomainError < WebDriverError; end
|
|
132
113
|
|
|
133
114
|
#
|
|
134
115
|
# A command to set a cookie's value could not be satisfied.
|
|
135
116
|
#
|
|
136
117
|
|
|
137
|
-
class UnableToSetCookieError < WebDriverError; end
|
|
138
|
-
|
|
139
|
-
#
|
|
140
|
-
# Raised when an alert dialog is present that has not been dealt with.
|
|
141
|
-
#
|
|
142
|
-
class UnhandledAlertError < WebDriverError; end # 26
|
|
118
|
+
class UnableToSetCookieError < WebDriverError; end
|
|
143
119
|
|
|
144
120
|
#
|
|
145
121
|
# An attempt was made to operate on a modal dialog when one was not open:
|
|
146
122
|
#
|
|
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
123
|
|
|
154
124
|
class NoSuchAlertError < WebDriverError; end
|
|
155
|
-
class NoAlertPresentError < NoSuchAlertError; end # 27
|
|
156
125
|
|
|
157
126
|
#
|
|
158
127
|
# A script did not complete before its timeout expired.
|
|
159
128
|
#
|
|
160
129
|
|
|
161
|
-
class
|
|
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
|
|
130
|
+
class ScriptTimeoutError < WebDriverError; end
|
|
181
131
|
|
|
182
132
|
#
|
|
183
133
|
# Argument was an invalid selector.
|
|
184
134
|
#
|
|
185
135
|
|
|
186
|
-
class InvalidSelectorError < WebDriverError; end
|
|
136
|
+
class InvalidSelectorError < WebDriverError; end
|
|
187
137
|
|
|
188
138
|
#
|
|
189
139
|
# A new session could not be created.
|
|
190
140
|
#
|
|
191
141
|
|
|
192
|
-
class SessionNotCreatedError < WebDriverError; end
|
|
142
|
+
class SessionNotCreatedError < WebDriverError; end
|
|
193
143
|
|
|
194
144
|
#
|
|
195
145
|
# The target for mouse interaction is not in the browser's viewport and cannot be brought
|
|
196
146
|
# into that viewport.
|
|
197
147
|
#
|
|
198
148
|
|
|
199
|
-
class MoveTargetOutOfBoundsError < WebDriverError; end
|
|
200
|
-
|
|
201
|
-
#
|
|
202
|
-
# Indicates that the XPath selector is invalid
|
|
203
|
-
#
|
|
204
|
-
|
|
205
|
-
class InvalidXpathSelectorError < WebDriverError; end
|
|
206
|
-
class InvalidXpathSelectorReturnTyperError < WebDriverError; end
|
|
149
|
+
class MoveTargetOutOfBoundsError < WebDriverError; end
|
|
207
150
|
|
|
208
151
|
#
|
|
209
152
|
# A command could not be completed because the element is not pointer or keyboard
|
|
@@ -271,113 +214,6 @@ module Selenium
|
|
|
271
214
|
|
|
272
215
|
class UnsupportedOperationError < WebDriverError; end
|
|
273
216
|
|
|
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
|
|
368
|
-
|
|
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
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
|
|
381
217
|
end # Error
|
|
382
218
|
end # WebDriver
|
|
383
219
|
end # Selenium
|
|
@@ -26,7 +26,10 @@ module Selenium
|
|
|
26
26
|
attr_reader :source
|
|
27
27
|
|
|
28
28
|
def initialize(source)
|
|
29
|
-
|
|
29
|
+
unless Interactions::SOURCE_TYPES.include? source.type
|
|
30
|
+
raise TypeError,
|
|
31
|
+
"#{source.type} is not a valid input type"
|
|
32
|
+
end
|
|
30
33
|
|
|
31
34
|
@source = source
|
|
32
35
|
end
|
|
@@ -22,7 +22,7 @@ module Selenium
|
|
|
22
22
|
module KeyActions
|
|
23
23
|
#
|
|
24
24
|
# Performs a key press. Does not release the key - subsequent interactions may assume it's kept pressed.
|
|
25
|
-
# Note that the key is never released implicitly - either
|
|
25
|
+
# Note that the key is never released implicitly - either ActionBuilder#key_up(key) or ActionBuilder#release_actions
|
|
26
26
|
# must be called to release the key.
|
|
27
27
|
#
|
|
28
28
|
# @example Press a key
|
|
@@ -41,7 +41,7 @@ module Selenium
|
|
|
41
41
|
# @param [Element] element An optional element to move to first
|
|
42
42
|
# @param [Symbol, String] key The key to press
|
|
43
43
|
# @param [Symbol, String] device Optional name of the KeyInput device to press the key on
|
|
44
|
-
# @return [
|
|
44
|
+
# @return [ActionBuilder] A self reference
|
|
45
45
|
#
|
|
46
46
|
|
|
47
47
|
def key_down(*args, device: nil)
|
|
@@ -68,7 +68,7 @@ module Selenium
|
|
|
68
68
|
# @param [Element] element An optional element to move to first
|
|
69
69
|
# @param [Symbol, String] key The key to release
|
|
70
70
|
# @param [Symbol, String] device Optional name of the KeyInput device to release the key on
|
|
71
|
-
# @return [
|
|
71
|
+
# @return [ActionBuilder] A self reference
|
|
72
72
|
#
|
|
73
73
|
|
|
74
74
|
def key_up(*args, device: nil)
|
|
@@ -98,7 +98,7 @@ module Selenium
|
|
|
98
98
|
# @param [Element] element An optional element to move to first
|
|
99
99
|
# @param [Array, Symbol, String] keys The key(s) to press and release
|
|
100
100
|
# @param [Symbol, String] device Optional name of the KeyInput device to press and release the keys on
|
|
101
|
-
# @return [
|
|
101
|
+
# @return [ActionBuilder] A self reference
|
|
102
102
|
#
|
|
103
103
|
|
|
104
104
|
def send_keys(*args, device: nil)
|
|
@@ -130,7 +130,7 @@ module Selenium
|
|
|
130
130
|
# @option args [Symbol, String] key The key to perform the action with
|
|
131
131
|
# @param [Symbol] action The name of the key action to perform
|
|
132
132
|
# @param [Symbol, String] device optional name of the KeyInput device to press the key on
|
|
133
|
-
# @return [
|
|
133
|
+
# @return [ActionBuilder] A self reference
|
|
134
134
|
#
|
|
135
135
|
|
|
136
136
|
def key_action(*args, action: nil, device: nil)
|
|
@@ -42,7 +42,7 @@ module Selenium
|
|
|
42
42
|
# @param [Selenium::WebDriver::Interactions::PointerPress::BUTTONS] button the button to press.
|
|
43
43
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
44
44
|
# that will be pressed
|
|
45
|
-
# @return [
|
|
45
|
+
# @return [ActionBuilder] A self reference.
|
|
46
46
|
#
|
|
47
47
|
|
|
48
48
|
def pointer_down(button, device: nil)
|
|
@@ -59,7 +59,7 @@ module Selenium
|
|
|
59
59
|
# @param [Selenium::WebDriver::Interactions::PointerPress::BUTTONS] button the button to release.
|
|
60
60
|
# @param [Symbol || String] device optional name of the PointerInput device with the button that will
|
|
61
61
|
# be released
|
|
62
|
-
# @return [
|
|
62
|
+
# @return [ActionBuilder] A self reference.
|
|
63
63
|
#
|
|
64
64
|
|
|
65
65
|
def pointer_up(button, device: nil)
|
|
@@ -71,7 +71,7 @@ module Selenium
|
|
|
71
71
|
# view and its location is calculated using getBoundingClientRect. Then the
|
|
72
72
|
# mouse is moved to optional offset coordinates from the element.
|
|
73
73
|
#
|
|
74
|
-
# This is adapted to be backward compatible from non-
|
|
74
|
+
# This is adapted to be backward compatible from non- actions. calculates offset from the center point
|
|
75
75
|
# of the element
|
|
76
76
|
#
|
|
77
77
|
# Note that when using offsets, both coordinates need to be passed.
|
|
@@ -92,7 +92,7 @@ module Selenium
|
|
|
92
92
|
# @param [Integer] down_by Optional offset from the top-left corner. A negative value means
|
|
93
93
|
# coordinates above the element.
|
|
94
94
|
# @param [Symbol || String] device optional name of the PointerInput device to move.
|
|
95
|
-
# @return [
|
|
95
|
+
# @return [ActionBuilder] A self reference.
|
|
96
96
|
#
|
|
97
97
|
|
|
98
98
|
def move_to(element, right_by = nil, down_by = nil, device: nil)
|
|
@@ -129,7 +129,7 @@ module Selenium
|
|
|
129
129
|
# @param [Integer] right_by horizontal offset. A negative value means moving the mouse left.
|
|
130
130
|
# @param [Integer] down_by vertical offset. A negative value means moving the mouse up.
|
|
131
131
|
# @param [Symbol || String] device optional name of the PointerInput device to move
|
|
132
|
-
# @return [
|
|
132
|
+
# @return [ActionBuilder] A self reference.
|
|
133
133
|
# @raise [MoveTargetOutOfBoundsError] if the provided offset is outside the document's boundaries.
|
|
134
134
|
#
|
|
135
135
|
|
|
@@ -156,7 +156,7 @@ module Selenium
|
|
|
156
156
|
# @param [Integer] x horizontal position. Equivalent to a css 'left' value.
|
|
157
157
|
# @param [Integer] y vertical position. Equivalent to a css 'top' value.
|
|
158
158
|
# @param [Symbol || String] device optional name of the PointerInput device to move
|
|
159
|
-
# @return [
|
|
159
|
+
# @return [ActionBuilder] A self reference.
|
|
160
160
|
# @raise [MoveTargetOutOfBoundsError] if the provided x or y value is outside the document's boundaries.
|
|
161
161
|
#
|
|
162
162
|
|
|
@@ -183,7 +183,7 @@ module Selenium
|
|
|
183
183
|
#
|
|
184
184
|
# @param [Selenium::WebDriver::Element] element the element to move to and click.
|
|
185
185
|
# @param [Symbol || String] device optional name of the PointerInput device to click with
|
|
186
|
-
# @return [
|
|
186
|
+
# @return [ActionBuilder] A self reference.
|
|
187
187
|
#
|
|
188
188
|
|
|
189
189
|
def click_and_hold(element = nil, device: nil)
|
|
@@ -202,7 +202,7 @@ module Selenium
|
|
|
202
202
|
#
|
|
203
203
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
204
204
|
# that will be released
|
|
205
|
-
# @return [
|
|
205
|
+
# @return [ActionBuilder] A self reference.
|
|
206
206
|
#
|
|
207
207
|
|
|
208
208
|
def release(device: nil)
|
|
@@ -229,7 +229,7 @@ module Selenium
|
|
|
229
229
|
# @param [Selenium::WebDriver::Element] element An optional element to click.
|
|
230
230
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
231
231
|
# that will be clicked
|
|
232
|
-
# @return [
|
|
232
|
+
# @return [ActionBuilder] A self reference.
|
|
233
233
|
#
|
|
234
234
|
|
|
235
235
|
def click(element = nil, device: nil)
|
|
@@ -258,7 +258,7 @@ module Selenium
|
|
|
258
258
|
# @param [Selenium::WebDriver::Element] element An optional element to move to.
|
|
259
259
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
260
260
|
# that will be double-clicked
|
|
261
|
-
# @return [
|
|
261
|
+
# @return [ActionBuilder] A self reference.
|
|
262
262
|
#
|
|
263
263
|
|
|
264
264
|
def double_click(element = nil, device: nil)
|
|
@@ -286,7 +286,7 @@ module Selenium
|
|
|
286
286
|
# @param [Selenium::WebDriver::Element] element An element to context click.
|
|
287
287
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
288
288
|
# that will be context-clicked
|
|
289
|
-
# @return [
|
|
289
|
+
# @return [ActionBuilder] A self reference.
|
|
290
290
|
#
|
|
291
291
|
|
|
292
292
|
def context_click(element = nil, device: nil)
|
|
@@ -312,7 +312,7 @@ module Selenium
|
|
|
312
312
|
# mouse at.
|
|
313
313
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
314
314
|
# that will perform the drag and drop
|
|
315
|
-
# @return [
|
|
315
|
+
# @return [ActionBuilder] A self reference.
|
|
316
316
|
#
|
|
317
317
|
|
|
318
318
|
def drag_and_drop(source, target, device: nil)
|
|
@@ -336,7 +336,7 @@ module Selenium
|
|
|
336
336
|
# @param [Integer] down_by vertical move offset.
|
|
337
337
|
# @param [Symbol || String] device optional name of the PointerInput device with the button
|
|
338
338
|
# that will perform the drag and drop
|
|
339
|
-
# @return [
|
|
339
|
+
# @return [ActionBuilder] A self reference.
|
|
340
340
|
#
|
|
341
341
|
|
|
342
342
|
def drag_and_drop_by(source, right_by, down_by, device: nil)
|
|
@@ -30,14 +30,14 @@ module Selenium
|
|
|
30
30
|
|
|
31
31
|
def as_json(*)
|
|
32
32
|
{
|
|
33
|
-
'level' => level,
|
|
34
33
|
'timestamp' => timestamp,
|
|
34
|
+
'level' => level,
|
|
35
35
|
'message' => message
|
|
36
36
|
}
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def to_s
|
|
40
|
-
"#{
|
|
40
|
+
"#{time} #{level}: #{message}"
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def time
|
|
@@ -40,13 +40,17 @@ module Selenium
|
|
|
40
40
|
:close,
|
|
41
41
|
:debug, :debug?,
|
|
42
42
|
:info, :info?,
|
|
43
|
-
:warn
|
|
43
|
+
:warn?,
|
|
44
44
|
:error, :error?,
|
|
45
45
|
:fatal, :fatal?,
|
|
46
46
|
:level, :level=
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
#
|
|
49
|
+
# @param [String] progname Allow child projects to use Selenium's Logger pattern
|
|
50
|
+
#
|
|
51
|
+
def initialize(progname = 'Selenium')
|
|
52
|
+
@logger = create_logger(progname)
|
|
53
|
+
@ignored = []
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
#
|
|
@@ -73,28 +77,63 @@ module Selenium
|
|
|
73
77
|
@logger.instance_variable_get(:@logdev).dev
|
|
74
78
|
end
|
|
75
79
|
|
|
80
|
+
#
|
|
81
|
+
# Will not log the provided ID.
|
|
82
|
+
#
|
|
83
|
+
# @param [Array, Symbol] id
|
|
84
|
+
#
|
|
85
|
+
def ignore(id)
|
|
86
|
+
Array(id).each { |ignore| @ignored << ignore }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Overrides default #warn to skip ignored messages by provided id
|
|
91
|
+
#
|
|
92
|
+
# @param [String] message
|
|
93
|
+
# @param [Symbol, Array<Sybmol>] id
|
|
94
|
+
# @yield see #deprecate
|
|
95
|
+
#
|
|
96
|
+
def warn(message, id: [])
|
|
97
|
+
id = Array(id)
|
|
98
|
+
return if (@ignored & id).any?
|
|
99
|
+
|
|
100
|
+
msg = id.empty? ? message : "[#{id.map(&:inspect).join(', ')}] #{message} "
|
|
101
|
+
msg += " #{yield}" if block_given?
|
|
102
|
+
|
|
103
|
+
@logger.warn { msg }
|
|
104
|
+
end
|
|
105
|
+
|
|
76
106
|
#
|
|
77
107
|
# Marks code as deprecated with/without replacement.
|
|
78
108
|
#
|
|
79
109
|
# @param [String] old
|
|
80
110
|
# @param [String, nil] new
|
|
111
|
+
# @param [Symbol, Array<Symbol>] id
|
|
112
|
+
# @param [String] reference
|
|
113
|
+
# @yield appends additional message to end of provided template
|
|
81
114
|
#
|
|
82
|
-
def deprecate(old, new = nil)
|
|
83
|
-
|
|
115
|
+
def deprecate(old, new = nil, id: [], reference: '', &block)
|
|
116
|
+
id = Array(id)
|
|
117
|
+
return if @ignored.include?(:deprecations) || (@ignored & id).any?
|
|
118
|
+
|
|
119
|
+
ids = id.empty? ? '' : "[#{id.map(&:inspect).join(', ')}] "
|
|
120
|
+
|
|
121
|
+
message = +"[DEPRECATION] #{ids}#{old} is deprecated"
|
|
84
122
|
message << if new
|
|
85
123
|
". Use #{new} instead."
|
|
86
124
|
else
|
|
87
|
-
' and will be removed in
|
|
125
|
+
' and will be removed in a future release.'
|
|
88
126
|
end
|
|
127
|
+
message << " See explanation for this deprecation: #{reference}." unless reference.empty?
|
|
89
128
|
|
|
90
|
-
warn message
|
|
129
|
+
warn message, &block
|
|
91
130
|
end
|
|
92
131
|
|
|
93
132
|
private
|
|
94
133
|
|
|
95
|
-
def create_logger(
|
|
96
|
-
logger = ::Logger.new(
|
|
97
|
-
logger.progname =
|
|
134
|
+
def create_logger(name)
|
|
135
|
+
logger = ::Logger.new($stdout)
|
|
136
|
+
logger.progname = name
|
|
98
137
|
logger.level = default_level
|
|
99
138
|
logger.formatter = proc do |severity, time, progname, msg|
|
|
100
139
|
"#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
|
|
@@ -104,11 +143,7 @@ module Selenium
|
|
|
104
143
|
end
|
|
105
144
|
|
|
106
145
|
def default_level
|
|
107
|
-
|
|
108
|
-
:debug
|
|
109
|
-
else
|
|
110
|
-
:warn
|
|
111
|
-
end
|
|
146
|
+
$DEBUG || ENV.key?('DEBUG') ? :debug : :warn
|
|
112
147
|
end
|
|
113
148
|
end # Logger
|
|
114
149
|
end # WebDriver
|