selenium-webdriver 2.53.4 → 3.8.0

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