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
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed to the Software Freedom Conservancy (SFC) under one
4
- # or more contributor license agreements. See the NOTICE file
5
- # distributed with this work for additional information
6
- # regarding copyright ownership. The SFC licenses this file
7
- # to you under the Apache License, Version 2.0 (the
8
- # "License"); you may not use this file except in compliance
9
- # with the License. You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing,
14
- # software distributed under the License is distributed on an
15
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
- # KIND, either express or implied. See the License for the
17
- # specific language governing permissions and limitations
18
- # under the License.
19
-
20
- module Selenium
21
- module WebDriver
22
- #
23
- # @api private
24
- # @see ActionBuilder
25
- #
26
-
27
- class Mouse
28
- def initialize(bridge)
29
- @bridge = bridge
30
- end
31
-
32
- def click(element = nil)
33
- move_if_needed element
34
- @bridge.click
35
- end
36
-
37
- def double_click(element = nil)
38
- move_if_needed element
39
- @bridge.double_click
40
- end
41
-
42
- def context_click(element = nil)
43
- move_if_needed element
44
- @bridge.context_click
45
- end
46
-
47
- def down(element = nil)
48
- move_if_needed element
49
- @bridge.mouse_down
50
- end
51
-
52
- def up(element = nil)
53
- move_if_needed element
54
- @bridge.mouse_up
55
- end
56
-
57
- #
58
- # Move the mouse.
59
- #
60
- # Examples:
61
- #
62
- # driver.mouse.move_to(element)
63
- # driver.mouse.move_to(element, 5, 5)
64
- #
65
-
66
- def move_to(element, right_by = nil, down_by = nil)
67
- assert_element element
68
-
69
- @bridge.mouse_move_to element.ref, right_by, down_by
70
- end
71
-
72
- def move_by(right_by, down_by)
73
- @bridge.mouse_move_to nil, Integer(right_by), Integer(down_by)
74
- end
75
-
76
- private
77
-
78
- def move_if_needed(element)
79
- move_to element if element
80
- end
81
-
82
- def assert_element(element)
83
- return if element.is_a? Element
84
-
85
- raise TypeError, "expected #{Element}, got #{element.inspect}:#{element.class}"
86
- end
87
- end # Mouse
88
- end # WebDriver
89
- end # Selenium
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed to the Software Freedom Conservancy (SFC) under one
4
- # or more contributor license agreements. See the NOTICE file
5
- # distributed with this work for additional information
6
- # regarding copyright ownership. The SFC licenses this file
7
- # to you under the Apache License, Version 2.0 (the
8
- # "License"); you may not use this file except in compliance
9
- # with the License. You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing,
14
- # software distributed under the License is distributed on an
15
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
- # KIND, either express or implied. See the License for the
17
- # specific language governing permissions and limitations
18
- # under the License.
19
-
20
- module Selenium
21
- module WebDriver
22
- class TouchActionBuilder < ActionBuilder
23
- #
24
- # @api private
25
- #
26
-
27
- def initialize(mouse, keyboard, touch_screen)
28
- WebDriver.logger.deprecate(self.class.name)
29
- super(mouse, keyboard)
30
- @devices[:touch_screen] = touch_screen
31
- end
32
-
33
- def scroll(*args)
34
- raise ArgumentError, "wrong number of arguments, expected 2..3, got #{args.size}" unless [2, 3].include? args.size
35
-
36
- @actions << [:touch_screen, :scroll, args]
37
- self
38
- end
39
-
40
- def flick(*args)
41
- raise ArgumentError, "wrong number of arguments, expected 2 or 4, got #{args.size}" unless [2, 4].include? args.size
42
-
43
- @actions << [:touch_screen, :flick, args]
44
- self
45
- end
46
-
47
- def single_tap(element)
48
- @actions << [:touch_screen, :single_tap, [element]]
49
- self
50
- end
51
-
52
- def double_tap(element)
53
- @actions << [:touch_screen, :double_tap, [element]]
54
- self
55
- end
56
-
57
- def long_press(element)
58
- @actions << [:touch_screen, :long_press, [element]]
59
- self
60
- end
61
-
62
- def down(x, y = nil)
63
- @actions << [:touch_screen, :down, [x, y]]
64
- self
65
- end
66
-
67
- def up(x, y = nil)
68
- @actions << [:touch_screen, :up, [x, y]]
69
- self
70
- end
71
-
72
- def move(x, y = nil)
73
- @actions << [:touch_screen, :move, [x, y]]
74
- self
75
- end
76
- end # TouchActionBuilder
77
- end # WebDriver
78
- end # Selenium
@@ -1,123 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed to the Software Freedom Conservancy (SFC) under one
4
- # or more contributor license agreements. See the NOTICE file
5
- # distributed with this work for additional information
6
- # regarding copyright ownership. The SFC licenses this file
7
- # to you under the Apache License, Version 2.0 (the
8
- # "License"); you may not use this file except in compliance
9
- # with the License. You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing,
14
- # software distributed under the License is distributed on an
15
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
- # KIND, either express or implied. See the License for the
17
- # specific language governing permissions and limitations
18
- # under the License.
19
-
20
- module Selenium
21
- module WebDriver
22
- class TouchScreen
23
- FLICK_SPEED = {normal: 0, fast: 1}.freeze
24
-
25
- #
26
- # @api private
27
- #
28
-
29
- def initialize(bridge)
30
- @bridge = bridge
31
- end
32
-
33
- def single_tap(element)
34
- assert_element element
35
- @bridge.touch_single_tap element.ref
36
- end
37
-
38
- def double_tap(element)
39
- assert_element element
40
- @bridge.touch_double_tap element.ref
41
- end
42
-
43
- def long_press(element)
44
- assert_element element
45
- @bridge.touch_long_press element.ref
46
- end
47
-
48
- def down(x, y = nil)
49
- x, y = coords_from x, y
50
- @bridge.touch_down x, y
51
- end
52
-
53
- def up(x, y = nil)
54
- x, y = coords_from x, y
55
- @bridge.touch_up x, y
56
- end
57
-
58
- def move(x, y = nil)
59
- x, y = coords_from x, y
60
- @bridge.touch_move x, y
61
- end
62
-
63
- def scroll(*args)
64
- case args.size
65
- when 2
66
- x_offset, y_offset = args
67
- @bridge.touch_scroll nil, Integer(x_offset), Integer(y_offset)
68
- when 3
69
- element, x_offset, y_offset = args
70
- assert_element element
71
- @bridge.touch_scroll element.ref, Integer(x_offset), Integer(y_offset)
72
- else
73
- raise ArgumentError, "wrong number of arguments, expected 2..3, got #{args.size}"
74
- end
75
- end
76
-
77
- def flick(*args)
78
- case args.size
79
- when 2
80
- x_speed, y_speed = args
81
- @bridge.touch_flick Integer(x_speed), Integer(y_speed)
82
- when 4
83
- element, xoffset, yoffset, speed = args
84
-
85
- assert_element element
86
-
87
- if (speed.is_a?(String) || speed.is_a?(Symbol)) && FLICK_SPEED.key?(speed.to_sym)
88
- WebDriver.logger.deprecate "Passing #{speed.inspect} speed",
89
- "Integer or Selenium::WebDriver::TouchScreen::FLICK_SPEED[:#{speed}]"
90
- speed = FLICK_SPEED[speed.to_sym]
91
- end
92
-
93
- @bridge.touch_element_flick element.ref, Integer(xoffset), Integer(yoffset), Integer(speed)
94
- else
95
- raise ArgumentError, "wrong number of arguments, expected 2 or 4, got #{args.size}"
96
- end
97
- end
98
-
99
- private
100
-
101
- def coords_from(x, y)
102
- if y.nil?
103
- point = x
104
-
105
- unless point.respond_to?(:x) && point.respond_to?(:y)
106
- raise ArgumentError, "expected #{point.inspect} to respond to :x and :y"
107
- end
108
-
109
- x = point.x
110
- y = point.y
111
- end
112
-
113
- [Integer(x), Integer(y)]
114
- end
115
-
116
- def assert_element(element)
117
- return if element.is_a? Element
118
-
119
- raise TypeError, "expected #{Element}, got #{element.inspect}:#{element.class}"
120
- end
121
- end # TouchScreen
122
- end # WebDriver
123
- end # Selenium
@@ -1,212 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Licensed to the Software Freedom Conservancy (SFC) under one
4
- # or more contributor license agreements. See the NOTICE file
5
- # distributed with this work for additional information
6
- # regarding copyright ownership. The SFC licenses this file
7
- # to you under the Apache License, Version 2.0 (the
8
- # "License"); you may not use this file except in compliance
9
- # with the License. You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing,
14
- # software distributed under the License is distributed on an
15
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
- # KIND, either express or implied. See the License for the
17
- # specific language governing permissions and limitations
18
- # under the License.
19
-
20
- module Selenium
21
- module WebDriver
22
- class W3CActionBuilder
23
- include KeyActions # Actions specific to key inputs
24
- include PointerActions # Actions specific to pointer inputs
25
- attr_reader :devices
26
-
27
- #
28
- # Initialize a W3C Action Builder. Differs from previous by requiring a bridge and allowing asynchronous actions.
29
- # The W3C implementation allows asynchronous actions per device. e.g. A key can be pressed at the same time that
30
- # the mouse is moving. Keep in mind that pauses must be added for other devices in order to line up the actions
31
- # correctly when using asynchronous.
32
- #
33
- # @param [Selenium::WebDriver::Remote::W3CBridge] bridge the bridge for the current driver instance
34
- # @param [Selenium::WebDriver::Interactions::PointerInput] mouse PointerInput for the mouse.
35
- # @param [Selenium::WebDriver::Interactions::KeyInput] keyboard KeyInput for the keyboard.
36
- # @param [Boolean] async Whether to perform the actions asynchronously per device. Defaults to false for
37
- # backwards compatibility.
38
- # @return [W3CActionBuilder] A self reference.
39
- #
40
-
41
- def initialize(bridge, mouse, keyboard, async = false)
42
- # For backwards compatibility, automatically include mouse & keyboard
43
- @bridge = bridge
44
- @devices = [mouse, keyboard]
45
- @async = async
46
- end
47
-
48
- #
49
- # Adds a PointerInput device of the given kind
50
- #
51
- # @example Add a touch pointer input device
52
- #
53
- # builder = device.action
54
- # builder.add_pointer_input('touch', :touch)
55
- #
56
- # @param [String] name name for the device
57
- # @param [Symbol] kind kind of pointer device to create
58
- # @return [Interactions::PointerInput] The pointer input added
59
- #
60
- #
61
-
62
- def add_pointer_input(kind, name)
63
- new_input = Interactions.pointer(kind, name: name)
64
- add_input(new_input)
65
- new_input
66
- end
67
-
68
- #
69
- # Adds a KeyInput device
70
- #
71
- # @example Add a key input device
72
- #
73
- # builder = device.action
74
- # builder.add_key_input('keyboard2')
75
- #
76
- # @param [String] name name for the device
77
- # @return [Interactions::KeyInput] The key input added
78
- #
79
-
80
- def add_key_input(name)
81
- new_input = Interactions.key(name)
82
- add_input(new_input)
83
- new_input
84
- end
85
-
86
- #
87
- # Retrieves the input device for the given name
88
- #
89
- # @param [String] name name of the input device
90
- # @return [Selenium::WebDriver::Interactions::InputDevice] input device with given name
91
- #
92
-
93
- def get_device(name)
94
- @devices.find { |device| device.name == name.to_s }
95
- end
96
-
97
- #
98
- # Retrieves the current PointerInput devices
99
- #
100
- # @return [Array] array of current PointerInput devices
101
- #
102
-
103
- def pointer_inputs
104
- @devices.select { |device| device.type == Interactions::POINTER }
105
- end
106
-
107
- #
108
- # Retrieves the current KeyInput device
109
- #
110
- # @return [Selenium::WebDriver::Interactions::InputDevice] current KeyInput device
111
- #
112
-
113
- def key_inputs
114
- @devices.select { |device| device.type == Interactions::KEY }
115
- end
116
-
117
- #
118
- # Creates a pause for the given device of the given duration. If no duration is given, the pause will only wait
119
- # for all actions to complete in that tick.
120
- #
121
- # @example Send keys to an element
122
- #
123
- # action_builder = driver.action
124
- # keyboard = action_builder.key_input
125
- # el = driver.find_element(id: "some_id")
126
- # driver.action.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys').perform
127
- #
128
- # @param [InputDevice] device Input device to pause
129
- # @param [Float] duration Duration to pause
130
- # @return [W3CActionBuilder] A self reference.
131
- #
132
-
133
- def pause(device, duration = nil)
134
- device.create_pause(duration)
135
- self
136
- end
137
-
138
- #
139
- # Creates multiple pauses for the given device of the given duration.
140
- #
141
- # @example Send keys to an element
142
- #
143
- # action_builder = driver.action
144
- # keyboard = action_builder.key_input
145
- # el = driver.find_element(id: "some_id")
146
- # driver.action.click(el).pauses(keyboard, 3).send_keys('keys').perform
147
- #
148
- # @param [InputDevice] device Input device to pause
149
- # @param [Integer] number of pauses to add for the device
150
- # @param [Float] duration Duration to pause
151
- # @return [W3CActionBuilder] A self reference.
152
- #
153
-
154
- def pauses(device, number, duration = nil)
155
- number.times { device.create_pause(duration) }
156
- self
157
- end
158
-
159
- #
160
- # Executes the actions added to the builder.
161
- #
162
-
163
- def perform
164
- @bridge.send_actions @devices.map(&:encode).compact
165
- clear_all_actions
166
- nil
167
- end
168
-
169
- #
170
- # Clears all actions from the builder.
171
- #
172
-
173
- def clear_all_actions
174
- @devices.each(&:clear_actions)
175
- end
176
-
177
- #
178
- # Releases all action states from the browser.
179
- #
180
-
181
- def release_actions
182
- @bridge.release_actions
183
- end
184
-
185
- private
186
-
187
- #
188
- # Adds pauses for all devices but the given devices
189
- #
190
- # @param [Array[InputDevice]] action_devices Array of Input Devices performing an action in this tick.
191
- #
192
-
193
- def tick(*action_devices)
194
- return if @async
195
-
196
- @devices.each { |device| device.create_pause unless action_devices.include? device }
197
- end
198
-
199
- #
200
- # Adds an InputDevice
201
- #
202
-
203
- def add_input(device)
204
- unless @async
205
- max_device = @devices.max { |a, b| a.actions.length <=> b.actions.length }
206
- pauses(device, max_device.actions.length)
207
- end
208
- @devices << device
209
- end
210
- end # W3CActionBuilder
211
- end # WebDriver
212
- end # Selenium
@@ -1,76 +0,0 @@
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 Edge
23
- module Bridge
24
-
25
- def commands(command)
26
- unsupported = %i[execute_script execute_async_script submit_element double_click
27
- mouse_down mouse_up mouse_move_to click
28
- send_keys_to_active_element get_window_handles get_current_window_handle
29
- get_window_size set_window_size get_window_position set_window_position
30
- maximize_window get_alert_text accept_alert dismiss_alert]
31
- if unsupported.include? command
32
- Remote::OSS::Bridge::COMMANDS[command]
33
- else
34
- super
35
- end
36
- end
37
-
38
- def send_keys_to_active_element(key)
39
- execute :send_keys_to_active_element, {}, {value: key}
40
- end
41
-
42
- def window_handle
43
- execute :get_current_window_handle
44
- end
45
-
46
- def window_size(handle = :current)
47
- data = execute :get_window_size, window_handle: handle
48
-
49
- Dimension.new data['width'], data['height']
50
- end
51
-
52
- def resize_window(width, height, handle = :current)
53
- execute :set_window_size, {window_handle: handle},
54
- {width: width,
55
- height: height}
56
- end
57
-
58
- def window_position(handle = :current)
59
- data = execute :get_window_position, window_handle: handle
60
-
61
- Point.new data['x'], data['y']
62
- end
63
-
64
- def reposition_window(x, y, handle = :current)
65
- execute :set_window_position, {window_handle: handle},
66
- {x: x, y: y}
67
- end
68
-
69
- def maximize_window(handle = :current)
70
- execute :maximize_window, window_handle: handle
71
- end
72
-
73
- end # Bridge
74
- end # Edge
75
- end # WebDriver
76
- end # Selenium