selenium-webdriver 2.53.4 → 3.8.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 (152) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +363 -10
  3. data/LICENSE +1 -1
  4. data/README.md +2 -3
  5. data/lib/selenium-webdriver.rb +0 -2
  6. data/lib/selenium/server.rb +69 -70
  7. data/lib/selenium/webdriver.rb +32 -23
  8. data/lib/selenium/webdriver/atoms.rb +18 -0
  9. data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
  10. data/lib/selenium/webdriver/chrome.rb +8 -6
  11. data/lib/selenium/webdriver/chrome/driver.rb +112 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +168 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +17 -17
  14. data/lib/selenium/webdriver/chrome/service.rb +22 -89
  15. data/lib/selenium/webdriver/common.rb +13 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +49 -57
  17. data/lib/selenium/webdriver/common/alert.rb +5 -15
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
  19. data/lib/selenium/webdriver/common/driver.rb +53 -68
  20. data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
  21. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
  22. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
  23. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
  24. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
  25. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
  26. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
  27. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
  28. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
  29. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
  30. data/lib/selenium/webdriver/common/element.rb +57 -39
  31. data/lib/selenium/webdriver/common/error.rb +204 -106
  32. data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
  33. data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
  34. data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
  35. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
  36. data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
  37. data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
  38. data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
  39. data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
  40. data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
  41. data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
  42. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
  43. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
  44. data/lib/selenium/webdriver/common/keyboard.rb +7 -14
  45. data/lib/selenium/webdriver/common/keys.rb +99 -82
  46. data/lib/selenium/webdriver/common/log_entry.rb +3 -6
  47. data/lib/selenium/webdriver/common/logger.rb +140 -0
  48. data/lib/selenium/webdriver/common/logs.rb +2 -6
  49. data/lib/selenium/webdriver/common/mouse.rb +9 -14
  50. data/lib/selenium/webdriver/common/navigation.rb +2 -6
  51. data/lib/selenium/webdriver/common/options.rb +20 -23
  52. data/lib/selenium/webdriver/common/platform.rb +70 -97
  53. data/lib/selenium/webdriver/common/port_prober.rb +3 -4
  54. data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
  55. data/lib/selenium/webdriver/common/proxy.rb +58 -72
  56. data/lib/selenium/webdriver/common/search_context.rb +22 -29
  57. data/lib/selenium/webdriver/common/service.rb +161 -0
  58. data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
  59. data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
  60. data/lib/selenium/webdriver/common/target_locator.rb +11 -15
  61. data/lib/selenium/webdriver/common/timeouts.rb +4 -8
  62. data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
  63. data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
  64. data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
  65. data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
  66. data/lib/selenium/webdriver/common/wait.rb +6 -13
  67. data/lib/selenium/webdriver/common/window.rb +48 -17
  68. data/lib/selenium/webdriver/common/zipper.rb +6 -10
  69. data/lib/selenium/webdriver/edge.rb +5 -12
  70. data/lib/selenium/webdriver/edge/bridge.rb +32 -63
  71. data/lib/selenium/webdriver/edge/driver.rb +73 -0
  72. data/lib/selenium/webdriver/edge/service.rb +18 -87
  73. data/lib/selenium/webdriver/firefox.rb +20 -11
  74. data/lib/selenium/webdriver/firefox/binary.rb +40 -56
  75. data/lib/selenium/webdriver/firefox/driver.rb +48 -0
  76. data/lib/selenium/webdriver/firefox/extension.rb +18 -8
  77. data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
  78. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  79. data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
  80. data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
  81. data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
  82. data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
  83. data/lib/selenium/webdriver/firefox/options.rb +149 -0
  84. data/lib/selenium/webdriver/firefox/profile.rb +46 -46
  85. data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
  86. data/lib/selenium/webdriver/firefox/service.rb +23 -83
  87. data/lib/selenium/webdriver/firefox/util.rb +0 -4
  88. data/lib/selenium/webdriver/ie.rb +4 -8
  89. data/lib/selenium/webdriver/ie/driver.rb +90 -0
  90. data/lib/selenium/webdriver/ie/options.rb +136 -0
  91. data/lib/selenium/webdriver/ie/service.rb +58 -0
  92. data/lib/selenium/webdriver/remote.rb +8 -16
  93. data/lib/selenium/webdriver/remote/bridge.rb +96 -565
  94. data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
  95. data/lib/selenium/webdriver/remote/driver.rb +49 -0
  96. data/lib/selenium/webdriver/remote/http/common.rb +22 -20
  97. data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
  98. data/lib/selenium/webdriver/remote/http/default.rb +54 -41
  99. data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
  100. data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
  101. data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
  102. data/lib/selenium/webdriver/remote/response.rb +39 -27
  103. data/lib/selenium/webdriver/remote/server_error.rb +1 -5
  104. data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
  105. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
  106. data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
  107. data/lib/selenium/webdriver/safari.rb +20 -29
  108. data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
  109. data/lib/selenium/webdriver/safari/service.rb +57 -0
  110. data/lib/selenium/webdriver/support.rb +1 -2
  111. data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
  112. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
  113. data/lib/selenium/webdriver/support/color.rb +57 -42
  114. data/lib/selenium/webdriver/support/escaper.rb +41 -0
  115. data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
  116. data/lib/selenium/webdriver/support/select.rb +33 -86
  117. data/selenium-webdriver.gemspec +22 -25
  118. metadata +254 -261
  119. data/lib/selenium-client.rb +0 -21
  120. data/lib/selenium/client.rb +0 -57
  121. data/lib/selenium/client/base.rb +0 -151
  122. data/lib/selenium/client/driver.rb +0 -29
  123. data/lib/selenium/client/errors.rb +0 -28
  124. data/lib/selenium/client/extensions.rb +0 -132
  125. data/lib/selenium/client/idiomatic.rb +0 -507
  126. data/lib/selenium/client/javascript_expression_builder.rb +0 -135
  127. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
  128. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
  129. data/lib/selenium/client/legacy_driver.rb +0 -1722
  130. data/lib/selenium/client/protocol.rb +0 -123
  131. data/lib/selenium/client/selenium_helper.rb +0 -49
  132. data/lib/selenium/rake/server_task.rb +0 -176
  133. data/lib/selenium/webdriver/android/bridge.rb +0 -68
  134. data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
  135. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
  136. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
  137. data/lib/selenium/webdriver/common/html5/location.rb +0 -19
  138. data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
  139. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
  140. data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
  141. data/lib/selenium/webdriver/ie/bridge.rb +0 -88
  142. data/lib/selenium/webdriver/ie/server.rb +0 -133
  143. data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
  144. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
  145. data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
  146. data/lib/selenium/webdriver/remote/commands.rb +0 -211
  147. data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
  148. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
  149. data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
  150. data/lib/selenium/webdriver/safari/bridge.rb +0 -135
  151. data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
  152. data/lib/selenium/webdriver/safari/server.rb +0 -187
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -20,107 +18,42 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Chrome
23
-
24
21
  #
