selenium-webdriver 2.53.3 → 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 (162) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +665 -8
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/README.md +2 -3
  6. data/lib/selenium/server.rb +76 -73
  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/{phantomjs.rb → atoms.rb} +10 -14
  10. data/lib/selenium/webdriver/chrome/bridge.rb +30 -101
  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 +21 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +26 -93
  15. data/lib/selenium/webdriver/chrome.rb +15 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +52 -58
  17. data/lib/selenium/webdriver/common/alert.rb +7 -15
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +18 -22
  19. data/lib/selenium/webdriver/common/driver.rb +72 -72
  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_input_devices.rb → has_debugger.rb} +11 -27
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +6 -10
  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 +7 -8
  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 +2 -4
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -4
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +3 -5
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -5
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +6 -9
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +9 -7
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -8
  34. data/lib/selenium/webdriver/common/element.rb +59 -39
  35. data/lib/selenium/webdriver/common/error.rb +259 -104
  36. data/lib/selenium/webdriver/common/file_reaper.rb +6 -14
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +8 -10
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +8 -10
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +8 -16
  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/{safari/browser.rb → common/interactions/interactions.rb} +17 -14
  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/{android.rb → common/interactions/none_input.rb} +14 -6
  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 +10 -14
  49. data/lib/selenium/webdriver/common/keys.rb +102 -82
  50. data/lib/selenium/webdriver/common/log_entry.rb +7 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +4 -6
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +12 -14
  55. data/lib/selenium/webdriver/common/navigation.rb +4 -6
  56. data/lib/selenium/webdriver/common/options.rb +26 -127
  57. data/lib/selenium/webdriver/common/platform.rb +75 -101
  58. data/lib/selenium/webdriver/common/port_prober.rb +7 -19
  59. data/lib/selenium/webdriver/common/profile_helper.rb +8 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +68 -74
  61. data/lib/selenium/webdriver/common/search_context.rb +28 -37
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +15 -16
  64. data/lib/selenium/webdriver/common/socket_poller.rb +30 -28
  65. data/lib/selenium/webdriver/common/target_locator.rb +16 -18
  66. data/lib/selenium/webdriver/common/timeouts.rb +6 -8
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -10
  68. data/lib/selenium/webdriver/common/touch_screen.rb +22 -23
  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 +17 -16
  72. data/lib/selenium/webdriver/common/window.rb +50 -17
  73. data/lib/selenium/webdriver/common/zipper.rb +9 -13
  74. data/lib/selenium/webdriver/common.rb +21 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +34 -63
  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 +23 -95
  79. data/lib/selenium/webdriver/edge.rb +13 -13
  80. data/lib/selenium/webdriver/firefox/binary.rb +45 -60
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -12
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +20 -10
  85. data/lib/selenium/webdriver/firefox/launcher.rb +16 -22
  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 +47 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +11 -18
  92. data/lib/selenium/webdriver/firefox/service.rb +24 -95
  93. data/lib/selenium/webdriver/firefox/util.rb +2 -4
  94. data/lib/selenium/webdriver/firefox.rb +27 -12
  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 +12 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +100 -564
  100. data/lib/selenium/webdriver/remote/capabilities.rb +98 -100
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +34 -22
  103. data/lib/selenium/webdriver/remote/http/curb.rb +13 -14
  104. data/lib/selenium/webdriver/remote/http/default.rb +62 -43
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +12 -9
  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 +48 -28
  109. data/lib/selenium/webdriver/remote/server_error.rb +3 -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 +10 -16
  114. data/lib/selenium/webdriver/safari/bridge.rb +17 -101
  115. data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +27 -25
  116. data/lib/selenium/webdriver/safari/options.rb +29 -31
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +27 -27
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +19 -4
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +3 -5
  121. data/lib/selenium/webdriver/support/color.rb +60 -43
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +39 -41
  124. data/lib/selenium/webdriver/support/select.rb +45 -97
  125. data/lib/selenium/webdriver/support.rb +3 -2
  126. data/lib/selenium/webdriver/{iphone.rb → version.rb} +3 -7
  127. data/lib/selenium/webdriver.rb +36 -23
  128. data/lib/selenium-webdriver.rb +2 -2
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -262
  131. data/lib/selenium/client/base.rb +0 -151
  132. data/lib/selenium/client/driver.rb +0 -29
  133. data/lib/selenium/client/errors.rb +0 -28
  134. data/lib/selenium/client/extensions.rb +0 -132
  135. data/lib/selenium/client/idiomatic.rb +0 -507
  136. data/lib/selenium/client/javascript_expression_builder.rb +0 -135
  137. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
  138. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
  139. data/lib/selenium/client/legacy_driver.rb +0 -1722
  140. data/lib/selenium/client/protocol.rb +0 -123
  141. data/lib/selenium/client/selenium_helper.rb +0 -49
  142. data/lib/selenium/client.rb +0 -57
  143. data/lib/selenium/rake/server_task.rb +0 -176
  144. data/lib/selenium/webdriver/android/bridge.rb +0 -68
  145. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
  146. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
  147. data/lib/selenium/webdriver/common/html5/location.rb +0 -19
  148. data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
  149. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
  150. data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
  151. data/lib/selenium/webdriver/ie/bridge.rb +0 -88
  152. data/lib/selenium/webdriver/ie/server.rb +0 -133
  153. data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
  154. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
  155. data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
  156. data/lib/selenium/webdriver/remote/commands.rb +0 -211
  157. data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
  158. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
  159. data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
  160. data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
  161. data/lib/selenium/webdriver/safari/server.rb +0 -187
  162. data/lib/selenium-client.rb +0 -21
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -20,107 +20,40 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Chrome
23
-
24
23
  #
