selenium-webdriver 2.45.0 → 3.142.7

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 (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -1,75 +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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Chrome
4
-
5
23
  #
6
24
  # @api private
7
25
  #
8
26
 
9
- class Service
10
- START_TIMEOUT = 20
11
- STOP_TIMEOUT = 5
12
- DEFAULT_PORT = 9515
13
- MISSING_TEXT = "Unable to find the chromedriver executable. Please download the server from http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH. More info at http://code.google.com/p/selenium/wiki/ChromeDriver."
14
-
15
- attr_reader :uri
16
-
17
- def self.executable_path
18
- @executable_path ||= (
19
- path = Platform.find_binary "chromedriver"
20
- path or raise Error::WebDriverError, MISSING_TEXT
21
- Platform.assert_executable path
22
-
23
- path
24
- )
27
+ class Service < WebDriver::Service
28
+ @default_port = 9515
29
+ @executable = 'chromedriver'
30
+ @missing_text = <<~ERROR
31
+ Unable to find chromedriver. Please download the server from
32
+ https://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH.
33
+ More info at https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver.
34
+ ERROR
35
+ @shutdown_supported = true
36
+
37
+ def self.driver_path=(path)
38
+ Platform.assert_executable path if path.is_a?(String)
39
+ @driver_path = path
25
40
  end
26
41
 
27
- def self.executable_path=(path)
28
- Platform.assert_executable path
29
- @executable_path = path
30
- end
31
-
32
- def self.default_service(*extra_args)
33
- new executable_path, PortProber.above(DEFAULT_PORT), *extra_args
34
- end
35
-
36
- def initialize(executable_path, port, *extra_args)
37
- @uri = URI.parse "http://#{Platform.localhost}:#{port}"
38
- server_command = [executable_path, "--port=#{port}", *extra_args]
39
-
40
- @process = ChildProcess.build(*server_command)
41
- @socket_poller = SocketPoller.new Platform.localhost, port, START_TIMEOUT
42
-
43
- @process.io.inherit! if $DEBUG == true
44
- end
45
-
46
- def start
47
- @process.start
48
-
49
- unless @socket_poller.connected?
50
- raise Error::WebDriverError, "unable to connect to chromedriver #{@uri}"
51
- end
52
-
53
- Platform.exit_hook { stop } # make sure we don't leave the server running
54
- end
55
-
56
- def stop
57
- return if @process.nil? || @process.exited?
58
-
59
- Net::HTTP.start(uri.host, uri.port) do |http|
60
- http.open_timeout = STOP_TIMEOUT / 2
61
- http.read_timeout = STOP_TIMEOUT / 2
62
-
63
- http.head("/shutdown")
64
- end
65
-
66
- @process.poll_for_exit STOP_TIMEOUT
67
- rescue ChildProcess::TimeoutError
68
- # ok, force quit
69
- @process.stop STOP_TIMEOUT
42
+ private
43
+
44
+ # Note: This processing is deprecated
45
+ def extract_service_args(driver_opts)
46
+ driver_args = super
47
+ driver_opts = driver_opts.dup
48
+ driver_args << "--log-path=#{driver_opts.delete(:log_path)}" if driver_opts.key?(:log_path)
49
+ driver_args << "--url-base=#{driver_opts.delete(:url_base)}" if driver_opts.key?(:url_base)
50
+ driver_args << "--port-server=#{driver_opts.delete(:port_server)}" if driver_opts.key?(:port_server)
51
+ driver_args << "--whitelisted-ips=#{driver_opts.delete(:whitelisted_ips)}" if driver_opts.key?(:whitelisted_ips)
52
+ driver_args << "--verbose" if driver_opts.key?(:verbose)
53
+ driver_args << "--silent" if driver_opts.key?(:silent)
54
+ driver_args
70
55
  end
71
56
  end # Service
72
-
73
57
  end # Chrome
74
58
  end # WebDriver
75
- end # Service
59
+ end # Selenium
@@ -1,15 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
1
20
  require 'net/http'
2
21
 
3
- require 'selenium/webdriver/chrome/service'
4
22
  require 'selenium/webdriver/chrome/bridge'
23
+ require 'selenium/webdriver/chrome/driver'
5
24
  require 'selenium/webdriver/chrome/profile'
25
+ require 'selenium/webdriver/chrome/options'
6
26
 
7
27
  module Selenium
8
28
  module WebDriver
9
-
10
29
  module Chrome
11
30
  def self.driver_path=(path)
12
- Service.executable_path = path
31
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Chrome#driver_path=',
32
+ 'Selenium::WebDriver::Chrome::Service#driver_path='
33
+ Selenium::WebDriver::Chrome::Service.driver_path = path
34
+ end
35
+
36
+ def self.driver_path
37
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Chrome#driver_path',
38
+ 'Selenium::WebDriver::Chrome::Service#driver_path'
39
+ Selenium::WebDriver::Chrome::Service.driver_path
13
40
  end
14
41
 
15
42
  def self.path=(path)
@@ -20,7 +47,8 @@ module Selenium
20
47
  def self.path
21
48
  @path ||= nil
22
49
  end
50
+ end # Chrome
51
+ end # WebDriver
52
+ end # Selenium
23
53
 
24
- end
25
- end
26
- end
54
+ require 'selenium/webdriver/chrome/service'
@@ -1,13 +1,29 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
-
4
22
  #
5
23
  # The ActionBuilder provides the user a way to set up and perform
6
24
  # complex user interactions.
7
25
  #
8
- # This class should not be instantiated directly, but is created by
9
- # Selenium::WebDriver::DriverExtensions::HasInputDevices#action, which
10
- # is available on Driver instances that support the user interaction API.
26
+ # This class should not be instantiated directly, but is created by Driver#action
11
27
  #
12
28
  # @example
13
29
  #
@@ -20,18 +36,17 @@ module Selenium
20
36
  #
21
37
 
22
38
  class ActionBuilder
23
-
24
39
  #
25
40
  # @api private
26
41
  #
27
42
 
28
43
  def initialize(mouse, keyboard)
29
- @devices = {
30
- :mouse => mouse,
31
- :keyboard => keyboard
44
+ @devices = {
45
+ mouse: mouse,
46
+ keyboard: keyboard
32
47
  }
33
48
 
34
- @actions = []
49
+ @actions = []
35
50
  end
36
51
 
37
52
  #
@@ -51,19 +66,19 @@ module Selenium
51
66
  #
52
67
  # @example Press a key on an element
53
68
  #
54
- # el = driver.find_element(:id, "some_id")
69
+ # el = driver.find_element(id: "some_id")
55
70
  # driver.action.key_down(el, :shift).perform
56
71
  #
57
- # @param [:shift, :alt, :control, :command, :meta] The key to press.
58
- # @param [Selenium::WebDriver::Element] element An optional element
72
+ # @overload key_down(key)
73
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
74
+ # @overload key_down(element, key)
75
+ # @param [Element] element An optional element to move to first
76
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
59
77
  # @raise [ArgumentError] if the given key is not a modifier
60
- # @return [ActionBuilder] A self reference.
61
- #
78
+ # @return [ActionBuilder] A self reference
62
79
 
63
80
  def key_down(*args)
64
- if args.first.kind_of? Element
65
- @actions << [:mouse, :click, [args.shift]]
66
- end
81
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
67
82
 
68
83
  @actions << [:keyboard, :press, args]
69
84
  self
@@ -79,19 +94,20 @@ module Selenium
79
94
  #
80
95
  # @example Release a key from an element
81
96
  #
82
- # el = driver.find_element(:id, "some_id")
97
+ # el = driver.find_element(id: "some_id")
83
98
  # driver.action.key_up(el, :alt).perform
84
99
  #
85
- # @param [:shift, :alt, :control, :command, :meta] The modifier key to release.
86
- # @param [Selenium::WebDriver::Element] element An optional element
87
- # @raise [ArgumentError] if the given key is not a modifier key
88
- # @return [ActionBuilder] A self reference.
100
+ # @overload key_up(key)
101
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
102
+ # @overload key_up(element, key)
103
+ # @param [Element] element An optional element to move to first
104
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
105
+ # @raise [ArgumentError] if the given key is not a modifier
106
+ # @return [ActionBuilder] A self reference
89
107
  #
90
108
 
91
109
  def key_up(*args)
92
- if args.first.kind_of? Element
93
- @actions << [:mouse, :click, [args.shift]]
94
- end
110
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
95
111
 
96
112
  @actions << [:keyboard, :release, args]
97
113
  self
@@ -106,22 +122,23 @@ module Selenium
106
122
  #
107
123
  # @example Send the text "help" to an element
108
124
  #
109
- # el = driver.find_element(:id, "some_id")
125
+ # el = driver.find_element(id: "some_id")
110
126
  # driver.action.send_keys(el, "help").perform
111
127
  #
112
128
  # @example Send the text "help" to the currently focused element
113
129
  #
114
130
  # driver.action.send_keys("help").perform
115
131
  #
116
- # @param [Selenium::WebDriver::Element] element An optional element
117
- # @param [String] keys The keys to be sent.
118
- # @return [ActionBuilder] A self reference.
132
+ # @overload send_keys(keys)
133
+ # @param [Array, Symbol, String] keys The key(s) to press and release
134
+ # @overload send_keys(element, keys)
135
+ # @param [Element] element An optional element to move to first
136
+ # @param [Array, Symbol, String] keys The key(s) to press and release
137
+ # @return [ActionBuilder] A self reference
119
138
  #
120
139
 
121
140
  def send_keys(*args)
122
- if args.first.kind_of? Element
123
- @actions << [:mouse, :click, [args.shift]]
124
- end
141
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
125
142
 
126
143
  @actions << [:keyboard, :send_keys, args]
127
144
  self
@@ -135,10 +152,10 @@ module Selenium
135
152
  #
136
153
  # @example Clicking and holding on some element
137
154
  #
138
- # el = driver.find_element(:id, "some_id")
155
+ # el = driver.find_element(id: "some_id")
139
156
  # driver.action.click_and_hold(el).perform
140
157
  #
141
- # @param [Selenium::WebDriver::Element] element the element to move to and click.
158
+ # @param [Element] element the element to move to and click.
142
159
  # @return [ActionBuilder] A self reference.
143
160
  #
144
161
 
@@ -152,7 +169,7 @@ module Selenium
152
169
  #
153
170
  # @example Releasing an element after clicking and holding it
154
171
  #
155
- # el = driver.find_element(:id, "some_id")
172
+ # el = driver.find_element(id: "some_id")
156
173
  # driver.action.click_and_hold(el).release.perform
157
174
  #
158
175
  # @return [ActionBuilder] A self reference.
@@ -172,7 +189,7 @@ module Selenium
172
189
  #
173
190
  # @example Clicking on an element
174
191
  #
175
- # el = driver.find_element(:id, "some_id")
192
+ # el = driver.find_element(id: "some_id")
176
193
  # driver.action.click(el).perform
177
194
  #
178
195
  # @example Clicking at the current mouse position
@@ -195,7 +212,7 @@ module Selenium
195
212
  #
196
213
  # @example Double click an element
197
214
  #
198
- # el = driver.find_element(:id, "some_id")
215
+ # el = driver.find_element(id: "some_id")
199
216
  # driver.action.double_click(el).perform
200
217
  #
201
218
  # @param [Selenium::WebDriver::Element] element An optional element to move to.
@@ -216,12 +233,12 @@ module Selenium
216
233
  #
217
234
  # @example Scroll element into view and move the mouse to it
218
235
  #
219
- # el = driver.find_element(:id, "some_id")
236
+ # el = driver.find_element(id: "some_id")
220
237
  # driver.action.move_to(el).perform
221
238
  #
222
239
  # @example
223
240
  #
224
- # el = driver.find_element(:id, "some_id")
241
+ # el = driver.find_element(id: "some_id")
225
242
  # driver.action.move_to(el, 100, 100).perform
226
243
  #
227
244
  # @param [Selenium::WebDriver::Element] element to move to.
@@ -233,11 +250,11 @@ module Selenium
233
250
  #
234
251
 
235
252
  def move_to(element, right_by = nil, down_by = nil)
236
- if right_by && down_by
237
- @actions << [:mouse, :move_to, [element, right_by, down_by]]
238
- else
239
- @actions << [:mouse, :move_to, [element]]
240
- end
253
+ @actions << if right_by && down_by
254
+ [:mouse, :move_to, [element, Integer(right_by), Integer(down_by)]]
255
+ else
256
+ [:mouse, :move_to, [element]]
257
+ end
241
258
 
242
259
  self
243
260
  end
@@ -262,7 +279,7 @@ module Selenium
262
279
  #
263
280
 
264
281
  def move_by(right_by, down_by)
265
- @actions << [:mouse, :move_by, [right_by, down_by]]
282
+ @actions << [:mouse, :move_by, [Integer(right_by), Integer(down_by)]]
266
283
  self
267
284
  end
268
285
 
@@ -272,7 +289,7 @@ module Selenium
272
289
  #
273
290
  # @example Context-click at middle of given element
274
291
  #
275
- # el = driver.find_element(:id, "some_id")
292
+ # el = driver.find_element(id: "some_id")
276
293
  # driver.action.context_click(el).perform
277
294
  #
278
295
  # @param [Selenium::WebDriver::Element] element An element to context click.
@@ -291,8 +308,8 @@ module Selenium
291
308
  #
292
309
  # @example Drag and drop one element onto another
293
310
  #
294
- # el1 = driver.find_element(:id, "some_id1")
295
- # el2 = driver.find_element(:id, "some_id2")
311
+ # el1 = driver.find_element(id: "some_id1")
312
+ # el2 = driver.find_element(id: "some_id2")
296
313
  # driver.action.drag_and_drop(el1, el2).perform
297
314
  #
298
315
  # @param [Selenium::WebDriver::Element] source element to emulate button down at.
@@ -304,7 +321,7 @@ module Selenium
304
321
  def drag_and_drop(source, target)
305
322
  click_and_hold source
306
323
  move_to target
307
- release target
324
+ release
308
325
 
309
326
  self
310
327
  end
@@ -315,14 +332,12 @@ module Selenium
315
332
  #
316
333
  # @example Drag and drop an element by offset
317
334
  #
318
- # el = driver.find_element(:id, "some_id1")
335
+ # el = driver.find_element(id: "some_id1")
319
336
  # driver.action.drag_and_drop_by(el, 100, 100).perform
320
337
  #
321
338
  # @param [Selenium::WebDriver::Element] source Element to emulate button down at.
322
339
  # @param [Integer] right_by horizontal move offset.
323
340
  # @param [Integer] down_by vertical move offset.
324
- # @param [Selenium::WebDriver::Element] target Element to move to and release the
325
- # mouse at.
326
341
  # @return [ActionBuilder] A self reference.
327
342
  #
328
343
 
@@ -334,19 +349,17 @@ module Selenium
334
349
  self
335
350
  end
336
351
 
337
-
338
352
  #
339
353
  # Executes the actions added to the builder.
340
354
  #
341
355
 
342
356
  def perform
343
- @actions.each { |receiver, method, args|
357
+ @actions.each do |receiver, method, args|
344
358
  @devices.fetch(receiver).__send__(method, *args)
345
- }
359
+ end
346
360
 
347
361
  nil
348
362
  end
349
-
350
363
  end # ActionBuilder
351
364
  end # WebDriver
352
365
  end # Selenium
@@ -1,30 +1,47 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  class Alert
4
-
5
23
  def initialize(bridge)
6
24
  @bridge = bridge
7
25
 
8
26
  # fail fast if the alert doesn't exist
9
- bridge.getAlertText
27
+ bridge.alert_text
10
28
  end
11
29
 
12
30
  def accept
13
- @bridge.acceptAlert
31
+ @bridge.accept_alert
14
32
  end
15
33
 
16
34
  def dismiss
17
- @bridge.dismissAlert
35
+ @bridge.dismiss_alert
18
36
  end
19
37
 
20
38
  def send_keys(keys)
21
- @bridge.setAlertValue keys
39
+ @bridge.alert = keys
22
40
  end
23
41
 
24
42
  def text
25
- @bridge.getAlertText
43
+ @bridge.alert_text
26
44
  end
27
-
28
45
  end # Alert
29
46
  end # WebDriver
30
- end # Selenium
47
+ end # Selenium
@@ -1,6 +1,24 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
-
4
22
  #
5
23
  # Shared across bridges
6
24
  #
@@ -8,52 +26,50 @@ module Selenium
8
26
  #
9
27
 
10
28
  module BridgeHelper
11
-
12
29
  def unwrap_script_result(arg)
13
30
  case arg
14
31
  when Array
15
32
  arg.map { |e| unwrap_script_result(e) }
16
33
  when Hash
17
- if id = element_id_from(arg)
18
- Element.new self, id
19
- else
20
- arg.each { |k, v| arg[k] = unwrap_script_result(v) }
21
- end
34
+ element_id = element_id_from(arg)
35
+ return Element.new(self, element_id) if element_id
36
+
37
+ arg.each { |k, v| arg[k] = unwrap_script_result(v) }
22
38
  else
23
39
  arg
24
40
  end
25
41
  end
26
42
 
27
43
  def element_id_from(id)
28
- id['ELEMENT']
44
+ id['ELEMENT'] || id['element-6066-11e4-a52e-4f735466cecf']
29
45
  end
30
46
 
31
47
  def parse_cookie_string(str)
32
48
  result = {
33
- 'name' => '',
34
- 'value' => '',
35
- 'domain' => '',
36
- 'path' => '',
49
+ 'name' => '',
50
+ 'value' => '',
51
+ 'domain' => '',
52
+ 'path' => '',
37
53
  'expires' => '',
38
- 'secure' => false
54
+ 'secure' => false
39
55
  }
40
56
 
41
- str.split(";").each do |attribute|
42
- if attribute.include? "="
43
- key, value = attribute.strip.split("=", 2)
57
+ str.split(';').each do |attribute|
58
+ if attribute.include? '='
59
+ key, value = attribute.strip.split('=', 2)
44
60
  if result['name'].empty?
45
61
  result['name'] = key
46
62
  result['value'] = value
47
63
  elsif key == 'domain' && value.strip =~ /^\.(.+)/
48
- result['domain'] = $1
64
+ result['domain'] = Regexp.last_match(1)
49
65
  elsif key && value
50
66
  result[key] = value
51
67
  end
52
- elsif attribute == "secure"
68
+ elsif attribute == 'secure'
53
69
  result['secure'] = true
54
70
  end
55
71
 
56
- unless [nil, "", "0"].include?(result['expires'])
72
+ unless [nil, '', '0'].include?(result['expires'])
57
73
  # firefox stores expiry as number of seconds
58
74
  result['expires'] = Time.at(result['expires'].to_i)
59
75
  end
@@ -61,7 +77,6 @@ module Selenium
61
77
 
62
78
  result
63
79
  end
64
-
65
80
  end # BridgeHelper
66
81
  end # WebDriver
67
82
  end # Selenium