25
22
  # @api private
26
23
  #
27
24
 
28
- class Service
29
- START_TIMEOUT = 20
30
- SOCKET_LOCK_TIMEOUT = 45
31
- STOP_TIMEOUT = 5
32
- DEFAULT_PORT = 9515
33
- 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 https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver."
34
-
35
- def self.executable_path
36
- @executable_path ||= (
37
- path = Platform.find_binary "chromedriver"
38
- path or raise Error::WebDriverError, MISSING_TEXT
39
- Platform.assert_executable path
40
-
41
- path
42
- )
43
- end
44
-
45
- def self.executable_path=(path)
46
- Platform.assert_executable path
47
- @executable_path = path
48
- end
49
-
50
- def self.default_service(*extra_args)
51
- new executable_path, DEFAULT_PORT, *extra_args
52
- end
53
-
54
- def initialize(executable_path, port, *extra_args)
55
- @executable_path = executable_path
56
- @host = Platform.localhost
57
- @port = Integer(port)
58
-
59
- raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
60
-
61
- @extra_args = extra_args
62
- end
63
-
64
- def start
65
- Platform.exit_hook { stop } # make sure we don't leave the server running
66
-
67
- socket_lock.locked do
68
- find_free_port
69
- start_process
70
- connect_until_stable
71
- end
72
- end
73
-
74
- def stop
75
- return if @process.nil? || @process.exited?
76
-
77
- Net::HTTP.start(@host, @port) do |http|
78
- http.open_timeout = STOP_TIMEOUT / 2
79
- http.read_timeout = STOP_TIMEOUT / 2
80
-
81
- http.get("/shutdown")
82
- end
83
- ensure
84
- stop_process
85
- end
86
-
87
- def uri
88
- URI.parse "http://#{@host}:#{@port}"
89
- end
25
+ class Service < WebDriver::Service
26
+ DEFAULT_PORT = 9515
27
+ @executable = 'chromedriver'.freeze
28
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
29
+ Unable to find chromedriver. Please download the server from
30
+ http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH.
31
+ More info at https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver.
32
+ ERROR
90
33
 
