selenium-webdriver 2.45.0 → 3.142.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -1,3 +1,22 @@
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/https'
2
21
  require 'ipaddr'
3
22
 
@@ -5,37 +24,61 @@ module Selenium
5
24
  module WebDriver
6
25
  module Remote
7
26
  module Http
8
-
9
27
  # @api private
10
28
  class Default < Common
11
- attr_accessor :proxy
29
+ attr_writer :proxy
30
+
31
+ attr_accessor :open_timeout
32
+ attr_accessor :read_timeout
33
+
34
+ # Initializes object.
35
+ # Warning: Setting {#open_timeout} to non-nil values will cause a separate thread to spawn.
36
+ # Debuggers that freeze the process will not be able to evaluate any operations if that happens.
37
+ # @param [Numeric] open_timeout - Open timeout to apply to HTTP client.
38
+ # @param [Numeric] read_timeout - Read timeout (seconds) to apply to HTTP client.
39
+ def initialize(open_timeout: nil, read_timeout: nil)
40
+ @open_timeout = open_timeout
41
+ @read_timeout = read_timeout
42
+ end
43
+
44
+ # Maintaining backward compatibility.
45
+ # @param [Numeric] value - Timeout in seconds to apply to both open timeout and read timeouts.
46
+ # @deprecated Please set the specific desired timeout {#read_timeout} or {#open_timeout} directly.
47
+ def timeout=(value)
48
+ WebDriver.logger.deprecate ':timeout=', '#read_timeout= and #open_timeout='
49
+ self.open_timeout = value
50
+ self.read_timeout = value
51
+ end
52
+
53
+ def close
54
+ @http&.finish
55
+ end
12
56
 
13
57
  private
14
58
 
15
59
  def http
16
- @http ||= (
60
+ @http ||= begin
17
61
  http = new_http_client
18
- if server_url.scheme == "https"
62
+ if server_url.scheme == 'https'
19
63
  http.use_ssl = true
20
64
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
21
65
  end
22
66
 
23
- if @timeout
24
- http.open_timeout = @timeout
25
- http.read_timeout = @timeout
26
- end
67
+ # Defaulting open_timeout to nil to be consistent with Ruby 2.2 and earlier.
68
+ http.open_timeout = open_timeout
69
+ http.read_timeout = read_timeout if read_timeout
27
70
 
28
- http
29
- )
71
+ http.start
72
+ end
30
73
  end
31
74
 
32
75
  MAX_RETRIES = 3
33
76
 
34
77
  def request(verb, url, headers, payload, redirects = 0)
35
- request = new_request_for(verb, url, headers, payload)
36
-
37
78
  retries = 0
79
+
38
80
  begin
81
+ request = new_request_for(verb, url, headers, payload)
39
82
  response = response_for(request)
40
83
  rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EADDRINUSE
41
84
  # a retry is sometimes needed on Windows XP where we may quickly
@@ -47,20 +90,25 @@ module Selenium
47
90
  # http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
48
91
  raise if retries >= MAX_RETRIES
49
92
 
50
- request = new_request_for(verb, url, headers, payload)
51
93
  retries += 1
94
+ sleep 2
95
+ retry
96
+ rescue Errno::EADDRNOTAVAIL => ex
97
+ # a retry is sometimes needed when the port becomes temporarily unavailable
98
+ raise if retries >= MAX_RETRIES
52
99
 
100
+ retries += 1
101
+ sleep 2
53
102
  retry
54
103
  rescue Errno::ECONNREFUSED => ex
55
- if use_proxy?
56
- raise ex.class, "using proxy: #{proxy.http}"
57
- else
58
- raise
59
- end
104
+ raise ex.class, "using proxy: #{proxy.http}" if use_proxy?
105
+
106
+ raise
60
107
  end
61
108
 
62
- if response.kind_of? Net::HTTPRedirection
63
- raise Error::WebDriverError, "too many redirects" if redirects >= MAX_REDIRECTS
109
+ if response.is_a? Net::HTTPRedirection
110
+ raise Error::WebDriverError, 'too many redirects' if redirects >= MAX_REDIRECTS
111
+
64
112
  request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