25
24
  # @api private
26
25
  #
27
26
 
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
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
86
36
 
87
- def uri
88
- URI.parse "http://#{@host}:#{@port}"
37
+ def self.driver_path=(path)
38
+ Platform.assert_executable path if path.is_a?(String)
39
+ @driver_path = path
89
40
  end
90
41
 
91
42
  private
92
43
 
93
- def find_free_port
94
- @port = PortProber.above @port
95
- end
96
-
97
- 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
102
- @process.start
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
103
55
  end
104
-
105
- def stop_process
106
- @process.poll_for_exit STOP_TIMEOUT
107
- rescue ChildProcess::TimeoutError
108
- @process.stop STOP_TIMEOUT
109
- end
110
-
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
117
- 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,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -19,16 +19,24 @@
19
19
 
20
20
  require 'net/http'
21
21
 
22
- require 'selenium/webdriver/chrome/service'
23
22
  require 'selenium/webdriver/chrome/bridge'
23
+ require 'selenium/webdriver/chrome/driver'
24
24
  require 'selenium/webdriver/chrome/profile'
25
+ require 'selenium/webdriver/chrome/options'
25
26
 
26
27
  module Selenium
27
28
  module WebDriver
28
-
29
29
  module Chrome
30
30
  def self.driver_path=(path)
31
- 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
32
40
  end
33
41
 
34
42
  def self.path=(path)
@@ -39,7 +47,8 @@ module Selenium
39
47
  def self.path
40
48
  @path ||= nil
41
49
  end
42
-
43
50
  end # Chrome
44
51
  end # WebDriver
45
52
  end # Selenium
53
+
54
+ require 'selenium/webdriver/chrome/service'
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -19,14 +19,11 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
-
23
22
  #
24
23
  # The ActionBuilder provides the user a way to set up and perform
25
24
  # complex user interactions.
26
25
  #
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.
26
+ # This class should not be instantiated directly, but is created by Driver#action
30
27
  #
31
28
  # @example
32
29
  #
@@ -39,18 +36,17 @@ module Selenium
39
36
  #
40
37
 
41
38
  class ActionBuilder
42
-
43
39
  #
44
40
  # @api private
45
41
  #
