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.
- checksums.yaml +5 -5
- data/CHANGES +611 -5
- data/Gemfile +5 -1
- data/LICENSE +1 -1
- data/NOTICE +2 -0
- data/README.md +4 -5
- data/bin/linux/selenium-manager +0 -0
- data/bin/macos/selenium-manager +0 -0
- data/bin/windows/selenium-manager.exe +0 -0
- data/lib/selenium/server.rb +94 -79
- data/lib/selenium/webdriver/atoms/findElements.js +121 -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/atoms.rb +2 -3
- data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
- data/lib/selenium/webdriver/bidi/browsing_context_info.rb +35 -0
- data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
- data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
- data/lib/selenium/webdriver/bidi/log/filter_by.rb +40 -0
- data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
- data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
- data/lib/selenium/webdriver/bidi/log_inspector.rb +143 -0
- data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
- data/lib/selenium/webdriver/bidi/session.rb +51 -0
- data/lib/selenium/webdriver/{common/keyboard.rb → bidi.rb} +21 -35
- data/lib/selenium/webdriver/chrome/driver.rb +9 -86
- data/lib/selenium/webdriver/chrome/features.rb +44 -0
- data/lib/selenium/webdriver/chrome/options.rb +9 -158
- data/lib/selenium/webdriver/chrome/profile.rb +3 -80
- data/lib/selenium/webdriver/chrome/service.rb +6 -33
- data/lib/selenium/webdriver/chrome.rb +5 -18
- data/lib/selenium/webdriver/chromium/driver.rb +61 -0
- data/lib/selenium/webdriver/{chrome/bridge.rb → chromium/features.rb} +51 -16
- data/lib/selenium/webdriver/chromium/options.rb +261 -0
- data/lib/selenium/webdriver/chromium/profile.rb +113 -0
- data/lib/selenium/webdriver/chromium/service.rb +42 -0
- data/lib/selenium/webdriver/chromium.rb +32 -0
- data/lib/selenium/webdriver/common/action_builder.rb +128 -238
- data/lib/selenium/webdriver/common/child_process.rb +124 -0
- data/lib/selenium/webdriver/common/driver.rb +94 -43
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +49 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +87 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_bidi.rb} +9 -9
- data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +86 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +36 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +41 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +36 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -9
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +143 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_remote_status.rb → has_logs.rb} +4 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +16 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +6 -27
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +69 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -13
- data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +75 -0
- data/lib/selenium/webdriver/common/driver_extensions/{rotatable.rb → prints_page.rb} +18 -20
- data/lib/selenium/webdriver/common/driver_finder.rb +47 -0
- data/lib/selenium/webdriver/common/element.rb +89 -29
- data/lib/selenium/webdriver/common/error.rb +53 -194
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
- data/lib/selenium/webdriver/common/interactions/input_device.rb +10 -4
- data/lib/selenium/webdriver/common/interactions/interaction.rb +12 -22
- data/lib/selenium/webdriver/common/interactions/interactions.rb +24 -4
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +10 -6
- data/lib/selenium/webdriver/common/interactions/key_input.rb +11 -27
- data/lib/selenium/webdriver/common/interactions/none_input.rb +10 -8
- data/lib/selenium/webdriver/common/interactions/pause.rb +49 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +71 -82
- data/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +45 -0
- data/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +63 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +15 -84
- data/lib/selenium/webdriver/common/interactions/pointer_move.rb +60 -0
- data/lib/selenium/webdriver/common/interactions/pointer_press.rb +85 -0
- data/lib/selenium/webdriver/common/interactions/scroll.rb +59 -0
- data/lib/selenium/webdriver/common/interactions/scroll_origin.rb +48 -0
- data/lib/selenium/webdriver/common/interactions/typing_interaction.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/wheel_actions.rb +113 -0
- data/lib/selenium/webdriver/common/{w3c_manager.rb → interactions/wheel_input.rb} +14 -17
- data/lib/selenium/webdriver/common/keys.rb +1 -0
- data/lib/selenium/webdriver/common/local_driver.rb +55 -0
- data/lib/selenium/webdriver/common/log_entry.rb +2 -2
- data/lib/selenium/webdriver/common/logger.rb +119 -19
- data/lib/selenium/webdriver/common/manager.rb +11 -38
- data/lib/selenium/webdriver/common/options.rb +169 -23
- data/lib/selenium/webdriver/common/platform.rb +14 -6
- 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 +8 -5
- data/lib/selenium/webdriver/common/search_context.rb +7 -9
- data/lib/selenium/webdriver/common/selenium_manager.rb +125 -0
- data/lib/selenium/webdriver/common/service.rb +26 -137
- data/lib/selenium/webdriver/common/service_manager.rb +144 -0
- data/lib/selenium/webdriver/common/shadow_root.rb +86 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +4 -4
- data/lib/selenium/webdriver/common/socket_poller.rb +4 -4
- data/lib/selenium/webdriver/common/takes_screenshot.rb +65 -0
- data/lib/selenium/webdriver/common/target_locator.rb +31 -4
- data/lib/selenium/webdriver/common/timeouts.rb +31 -4
- data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +85 -0
- data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +72 -0
- data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +62 -0
- data/lib/selenium/webdriver/common/wait.rb +1 -1
- data/lib/selenium/webdriver/common/websocket_connection.rb +164 -0
- data/lib/selenium/webdriver/common/window.rb +6 -10
- data/lib/selenium/webdriver/common/zipper.rb +4 -10
- data/lib/selenium/webdriver/common.rb +42 -18
- data/lib/selenium/webdriver/devtools/console_event.rb +36 -0
- data/lib/selenium/webdriver/devtools/exception_event.rb +34 -0
- data/lib/selenium/webdriver/devtools/mutation_event.rb +35 -0
- data/lib/selenium/webdriver/devtools/network_interceptor.rb +173 -0
- data/lib/selenium/webdriver/devtools/pinned_script.rb +57 -0
- data/lib/selenium/webdriver/devtools/request.rb +65 -0
- data/lib/selenium/webdriver/devtools/response.rb +64 -0
- data/lib/selenium/webdriver/devtools.rb +96 -0
- data/lib/selenium/webdriver/edge/driver.rb +11 -27
- data/lib/selenium/webdriver/edge/features.rb +44 -0
- data/lib/selenium/webdriver/edge/options.rb +18 -43
- data/lib/selenium/webdriver/edge/profile.rb +33 -0
- data/lib/selenium/webdriver/edge/service.rb +7 -27
- data/lib/selenium/webdriver/edge.rb +11 -14
- data/lib/selenium/webdriver/firefox/driver.rb +38 -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 +77 -50
- data/lib/selenium/webdriver/firefox/profile.rb +17 -71
- data/lib/selenium/webdriver/firefox/service.rb +3 -13
- data/lib/selenium/webdriver/firefox/util.rb +1 -1
- data/lib/selenium/webdriver/firefox.rb +17 -28
- data/lib/selenium/webdriver/ie/driver.rb +5 -45
- data/lib/selenium/webdriver/ie/options.rb +15 -46
- data/lib/selenium/webdriver/ie/service.rb +11 -19
- data/lib/selenium/webdriver/ie.rb +3 -16
- data/lib/selenium/webdriver/remote/bridge/commands.rb +170 -0
- data/lib/selenium/webdriver/remote/bridge.rb +592 -87
- data/lib/selenium/webdriver/remote/capabilities.rb +182 -124
- data/lib/selenium/webdriver/remote/driver.rb +30 -15
- data/lib/selenium/webdriver/remote/http/common.rb +3 -8
- data/lib/selenium/webdriver/remote/http/curb.rb +1 -3
- data/lib/selenium/webdriver/remote/http/default.rb +23 -31
- data/lib/selenium/webdriver/remote/response.rb +17 -49
- data/lib/selenium/webdriver/remote.rb +14 -12
- data/lib/selenium/webdriver/safari/driver.rb +7 -29
- data/lib/selenium/webdriver/safari/{bridge.rb → features.rb} +3 -5
- data/lib/selenium/webdriver/safari/options.rb +12 -27
- data/lib/selenium/webdriver/safari/service.rb +13 -11
- data/lib/selenium/webdriver/safari.rb +14 -20
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
- data/lib/selenium/webdriver/support/color.rb +24 -24
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +4 -4
- data/lib/selenium/webdriver/support/guards/guard.rb +87 -0
- data/lib/selenium/webdriver/{firefox/marionette/bridge.rb → support/guards/guard_condition.rb} +21 -20
- data/lib/selenium/webdriver/support/guards.rb +95 -0
- data/lib/selenium/webdriver/support/relative_locator.rb +50 -0
- data/lib/selenium/webdriver/support/select.rb +6 -4
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +18 -17
- data/selenium-webdriver.gemspec +36 -18
- metadata +159 -89
- 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/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/http/persistent.rb +0 -60
- 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
@@ -20,6 +20,12 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module Interactions
|
23
|
+
#
|
24
|
+
# Creates actions specific to Pointer Input devices
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
23
29
|
class PointerInput < InputDevice
|
24
30
|
KIND = {mouse: :mouse, pen: :pen, touch: :touch}.freeze
|
25
31
|
|
@@ -28,17 +34,12 @@ module Selenium
|
|
28
34
|
def initialize(kind, name: nil)
|
29
35
|
super(name)
|
30
36
|
@kind = assert_kind(kind)
|
31
|
-
|
32
|
-
|
33
|
-
def type
|
34
|
-
Interactions::POINTER
|
37
|
+
@type = Interactions::POINTER
|
35
38
|
end
|
36
39
|
|
37
40
|
def encode
|
38
|
-
|
39
|
-
|
40
|
-
output = {type: type, id: name, actions: @actions.map(&:encode)}
|
41
|
-
output[:parameters] = {pointerType: kind}
|
41
|
+
output = super
|
42
|
+
output[:parameters] = {pointerType: kind} if output
|
42
43
|
output
|
43
44
|
end
|
44
45
|
|
@@ -48,92 +49,22 @@ module Selenium
|
|
48
49
|
KIND[pointer]
|
49
50
|
end
|
50
51
|
|
51
|
-
def create_pointer_move(duration: 0, x: 0, y: 0,
|
52
|
-
add_action(PointerMove.new(self, duration, x, y,
|
52
|
+
def create_pointer_move(duration: 0, x: 0, y: 0, origin: nil, **opts)
|
53
|
+
add_action(PointerMove.new(self, duration, x, y, origin: origin, **opts))
|
53
54
|
end
|
54
55
|
|
55
|
-
def create_pointer_down(button)
|
56
|
-
add_action(PointerPress.new(self, :down, button))
|
56
|
+
def create_pointer_down(button, **opts)
|
57
|
+
add_action(PointerPress.new(self, :down, button, **opts))
|
57
58
|
end
|
58
59
|
|
59
|
-
def create_pointer_up(button)
|
60
|
-
add_action(PointerPress.new(self, :up, button))
|
60
|
+
def create_pointer_up(button, **opts)
|
61
|
+
add_action(PointerPress.new(self, :up, button, **opts))
|
61
62
|
end
|
62
63
|
|
63
64
|
def create_pointer_cancel
|
64
65
|
add_action(PointerCancel.new(self))
|
65
66
|
end
|
66
67
|
end # PointerInput
|
67
|
-
|
68
|
-
class PointerPress < Interaction
|
69
|
-
BUTTONS = {left: 0, middle: 1, right: 2}.freeze
|
70
|
-
DIRECTIONS = {down: :pointerDown, up: :pointerUp}.freeze
|
71
|
-
|
72
|
-
def initialize(source, direction, button)
|
73
|
-
super(source)
|
74
|
-
@direction = assert_direction(direction)
|
75
|
-
@button = assert_button(button)
|
76
|
-
end
|
77
|
-
|
78
|
-
def type
|
79
|
-
@direction
|
80
|
-
end
|
81
|
-
|
82
|
-
def assert_button(button)
|
83
|
-
if button.is_a? Symbol
|
84
|
-
raise TypeError, "#{button.inspect} is not a valid button!" unless BUTTONS.key? button
|
85
|
-
|
86
|
-
button = BUTTONS[button]
|
87
|
-
end
|
88
|
-
raise ArgumentError, 'Button number cannot be negative!' unless button >= 0
|
89
|
-
|
90
|
-
button
|
91
|
-
end
|
92
|
-
|
93
|
-
def assert_direction(direction)
|
94
|
-
raise TypeError, "#{direction.inspect} is not a valid button direction" unless DIRECTIONS.key? direction
|
95
|
-
|
96
|
-
DIRECTIONS[direction]
|
97
|
-
end
|
98
|
-
|
99
|
-
def encode
|
100
|
-
{type: type, button: @button}
|
101
|
-
end
|
102
|
-
end # PointerPress
|
103
|
-
|
104
|
-
class PointerMove < Interaction
|
105
|
-
VIEWPORT = :viewport
|
106
|
-
POINTER = :pointer
|
107
|
-
ORIGINS = [VIEWPORT, POINTER].freeze
|
108
|
-
|
109
|
-
def initialize(source, duration, x, y, element: nil, origin: nil)
|
110
|
-
super(source)
|
111
|
-
@duration = duration * 1000
|
112
|
-
@x_offset = x
|
113
|
-
@y_offset = y
|
114
|
-
@origin = element || origin
|
115
|
-
end
|
116
|
-
|
117
|
-
def type
|
118
|
-
:pointerMove
|
119
|
-
end
|
120
|
-
|
121
|
-
def encode
|
122
|
-
output = {type: type, duration: @duration.to_i, x: @x_offset, y: @y_offset}
|
123
|
-
output[:origin] = @origin
|
124
|
-
output
|
125
|
-
end
|
126
|
-
end # Move
|
127
|
-
|
128
|
-
class PointerCancel < Interaction
|
129
|
-
def type
|
130
|
-
:pointerCancel
|
131
|
-
end
|
132
|
-
|
133
|
-
def encode
|
134
|
-
{type: type}
|
135
|
-
end
|
136
|
-
end # Cancel
|
137
68
|
end # Interactions
|
138
69
|
end # WebDriver
|
139
70
|
end # Selenium
|
@@ -0,0 +1,60 @@
|
|
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
|
+
module Interactions
|
23
|
+
#
|
24
|
+
# Action related to moving the pointer.
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
29
|
+
class PointerMove < Interaction
|
30
|
+
include PointerEventProperties
|
31
|
+
|
32
|
+
VIEWPORT = :viewport
|
33
|
+
POINTER = :pointer
|
34
|
+
ORIGINS = [VIEWPORT, POINTER].freeze
|
35
|
+
|
36
|
+
def initialize(source, duration, x, y, **opts)
|
37
|
+
super(source)
|
38
|
+
@duration = duration * 1000
|
39
|
+
@x_offset = x
|
40
|
+
@y_offset = y
|
41
|
+
@origin = opts.delete(:element) || opts.delete(:origin) || :viewport
|
42
|
+
@type = :pointerMove
|
43
|
+
@opts = opts
|
44
|
+
end
|
45
|
+
|
46
|
+
def assert_source(source)
|
47
|
+
raise TypeError, "#{source.type} is not a valid input type" unless source.is_a? PointerInput
|
48
|
+
end
|
49
|
+
|
50
|
+
def encode
|
51
|
+
process_opts.merge('type' => type.to_s,
|
52
|
+
'duration' => @duration.to_i,
|
53
|
+
'x' => @x_offset,
|
54
|
+
'y' => @y_offset,
|
55
|
+
'origin' => @origin)
|
56
|
+
end
|
57
|
+
end # PointerMove
|
58
|
+
end # Interactions
|
59
|
+
end # WebDriver
|
60
|
+
end # Selenium
|
@@ -0,0 +1,85 @@
|
|
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
|
+
module Interactions
|
23
|
+
#
|
24
|
+
# Actions related to clicking, tapping or pressing the pointer.
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
29
|
+
class PointerPress < Interaction
|
30
|
+
include PointerEventProperties
|
31
|
+
|
32
|
+
BUTTONS = {left: 0,
|
33
|
+
touch: 0,
|
34
|
+
pen_contact: 0,
|
35
|
+
middle: 1,
|
36
|
+
right: 2,
|
37
|
+
pen_barrel: 2,
|
38
|
+
x1: 3,
|
39
|
+
back: 3,
|
40
|
+
x2: 4,
|
41
|
+
forward: 4}.freeze
|
42
|
+
DIRECTIONS = {down: :pointerDown, up: :pointerUp}.freeze
|
43
|
+
|
44
|
+
def initialize(source, direction, button, **opts)
|
45
|
+
super(source)
|
46
|
+
@direction = assert_direction(direction)
|
47
|
+
@button = assert_button(button)
|
48
|
+
@type = @direction
|
49
|
+
@opts = opts
|
50
|
+
end
|
51
|
+
|
52
|
+
def encode
|
53
|
+
process_opts.merge('type' => type.to_s, 'button' => @button)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def assert_source(source)
|
59
|
+
raise TypeError, "#{source.type} is not a valid input type" unless source.is_a? PointerInput
|
60
|
+
end
|
61
|
+
|
62
|
+
def assert_button(button)
|
63
|
+
case button
|
64
|
+
when Symbol
|
65
|
+
raise ArgumentError, "#{button} is not a valid button!" unless BUTTONS.key? button
|
66
|
+
|
67
|
+
BUTTONS[button]
|
68
|
+
when Integer
|
69
|
+
raise ArgumentError, 'Button number cannot be negative!' if button.negative?
|
70
|
+
|
71
|
+
button
|
72
|
+
else
|
73
|
+
raise TypeError, "button must be a positive integer or one of #{BUTTONS.keys}, not #{button.class}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def assert_direction(direction)
|
78
|
+
raise ArgumentError, "#{direction.inspect} is not a valid button direction" unless DIRECTIONS.key? direction
|
79
|
+
|
80
|
+
DIRECTIONS[direction]
|
81
|
+
end
|
82
|
+
end # PointerPress
|
83
|
+
end # Interactions
|
84
|
+
end # WebDriver
|
85
|
+
end # Selenium
|
@@ -0,0 +1,59 @@
|
|
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
|
+
module Interactions
|
23
|
+
#
|
24
|
+
# Action related to scrolling a wheel.
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
29
|
+
class Scroll < Interaction
|
30
|
+
def initialize(source:, origin: :viewport, duration: 0.25, **opts)
|
31
|
+
super(source)
|
32
|
+
@type = :scroll
|
33
|
+
@duration = duration * 1000
|
34
|
+
@origin = origin
|
35
|
+
@x_offset = opts.delete(:x) || 0
|
36
|
+
@y_offset = opts.delete(:y) || 0
|
37
|
+
@delta_x = opts.delete(:delta_x) || 0
|
38
|
+
@delta_y = opts.delete(:delta_y) || 0
|
39
|
+
|
40
|
+
raise ArgumentError, "Invalid arguments: #{opts.keys}" unless opts.empty?
|
41
|
+
end
|
42
|
+
|
43
|
+
def assert_source(source)
|
44
|
+
raise TypeError, "#{source.type} is not a valid input type" unless source.is_a? WheelInput
|
45
|
+
end
|
46
|
+
|
47
|
+
def encode
|
48
|
+
{'type' => type.to_s,
|
49
|
+
'duration' => @duration.to_i,
|
50
|
+
'x' => @x_offset,
|
51
|
+
'y' => @y_offset,
|
52
|
+
'deltaX' => @delta_x,
|
53
|
+
'deltaY' => @delta_y,
|
54
|
+
'origin' => @origin.is_a?(Element) ? @origin : @origin.to_s}
|
55
|
+
end
|
56
|
+
end # PointerPress
|
57
|
+
end # Interactions
|
58
|
+
end # WebDriver
|
59
|
+
end # Selenium
|
@@ -0,0 +1,48 @@
|
|
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
|
+
module WheelActions
|
23
|
+
class ScrollOrigin
|
24
|
+
class << self
|
25
|
+
def element(element, x_offset = 0, y_offset = 0)
|
26
|
+
new(element, x_offset, y_offset)
|
27
|
+
end
|
28
|
+
|
29
|
+
def viewport(x_offset = 0, y_offset = 0)
|
30
|
+
new(:viewport, x_offset, y_offset)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :origin, :x_offset, :y_offset
|
35
|
+
|
36
|
+
#
|
37
|
+
# Use a static method to access
|
38
|
+
# @api private
|
39
|
+
#
|
40
|
+
def initialize(origin, x_offset, y_offset)
|
41
|
+
@origin = origin
|
42
|
+
@x_offset = x_offset
|
43
|
+
@y_offset = y_offset
|
44
|
+
end
|
45
|
+
end # ScrollOrigin
|
46
|
+
end # WheelActions
|
47
|
+
end # WebDriver
|
48
|
+
end # Selenium
|
@@ -0,0 +1,54 @@
|
|
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
|
+
module Interactions
|
23
|
+
#
|
24
|
+
# Actions related to pressing keys.
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
29
|
+
class TypingInteraction < Interaction
|
30
|
+
attr_reader :type
|
31
|
+
|
32
|
+
def initialize(source, type, key)
|
33
|
+
super(source)
|
34
|
+
@type = assert_type(type)
|
35
|
+
@key = Keys.encode_key(key)
|
36
|
+
end
|
37
|
+
|
38
|
+
def assert_source(source)
|
39
|
+
raise TypeError, "#{source.type} is not a valid input type" unless source.is_a? KeyInput
|
40
|
+
end
|
41
|
+
|
42
|
+
def assert_type(type)
|
43
|
+
raise TypeError, "#{type.inspect} is not a valid key subtype" unless KeyInput::SUBTYPES.key? type
|
44
|
+
|
45
|
+
KeyInput::SUBTYPES[type]
|
46
|
+
end
|
47
|
+
|
48
|
+
def encode
|
49
|
+
{type: @type, value: @key}
|
50
|
+
end
|
51
|
+
end # TypingInteraction
|
52
|
+
end # Interactions
|
53
|
+
end # WebDriver
|
54
|
+
end # Selenium
|
@@ -0,0 +1,113 @@
|
|
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
|
+
module WheelActions
|
23
|
+
attr_writer :default_scroll_duration
|
24
|
+
|
25
|
+
#
|
26
|
+
# By default this is set to 250ms in the ActionBuilder constructor
|
27
|
+
# It can be overridden with default_scroll_duration=
|
28
|
+
#
|
29
|
+
|
30
|
+
def default_scroll_duration
|
31
|
+
@default_scroll_duration ||= @duration / 1000.0 # convert ms to seconds
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# If the element is outside the viewport, scrolls the bottom of the element to the bottom of the viewport.
|
36
|
+
#
|
37
|
+
# @example Scroll to element
|
38
|
+
# el = driver.find_element(id: "some_id")
|
39
|
+
# driver.action.scroll_to(element).perform
|
40
|
+
#
|
41
|
+
# @param [Object] Which element to scroll into the viewport.
|
42
|
+
# @return [Selenium::WebDriver::WheelActions] A self reference.
|
43
|
+
def scroll_to(element, device: nil)
|
44
|
+
scroll(origin: element, device: device)
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Scrolls by provided amounts with the origin in the top left corner of the viewport.
|
49
|
+
#
|
50
|
+
# @example Scroll viewport by a specified amount
|
51
|
+
# el = driver.find_element(id: "some_id")
|
52
|
+
# driver.action.scroll_by(100, 200).perform
|
53
|
+
#
|
54
|
+
# @param [Integer] delta_x Distance along X axis to scroll using the wheel. A negative value scrolls left.
|
55
|
+
# @param [Integer] delta_y Distance along Y axis to scroll using the wheel. A negative value scrolls up.
|
56
|
+
# @return [Selenium::WebDriver::WheelActions] A self reference.
|
57
|
+
def scroll_by(delta_x, delta_y, device: nil)
|
58
|
+
scroll(delta_x: delta_x, delta_y: delta_y, device: device)
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Scrolls by provided amount based on a provided origin.
|
63
|
+
#
|
64
|
+
# The scroll origin is either the center of an element or the upper left of the viewport plus any offsets.
|
65
|
+
# If the origin is an element, and the element is not in the viewport, the bottom of the element will first
|
66
|
+
# be scrolled to the bottom of the viewport.
|
67
|
+
#
|
68
|
+
# @example Scroll from element by a specified amount
|
69
|
+
# el = driver.find_element(id: "some_id")
|
70
|
+
# origin = WheelActions::ScrollOrigin.element(el)
|
71
|
+
# driver.action.scroll_from(origin, 0, 200).perform
|
72
|
+
#
|
73
|
+
# @example Scroll from element by a specified amount with an offset
|
74
|
+
# el = driver.find_element(id: "some_id")
|
75
|
+
# origin = WheelActions::ScrollOrigin.element(el, 10, 10)
|
76
|
+
# driver.action.scroll_from(origin, 100, 200).perform
|
77
|
+
#
|
78
|
+
# @example Scroll viewport by a specified amount with an offset
|
79
|
+
# origin = WheelActions::ScrollOrigin.viewport(10, 10)
|
80
|
+
# driver.action.scroll_from(origin, 0, 200).perform
|
81
|
+
#
|
82
|
+
# @param [ScrollOrigin] scroll_origin Where scroll originates (viewport or element center) plus provided offsets.
|
83
|
+
# @param [Integer] delta_x Distance along X axis to scroll using the wheel. A negative value scrolls left.
|
84
|
+
# @param [Integer] delta_y Distance along Y axis to scroll using the wheel. A negative value scrolls up.
|
85
|
+
# @return [Selenium::WebDriver::WheelActions] A self reference.
|
86
|
+
# @raise [Error::MoveTargetOutOfBoundsError] If the origin with offset is outside the viewport.
|
87
|
+
def scroll_from(scroll_origin, delta_x, delta_y, device: nil)
|
88
|
+
raise TypeError, "#{scroll_origin.inspect} isn't a valid ScrollOrigin" unless scroll_origin.is_a?(ScrollOrigin)
|
89
|
+
|
90
|
+
scroll(x: scroll_origin.x_offset,
|
91
|
+
y: scroll_origin.y_offset,
|
92
|
+
delta_x: delta_x,
|
93
|
+
delta_y: delta_y,
|
94
|
+
origin: scroll_origin.origin,
|
95
|
+
device: device)
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def scroll(**opts)
|
101
|
+
opts[:duration] = default_scroll_duration
|
102
|
+
wheel = wheel_input(opts.delete(:device))
|
103
|
+
wheel.create_scroll(**opts)
|
104
|
+
tick(wheel)
|
105
|
+
self
|
106
|
+
end
|
107
|
+
|
108
|
+
def wheel_input(name = nil)
|
109
|
+
device(name: name, type: Interactions::WHEEL) || add_wheel_input('wheel')
|
110
|
+
end
|
111
|
+
end # WheelActions
|
112
|
+
end # WebDriver
|
113
|
+
end # Selenium
|
@@ -19,27 +19,24 @@
|
|
19
19
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
# Get the cookie with the given name
|
26
|
-
#
|
27
|
-
# @param [String] name the name of the cookie
|
28
|
-
# @return [Hash, nil] the cookie, or nil if it wasn't found.
|
22
|
+
module Interactions
|
29
23
|
#
|
30
|
-
|
31
|
-
def cookie_named(name)
|
32
|
-
convert_cookie(@bridge.cookie(name))
|
33
|
-
end
|
34
|
-
|
24
|
+
# Creates actions specific to Pointer Input devices
|
35
25
|
#
|
36
|
-
#
|
26
|
+
# @api private
|
37
27
|
#
|
38
28
|
|
39
|
-
|
40
|
-
|
41
|
-
|
29
|
+
class WheelInput < InputDevice
|
30
|
+
def initialize(name = nil)
|
31
|
+
super(name)
|
32
|
+
@type = Interactions::WHEEL
|
33
|
+
end
|
42
34
|
|
43
|
-
|
35
|
+
def create_scroll(**opts)
|
36
|
+
opts[:source] = self
|
37
|
+
add_action(Scroll.new(**opts))
|
38
|
+
end
|
39
|
+
end # PointerInput
|
40
|
+
end # Interactions
|
44
41
|
end # WebDriver
|
45
42
|
end # Selenium
|
@@ -0,0 +1,55 @@
|
|
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
|
+
module LocalDriver
|
23
|
+
def initialize_local_driver(capabilities, options, service, url)
|
24
|
+
raise ArgumentError, "Can't initialize #{self.class} with :url" if url
|
25
|
+
|
26
|
+
service ||= Service.send(browser)
|
27
|
+
caps = process_options(options, capabilities, service)
|
28
|
+
url = service_url(service)
|
29
|
+
|
30
|
+
[caps, url]
|
31
|
+
end
|
32
|
+
|
33
|
+
def process_options(options, capabilities, service)
|
34
|
+
default_options = Options.send(browser)
|
35
|
+
|
36
|
+
if options && capabilities
|
37
|
+
msg = "Don't use both :options and :capabilities when initializing #{self.class}, prefer :options"
|
38
|
+
raise ArgumentError, msg
|
39
|
+
elsif options && !options.is_a?(default_options.class)
|
40
|
+
raise ArgumentError, ":options must be an instance of #{default_options.class}"
|
41
|
+
elsif capabilities
|
42
|
+
WebDriver.logger.deprecate("The :capabilities parameter for #{self.class}",
|
43
|
+
":options argument with an instance of #{self.class}",
|
44
|
+
id: :capabilities)
|
45
|
+
service.executable_path ||= WebDriver::DriverFinder.path(capabilities, service.class)
|
46
|
+
generate_capabilities(capabilities)
|
47
|
+
else
|
48
|
+
options ||= default_options
|
49
|
+
service.executable_path ||= WebDriver::DriverFinder.path(options, service.class)
|
50
|
+
options.as_json
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -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
|