91
34
  private
92
35
 
93
- def find_free_port
94
- @port = PortProber.above @port
95
- end
96
-
97
36
  def start_process
98
- server_command = [@executable_path, "--port=#{@port}", *@extra_args]
99
- @process = ChildProcess.build(*server_command)
100
-
101
- @process.io.inherit! if $DEBUG == true
37
+ @process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
38
+ @process.leader = true unless Platform.windows?
102
39
  @process.start
103
40
  end
104
41
 
105
- def stop_process
106
- @process.poll_for_exit STOP_TIMEOUT
107
- rescue ChildProcess::TimeoutError
108
- @process.stop STOP_TIMEOUT
42
+ def cannot_connect_error_text
43
+ "unable to connect to chromedriver #{@host}:#{@port}"
109
44
  end
110
45
 
111
- def connect_until_stable
112
- socket_poller = SocketPoller.new @host, @port, START_TIMEOUT
113
-
114
- unless socket_poller.connected?
115
- raise Error::WebDriverError, "unable to connect to chromedriver #{@host}:#{@port}"
116
- end
46
+ def extract_service_args(driver_opts)
47
+ driver_args = super
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
117
55
  end
118
-
119
- def socket_lock
120
- @socket_lock ||= SocketLock.new(@port - 1, SOCKET_LOCK_TIMEOUT)
121
- end
122
-
123
56
  end # Service
124
57
  end # Chrome
125
58
  end # WebDriver
126
- end # Service
59
+ end # Selenium
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -17,14 +15,12 @@
17
15
  # specific language governing permissions and limitations
18
16
  # under the License.
19
17
 
20
- require 'selenium/webdriver/common/core_ext/dir'
21
- require 'selenium/webdriver/common/core_ext/base64'
22
- require 'selenium/webdriver/common/w3c_error'
23
18
  require 'selenium/webdriver/common/error'
24
19
  require 'selenium/webdriver/common/platform'
25
20
  require 'selenium/webdriver/common/proxy'
26
21
  require 'selenium/webdriver/common/log_entry'
27
22
  require 'selenium/webdriver/common/file_reaper'
23
+ require 'selenium/webdriver/common/service'
28
24
  require 'selenium/webdriver/common/socket_lock'
29
25
  require 'selenium/webdriver/common/socket_poller'
30
26
  require 'selenium/webdriver/common/port_prober'
@@ -38,17 +34,21 @@ require 'selenium/webdriver/common/target_locator'
38
34
  require 'selenium/webdriver/common/navigation'
39
35
  require 'selenium/webdriver/common/timeouts'
40
36
  require 'selenium/webdriver/common/window'
37
+ require 'selenium/webdriver/common/logger'
41
38
  require 'selenium/webdriver/common/logs'
42
39
  require 'selenium/webdriver/common/options'
40
+ require 'selenium/webdriver/common/w3c_options'
43
41
  require 'selenium/webdriver/common/search_context'
44
42
  require 'selenium/webdriver/common/action_builder'