46
42
 
47
43
  def initialize(mouse, keyboard)
48
- @devices = {
49
- :mouse => mouse,
50
- :keyboard => keyboard
44
+ @devices = {
45
+ mouse: mouse,
46
+ keyboard: keyboard
51
47
  }
52
48
 
53
- @actions = []
49
+ @actions = []
54
50
  end
55
51
 
56
52
  #
@@ -70,19 +66,19 @@ module Selenium
70
66
  #
71
67
  # @example Press a key on an element
72
68
  #
73
- # el = driver.find_element(:id, "some_id")
69
+ # el = driver.find_element(id: "some_id")
74
70
  # driver.action.key_down(el, :shift).perform
75
71
  #
76
- # @param [:shift, :alt, :control, :command, :meta] The key to press.
77
- # @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
78
77
  # @raise [ArgumentError] if the given key is not a modifier
79
- # @return [ActionBuilder] A self reference.
80
- #
78
+ # @return [ActionBuilder] A self reference
81
79
 
82
80
  def key_down(*args)
83
- if args.first.kind_of? Element
84
- @actions << [:mouse, :click, [args.shift]]
85
- end
81
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
86
82
 
87
83
  @actions << [:keyboard, :press, args]
88
84
  self
@@ -98,19 +94,20 @@ module Selenium
98
94
  #
99
95
  # @example Release a key from an element
100
96
  #
101
- # el = driver.find_element(:id, "some_id")
97
+ # el = driver.find_element(id: "some_id")
102
98
  # driver.action.key_up(el, :alt).perform
103
99
  #
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.
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
108
107
  #
109
108
 
110
109
  def key_up(*args)
111
- if args.first.kind_of? Element
112
- @actions << [:mouse, :click, [args.shift]]
113
- end
110
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
114
111
 
115
112
  @actions << [:keyboard, :release, args]
116
113
  self
@@ -125,22 +122,23 @@ module Selenium
125
122
  #
126
123
  # @example Send the text "help" to an element
127
124
  #
128
- # el = driver.find_element(:id, "some_id")
125
+ # el = driver.find_element(id: "some_id")
129
126
  # driver.action.send_keys(el, "help").perform
130
127
  #
131
128
  # @example Send the text "help" to the currently focused element
132
129
  #
133
130
  # driver.action.send_keys("help").perform
134
131
  #
135
- # @param [Selenium::WebDriver::Element] element An optional element
136
- # @param [String] keys The keys to be sent.
137
- # @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
138
138
  #
139
139
 
140
140
  def send_keys(*args)
141
- if args.first.kind_of? Element
142
- @actions << [:mouse, :click, [args.shift]]
143
- end
141
+ @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
144
142
 
145
143
  @actions << [:keyboard, :send_keys, args]
146
144
  self
@@ -154,10 +152,10 @@ module Selenium
154
152
  #
155
153
  # @example Clicking and holding on some element
156
154
  #
157
- # el = driver.find_element(:id, "some_id")
155
+ # el = driver.find_element(id: "some_id")
158
156
  # driver.action.click_and_hold(el).perform
159
157
  #
160
- # @param [Selenium::WebDriver::Element] element the element to move to and click.
158
+ # @param [Element] element the element to move to and click.
161
159
  # @return [ActionBuilder] A self reference.
162
160
  #
163
161
 
@@ -171,7 +169,7 @@ module Selenium
171
169
  #
172
170
  # @example Releasing an element after clicking and holding it
173
171
  #
174
- # el = driver.find_element(:id, "some_id")
172
+ # el = driver.find_element(id: "some_id")
175
173
  # driver.action.click_and_hold(el).release.perform
176
174
  #
177
175
  # @return [ActionBuilder] A self reference.
@@ -191,7 +189,7 @@ module Selenium
191
189
  #
192
190
  # @example Clicking on an element
193
191
  #
194
- # el = driver.find_element(:id, "some_id")
192
+ # el = driver.find_element(id: "some_id")
195
193
  # driver.action.click(el).perform
196
194
  #
197
195
  # @example Clicking at the current mouse position
@@ -214,7 +212,7 @@ module Selenium
214
212
  #
215
213
  # @example Double click an element
216
214
  #
217
- # el = driver.find_element(:id, "some_id")
215
+ # el = driver.find_element(id: "some_id")
218
216
  # driver.action.double_click(el).perform
219
217
  #
220
218
  # @param [Selenium::WebDriver::Element] element An optional element to move to.
@@ -235,12 +233,12 @@ module Selenium
235
233
  #
236
234
  # @example Scroll element into view and move the mouse to it
237
235
  #
238
- # el = driver.find_element(:id, "some_id")
236
+ # el = driver.find_element(id: "some_id")
239
237
  # driver.action.move_to(el).perform
240
238
  #
241
239
  # @example
242
240
  #
243
- # el = driver.find_element(:id, "some_id")
241
+ # el = driver.find_element(id: "some_id")
244
242
  # driver.action.move_to(el, 100, 100).perform
245
243
  #
246
244
  # @param [Selenium::WebDriver::Element] element to move to.
@@ -252,11 +250,11 @@ module Selenium
252
250
  #
253
251
 
254
252
  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
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
260
258
 
261
259
  self
262
260
  end
@@ -281,7 +279,7 @@ module Selenium
281
279
  #
282
280
 
283
281
  def move_by(right_by, down_by)
284
- @actions << [:mouse, :move_by, [right_by, down_by]]
282
+ @actions << [:mouse, :move_by, [Integer(right_by), Integer(down_by)]]
285
283
  self
286
284
  end
287
285
 
@@ -291,7 +289,7 @@ module Selenium
291
289
  #
292
290
  # @example Context-click at middle of given element
293
291
  #
294
- # el = driver.find_element(:id, "some_id")
292
+ # el = driver.find_element(id: "some_id")
295
293
  # driver.action.context_click(el).perform
296
294
  #
297
295
  # @param [Selenium::WebDriver::Element] element An element to context click.
@@ -310,8 +308,8 @@ module Selenium
310
308
  #
311
309
  # @example Drag and drop one element onto another
312
310
  #
313
- # el1 = driver.find_element(:id, "some_id1")
314
- # el2 = driver.find_element(:id, "some_id2")
311
+ # el1 = driver.find_element(id: "some_id1")
312
+ # el2 = driver.find_element(id: "some_id2")
315
313
  # driver.action.drag_and_drop(el1, el2).perform
316
314
  #
317
315
  # @param [Selenium::WebDriver::Element] source element to emulate button down at.
@@ -323,7 +321,7 @@ module Selenium
323
321
  def drag_and_drop(source, target)
324
322
  click_and_hold source
325
323
  move_to target
326
- release target
324
+ release
327
325
 
328
326
  self
329
327
  end
@@ -334,14 +332,12 @@ module Selenium
334
332
  #
335
333
  # @example Drag and drop an element by offset
336
334
  #
337
- # el = driver.find_element(:id, "some_id1")
335
+ # el = driver.find_element(id: "some_id1")
338
336
  # driver.action.drag_and_drop_by(el, 100, 100).perform
339
337
  #
340
338
  # @param [Selenium::WebDriver::Element] source Element to emulate button down at.
341
339
  # @param [Integer] right_by horizontal move offset.
342
340
  # @param [Integer] down_by vertical move offset.
343
- # @param [Selenium::WebDriver::Element] target Element to move to and release the
344
- # mouse at.
345
341
  # @return [ActionBuilder] A self reference.
346
342
  #
347
343
 
@@ -353,19 +349,17 @@ module Selenium
353
349
  self
354
350
  end
355
351
 
356
-
357
352
  #
358
353
  # Executes the actions added to the builder.
359
354
  #
360
355
 
361
356
  def perform
362
- @actions.each { |receiver, method, args|
357
+ @actions.each do |receiver, method, args|
363
358
  @devices.fetch(receiver).__send__(method, *args)
364
- }
359
+ end
365
360
 
366
361
  nil
367
362
  end
368
-
369
363
  end # ActionBuilder
370
364
  end # WebDriver
371
365
  end # Selenium
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -20,36 +20,28 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  class Alert
23
-
24
23
  def initialize(bridge)
25
24
  @bridge = bridge
26
25
 
27
26
  # fail fast if the alert doesn't exist
28
- bridge.getAlertText
27
+ bridge.alert_text
29
28
  end
30
29
 
31
30
  def accept
32
- @bridge.acceptAlert
31
+ @bridge.accept_alert
33
32
  end
34
33
 
35
34
  def dismiss
36
- @bridge.dismissAlert
35
+ @bridge.dismiss_alert
37
36
  end
38
37
 
39
38
  def send_keys(keys)
40
- @bridge.setAlertValue keys
39
+ @bridge.alert = keys
41
40
  end
42
41
 
43
42
  def text
44
- @bridge.getAlertText
43
+ @bridge.alert_text
45
44
  end
46
-
47
- def authenticate(username, password)
48
- @bridge.setAuthentication username: username, password: password
49
- accept
50
- end
51
-
52
45
  end # Alert
53
46
  end # WebDriver
54
47
  end # Selenium
55
-
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -19,7 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
-
23
22
  #
24
23
  # Shared across bridges
25
24
  #
@@ -27,52 +26,50 @@ module Selenium
27
26
  #
28
27
 
29
28
  module BridgeHelper
30
-
31
29
  def unwrap_script_result(arg)
32
30
  case arg
33
31
  when Array
34
32
  arg.map { |e| unwrap_script_result(e) }
35
33
  when Hash
36
- if id = element_id_from(arg)
37
- Element.new self, id
38
- else
39
- arg.each { |k, v| arg[k] = unwrap_script_result(v) }
40
- 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) }
41
38
  else
