selenium-webdriver 2.45.0 → 3.142.7

Sign up to get free protection for your applications and to get access to all the features.
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