43
+ require 'selenium/webdriver/common/interactions/key_actions'
44
+ require 'selenium/webdriver/common/interactions/pointer_actions'
45
+ require 'selenium/webdriver/common/w3c_action_builder'
45
46
  require 'selenium/webdriver/common/touch_action_builder'
46
47
  require 'selenium/webdriver/common/html5/shared_web_storage'
47
48
  require 'selenium/webdriver/common/html5/local_storage'
48
49
  require 'selenium/webdriver/common/html5/session_storage'
49
50
  require 'selenium/webdriver/common/driver_extensions/takes_screenshot'
50
51
  require 'selenium/webdriver/common/driver_extensions/rotatable'
51
- require 'selenium/webdriver/common/driver_extensions/has_input_devices'
52
52
  require 'selenium/webdriver/common/driver_extensions/has_web_storage'
53
53
  require 'selenium/webdriver/common/driver_extensions/has_location'
54
54
  require 'selenium/webdriver/common/driver_extensions/has_session_id'
@@ -56,6 +56,13 @@ require 'selenium/webdriver/common/driver_extensions/has_touch_screen'
56
56
  require 'selenium/webdriver/common/driver_extensions/has_remote_status'
57
57
  require 'selenium/webdriver/common/driver_extensions/has_network_connection'
58
58
  require 'selenium/webdriver/common/driver_extensions/uploads_files'
59
+ require 'selenium/webdriver/common/driver_extensions/has_addons'
60
+ require 'selenium/webdriver/common/interactions/interactions'
61
+ require 'selenium/webdriver/common/interactions/input_device'
62
+ require 'selenium/webdriver/common/interactions/interaction'
63
+ require 'selenium/webdriver/common/interactions/none_input'
64
+ require 'selenium/webdriver/common/interactions/key_input'
65
+ require 'selenium/webdriver/common/interactions/pointer_input'
59
66
  require 'selenium/webdriver/common/keys'
60
67
  require 'selenium/webdriver/common/bridge_helper'
61
68
  require 'selenium/webdriver/common/profile_helper'
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -19,14 +17,11 @@
19
17
 
20
18
  module Selenium
21
19
  module WebDriver
22
-
23
20
  #
24
21
  # The ActionBuilder provides the user a way to set up and perform
25
22
  # complex user interactions.
26
23
  #
27
- # This class should not be instantiated directly, but is created by
28
- # Selenium::WebDriver::DriverExtensions::HasInputDevices#action, which
29
- # is available on Driver instances that support the user interaction API.
24
+ # This class should not be instantiated directly, but is created by Driver#action
30
25
  #
31
26
  # @example
32
27
  #
@@ -39,18 +34,17 @@ module Selenium
39
34
  #
40
35
 
41
36
  class ActionBuilder
42
-
43
37
  #
44
38
  # @api private
45
39
  #
46
40
 
47
41
  def initialize(mouse, keyboard)