42
39
  arg
43
40
  end
44
41
  end
45
42
 
46
43
  def element_id_from(id)
47
- id['ELEMENT'] or id['element-6066-11e4-a52e-4f735466cecf']
44
+ id['ELEMENT'] || id['element-6066-11e4-a52e-4f735466cecf']
48
45
  end
49
46
 
50
47
  def parse_cookie_string(str)
51
48
  result = {
52
- 'name' => '',
53
- 'value' => '',
54
- 'domain' => '',
55
- 'path' => '',
49
+ 'name' => '',
50
+ 'value' => '',
51
+ 'domain' => '',
52
+ 'path' => '',
56
53
  'expires' => '',
57
- 'secure' => false
54
+ 'secure' => false
58
55
  }
59
56
 
60
- str.split(";").each do |attribute|
61
- if attribute.include? "="
62
- key, value = attribute.strip.split("=", 2)
57
+ str.split(';').each do |attribute|
58
+ if attribute.include? '='
59
+ key, value = attribute.strip.split('=', 2)
63
60
  if result['name'].empty?
64
61
  result['name'] = key
65
62
  result['value'] = value
66
63
  elsif key == 'domain' && value.strip =~ /^\.(.+)/
67
- result['domain'] = $1
64
+ result['domain'] = Regexp.last_match(1)
68
65
  elsif key && value
69
66
  result[key] = value
70
67
  end
71
- elsif attribute == "secure"
68
+ elsif attribute == 'secure'
72
69
  result['secure'] = true
73
70
  end
74
71
 
75
- unless [nil, "", "0"].include?(result['expires'])
72
+ unless [nil, '', '0'].include?(result['expires'])
76
73
  # firefox stores expiry as number of seconds
77
74
  result['expires'] = Time.at(result['expires'].to_i)
78
75
  end
@@ -80,7 +77,6 @@ module Selenium
80
77
 
81
78
  result
82
79
  end
83
-
84
80
  end # BridgeHelper
85
81
  end # WebDriver
86
82
  end # Selenium