65
113
  else
66
114
  create_response response.code, response.body, response.content_type
@@ -70,9 +118,7 @@ module Selenium
70
118
  def new_request_for(verb, url, headers, payload)
71
119
  req = Net::HTTP.const_get(verb.to_s.capitalize).new(url.path, headers)
72
120
 
73
- if server_url.userinfo
74
- req.basic_auth server_url.user, server_url.password
75
- end
121
+ req.basic_auth server_url.user, server_url.password if server_url.userinfo
76
122
 
77
123
  req.body = payload if payload
78
124
 
@@ -85,9 +131,8 @@ module Selenium
85
131
 
86
132
  def new_http_client
87
133
  if use_proxy?
88
- unless proxy.respond_to?(:http) && url = @proxy.http
89
- raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}"
90
- end
134
+ url = @proxy.http
135
+ raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}" unless proxy.respond_to?(:http) && url
91
136
 
92
137
  proxy = URI.parse(url)
93
138
 
@@ -99,39 +144,37 @@ module Selenium
99
144
  end
100
145
 
101
146
  def proxy
102
- @proxy ||= (
147
+ @proxy ||= begin
103
148
  proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
104
149
  no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
105
150
 
106
151
  if proxy
107
- proxy = "http://#{proxy}" unless proxy.start_with?("http://")
108
- Proxy.new(:http => proxy, :no_proxy => no_proxy)
152
+ proxy = "http://#{proxy}" unless proxy.start_with?('http://')
153
+ Proxy.new(http: proxy, no_proxy: no_proxy)
109
154
  end
110
- )
155
+ end
111
156
  end
112
157
 
113
158
  def use_proxy?
114
159
  return false if proxy.nil?
115
160
 
116
161
  if proxy.no_proxy
117
- ignored = proxy.no_proxy.split(",").any? do |host|
118
- host == "*" ||
119
- host == server_url.host || (
120
- begin
121
- IPAddr.new(host).include?(server_url.host)
122
- rescue ArgumentError
123
- false
124
- end
125
- )
126
-
162
+ ignored = proxy.no_proxy.split(',').any? do |host|
163
+ host == '*' ||
164
+ host == server_url.host || (
165
+ begin
166
+ IPAddr.new(host).include?(server_url.host)
167
+ rescue ArgumentError
168
+ false
169
+ end
170
+ )
127
171
  end
128
172
 
129
- not ignored
173
+ !ignored
130
174
  else
131
175
  true
132
176
  end
133
177
  end
134
-
135
178
  end # Default
136
179
  end # Http
137
180
  end # Remote
@@ -1,15 +1,32 @@
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/persistent'
2
21
 
3
22
  module Selenium
4
23
  module WebDriver
5
24
  module Remote
6
25
  module Http
7
-
8
26
  # @api private
9
27
  class Persistent < Default
10
-
11
28
  def close
12
- @http.shutdown if @http
29
+ @http&.shutdown
13
30
  end
14
31
 
15
32
  private
@@ -18,19 +35,24 @@ module Selenium
18
35
  proxy = nil
19
36
 
20
37
  if @proxy
21
- unless @proxy.respond_to?(:http) && url = @proxy.http
22
- raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}"
38
+ unless @proxy.respond_to?(:http)
39
+ url = @proxy.http
40
+ raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}" unless url
23
41
  end
24
42
  proxy = URI.parse(url)
25
43
  end
26
44
 
27
- Net::HTTP::Persistent.new "webdriver", proxy
45
+ if Net::HTTP::Persistent::VERSION >= '3'
46
+ Net::HTTP::Persistent.new name: 'webdriver', proxy: proxy
47
+ else
48
+ WebDriver.logger.warn 'Support for this version of net-http-persistent is deprecated. Please upgrade.'
49
+ Net::HTTP::Persistent.new 'webdriver', proxy
50
+ end
28
51
  end
29
52
 
30
53
  def response_for(request)
31
54
  http.request server_url, request
32
55
  end
33
-
34
56
  end # Persistent
35
57
  end # Http
36
58
  end # Remote