48
- @devices = {
49
- :mouse => mouse,
50
- :keyboard => keyboard
42
+ @devices = {
43
+ mouse: mouse,
44
+ keyboard: keyboard
51
45
  }
52
46
 
53
- @actions = []
47
+ @actions = []
54
48
  end
55
49
 
56
50
  #
@@ -70,19 +64,19 @@ module Selenium
70
64
  #
71
65
  # @example Press a key on an element
72
66
  #
73
- # el = driver.find_element(:id, "some_id")
67
+ # el = driver.find_element(id: "some_id")
74
68
  # driver.action.key_down(el, :shift).perform
75
69
  #
76
- # @param [:shift, :alt, :control, :command, :meta] The key to press.
77
- # @param [Selenium::WebDriver::Element] element An optional element
70
+ # @overload key_down(key)
71
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
72
+ # @overload key_down(element, key)
73
+ # @param [Element] element An optional element to move to first
74
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
78
75
  # @raise [ArgumentError] if the given key is not a modifier
79
- # @return [ActionBuilder] A self reference.
80
- #
76
+ # @return [ActionBuilder] A self reference
81
77
 
82
78
  def key_down(*args)
83
- if args.first.kind_of? Element
84
- @actions << [:mouse, :click, [args.shift]]
85
- end
79
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
86
80
 
87
81
  @actions << [:keyboard, :press, args]
88
82
  self
@@ -98,19 +92,20 @@ module Selenium
98
92
  #
99
93
  # @example Release a key from an element
100
94
  #
101
- # el = driver.find_element(:id, "some_id")
95
+ # el = driver.find_element(id: "some_id")
102
96
  # driver.action.key_up(el, :alt).perform
103
97
  #
104
- # @param [:shift, :alt, :control, :command, :meta] The modifier key to release.
105
- # @param [Selenium::WebDriver::Element] element An optional element
106
- # @raise [ArgumentError] if the given key is not a modifier key
107
- # @return [ActionBuilder] A self reference.
98
+ # @overload key_up(key)
99
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
100
+ # @overload key_up(element, key)
101
+ # @param [Element] element An optional element to move to first
102
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
103
+ # @raise [ArgumentError] if the given key is not a modifier
104
+ # @return [ActionBuilder] A self reference
108
105
  #
109
106
 
110
107
  def key_up(*args)
111
- if args.first.kind_of? Element
112
- @actions << [:mouse, :click, [args.shift]]
113
- end
108
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
114
109
 
115
110
  @actions << [:keyboard, :release, args]
116
111
  self
@@ -125,22 +120,23 @@ module Selenium
125
120
  #
126
121
  # @example Send the text "help" to an element
127
122
  #
128
- # el = driver.find_element(:id, "some_id")
123
+ # el = driver.find_element(id: "some_id")
129
124
  # driver.action.send_keys(el, "help").perform
130
125
  #
131
126
  # @example Send the text "help" to the currently focused element
132
127
  #
133
128
  # driver.action.send_keys("help").perform
134
129
  #
135
- # @param [Selenium::WebDriver::Element] element An optional element
136
- # @param [String] keys The keys to be sent.
137
- # @return [ActionBuilder] A self reference.
130
+ # @overload send_keys(keys)
131
+ # @param [Array, Symbol, String] keys The key(s) to press and release
132
+ # @overload send_keys(element, keys)
133
+ # @param [Element] element An optional element to move to first
134
+ # @param [Array, Symbol, String] keys The key(s) to press and release
135
+ # @return [ActionBuilder] A self reference
138
136
  #
139
137
 
140
138
  def send_keys(*args)
141
- if args.first.kind_of? Element
142
- @actions << [:mouse, :click, [args.shift]]
143
- end
139
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
144
140
 
145
141
  @actions << [:keyboard, :send_keys, args]
146
142
  self
@@ -154,10 +150,10 @@ module Selenium
154
150
  #
155
151
  # @example Clicking and holding on some element
156
152
  #
157
- # el = driver.find_element(:id, "some_id")
153
+ # el = driver.find_element(id: "some_id")
158
154
  # driver.action.click_and_hold(el).perform
159
155
  #
160
- # @param [Selenium::WebDriver::Element] element the element to move to and click.
156
+ # @param [Element] element the element to move to and click.
161
157
  # @return [ActionBuilder] A self reference.
162
158
  #
163
159
 
@@ -171,7 +167,7 @@ module Selenium
171
167
  #
172
168
  # @example Releasing an element after clicking and holding it
173
169
  #
174
- # el = driver.find_element(:id, "some_id")
170
+ # el = driver.find_element(id: "some_id")
175
171
  # driver.action.click_and_hold(el).release.perform
176
172
  #
177
173
  # @return [ActionBuilder] A self reference.
@@ -191,7 +187,7 @@ module Selenium
191
187
  #
192
188
  # @example Clicking on an element
193
189
  #
194
- # el = driver.find_element(:id, "some_id")
190
+ # el = driver.find_element(id: "some_id")
195
191
  # driver.action.click(el).perform
196
192
  #
197
193
  # @example Clicking at the current mouse position
@@ -214,7 +210,7 @@ module Selenium
214
210
  #
215
211
  # @example Double click an element
216
212
  #
217
- # el = driver.find_element(:id, "some_id")
213
+ # el = driver.find_element(id: "some_id")
218
214
  # driver.action.double_click(el).perform
219
215
  #
220
216
  # @param [Selenium::WebDriver::Element] element An optional element to move to.
@@ -235,12 +231,12 @@ module Selenium
235
231
  #
236
232
  # @example Scroll element into view and move the mouse to it
237
233
  #
238
- # el = driver.find_element(:id, "some_id")
234
+ # el = driver.find_element(id: "some_id")
239
235
  # driver.action.move_to(el).perform
240
236
  #
241
237
  # @example
242
238
  #
243
- # el = driver.find_element(:id, "some_id")
239
+ # el = driver.find_element(id: "some_id")
244
240
  # driver.action.move_to(el, 100, 100).perform
245
241
  #
246
242
  # @param [Selenium::WebDriver::Element] element to move to.
@@ -252,11 +248,11 @@ module Selenium
252
248
  #
253
249
 
254
250
  def move_to(element, right_by = nil, down_by = nil)
255
- if right_by && down_by
256
- @actions << [:mouse, :move_to, [element, right_by, down_by]]
257
- else
258
- @actions << [:mouse, :move_to, [element]]
259
- end
251
+ @actions << if right_by && down_by
252
+ [:mouse, :move_to, [element, Integer(right_by), Integer(down_by)]]
253
+ else
254
+ [:mouse, :move_to, [element]]
255
+ end
260
256
 
261
257
  self
262
258
  end
@@ -281,7 +277,7 @@ module Selenium
281
277
  #
282
278
 
283
279
  def move_by(right_by, down_by)
284
- @actions << [:mouse, :move_by, [right_by, down_by]]
280
+ @actions << [:mouse, :move_by, [Integer(right_by), Integer(down_by)]]
285
281
  self
286
282
  end
287
283
 
@@ -291,7 +287,7 @@ module Selenium
291
287
  #
292
288
  # @example Context-click at middle of given element
293
289
  #
294
- # el = driver.find_element(:id, "some_id")
290
+ # el = driver.find_element(id: "some_id")
295
291
  # driver.action.context_click(el).perform
296
292
  #
297
293
  # @param [Selenium::WebDriver::Element] element An element to context click.
@@ -310,8 +306,8 @@ module Selenium
310
306
  #
311
307
  # @example Drag and drop one element onto another
312
308
  #
313
- # el1 = driver.find_element(:id, "some_id1")
314
- # el2 = driver.find_element(:id, "some_id2")
309
+ # el1 = driver.find_element(id: "some_id1")
310
+ # el2 = driver.find_element(id: "some_id2")
315
311
  # driver.action.drag_and_drop(el1, el2).perform
316
312
  #
317
313
  # @param [Selenium::WebDriver::Element] source element to emulate button down at.
@@ -334,14 +330,12 @@ module Selenium
334
330
  #
335
331
  # @example Drag and drop an element by offset
336
332
  #
337
- # el = driver.find_element(:id, "some_id1")
333
+ # el = driver.find_element(id: "some_id1")
338
334
  # driver.action.drag_and_drop_by(el, 100, 100).perform
339
335
  #
340
336
  # @param [Selenium::WebDriver::Element] source Element to emulate button down at.
341
337
  # @param [Integer] right_by horizontal move offset.
342
338
  # @param [Integer] down_by vertical move offset.
343
- # @param [Selenium::WebDriver::Element] target Element to move to and release the
344
- # mouse at.
345
339
  # @return [ActionBuilder] A self reference.
346
340
  #
347
341
 
@@ -353,19 +347,17 @@ module Selenium
353
347
  self
354
348
  end
355
349
 
356
-
357
350
  #
358
351
  # Executes the actions added to the builder.
359
352
  #
360
353
 
361
354
  def perform
362
- @actions.each { |receiver, method, args|
355
+ @actions.each do |receiver, method, args|
363
356
  @devices.fetch(receiver).__send__(method, *args)
364
- }
357
+ end
365
358
 
366
359
  nil
367
360
  end
368
-
369
361
  end # ActionBuilder
370
362
  end # WebDriver
371
363
  end # Selenium