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
  module Selenium
2
21
  module WebDriver
3
22
  module Remote
@@ -6,132 +25,128 @@ module Selenium
6
25
  # server is being asked to create.
7
26
  #
8
27
  class Capabilities
9
-
10
28
  DEFAULTS = {
11
- :browser_name => "",
12
- :version => "",
13
- :platform => :any,
14
- :javascript_enabled => false,
15
- :css_selectors_enabled => false,
16
- :takes_screenshot => false,
17
- :native_events => false,
18
- :rotatable => false,
19
- :firefox_profile => nil,
20
- :proxy => nil
21
- }
29
+ browser_name: '',
30
+ version: '',
31
+ platform: :any,
32
+ javascript_enabled: false,
33
+ css_selectors_enabled: false,
34
+ takes_screenshot: false,
35
+ native_events: false,
36
+ rotatable: false,
37
+ firefox_profile: nil,
38
+ proxy: nil
39
+ }.freeze
22
40
 
23
41
  DEFAULTS.each_key do |key|
24
- define_method key do
25
- @capabilities.fetch(key)
42
+ if key != :javascript_enabled
43
+ define_method key do
44
+ @capabilities.fetch(key)
45
+ end
26
46
  end
27
47
 
48
+ next if key == :proxy
49
+
28
50
  define_method "#{key}=" do |value|
29
51
  @capabilities[key] = value
30
52
  end
31
53
  end
32
54
 
55
+ #
56
+ # Returns javascript_enabled capability.
57
+ # It is true if not set explicitly.
58
+ #
59
+ def javascript_enabled
60
+ javascript_enabled = @capabilities.fetch(:javascript_enabled)
61
+ javascript_enabled.nil? ? true : javascript_enabled
62
+ end
63
+
33
64
  alias_method :css_selectors_enabled?, :css_selectors_enabled
34
- alias_method :javascript_enabled? , :javascript_enabled
35
- alias_method :native_events? , :native_events
36
- alias_method :takes_screenshot? , :takes_screenshot
37
- alias_method :rotatable? , :rotatable
65
+ alias_method :javascript_enabled?, :javascript_enabled
66
+ alias_method :native_events?, :native_events
67
+ alias_method :takes_screenshot?, :takes_screenshot
68
+ alias_method :rotatable?, :rotatable
38
69
 
39
70
  #
40
71
  # Convenience methods for the common choices.
41
72
  #
42
73
 
43
74
  class << self
44
- def android(opts = {})
75
+ def chrome(opts = {})
45
76
  new({
46
- :browser_name => "android",
47
- :platform => :android,
48
- :javascript_enabled => true,
49
- :rotatable => true,
50
- :takes_screenshot => true
77
+ browser_name: 'chrome',
78
+ javascript_enabled: true,
79
+ css_selectors_enabled: true
51
80
  }.merge(opts))
52
81
  end
53
82
 
54
- def chrome(opts = {})
83
+ def edge(opts = {})
55
84
  new({
56
- :browser_name => "chrome",
57
- :javascript_enabled => true,
58
- :css_selectors_enabled => true
85
+ browser_name: 'MicrosoftEdge',
86
+ platform: :windows
59
87
  }.merge(opts))
60
88
  end
61
89
 
62
90
  def firefox(opts = {})
91
+ opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
92
+ opts[:platform_name] = opts.delete(:platform) if opts.key?(:platform)
93
+ opts[:timeouts] = {}
94
+ opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
95
+ opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
96
+ opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
97
+ new({browser_name: 'firefox', marionette: true}.merge(opts))
98
+ end
99
+
100
+ def firefox_legacy(opts = {})
63
101
  new({
64
- :browser_name => "firefox",
65
- :javascript_enabled => true,
66
- :takes_screenshot => true,
67
- :css_selectors_enabled => true
102
+ browser_name: 'firefox',
103
+ javascript_enabled: true,
104
+ takes_screenshot: true,
105
+ css_selectors_enabled: true
68
106
  }.merge(opts))
69
107
  end
70
108
 
71
109
  def htmlunit(opts = {})
72
110
  new({
73
- :browser_name => "htmlunit"
111
+ browser_name: 'htmlunit'
74
112
  }.merge(opts))
75
113
  end
76
114
 
77
115
  def htmlunitwithjs(opts = {})
78
116
  new({
79
- :browser_name => "htmlunit",
80
- :javascript_enabled => true
117
+ browser_name: 'htmlunit',
118
+ javascript_enabled: true
81
119
  }.merge(opts))
82
120
  end
83
121
 
84
122
  def internet_explorer(opts = {})
85
123
  new({
86
- :browser_name => "internet explorer",
87
- :platform => :windows,
88
- :takes_screenshot => true,
89
- :css_selectors_enabled => true,
90
- :native_events => true
124
+ browser_name: 'internet explorer',
125
+ platform: :windows,
126
+ takes_screenshot: true,
127
+ css_selectors_enabled: true,
128
+ native_events: true
91
129
  }.merge(opts))
92
130
  end
93
131
  alias_method :ie, :internet_explorer
94
132
 
95
- def iphone(opts = {})
96
- new({
97
- :browser_name => "iPhone",
98
- :platform => :mac,
99
- :javascript_enabled => true
100
- }.merge(opts))
101
- end
102
-
103
- def ipad(opts = {})
104
- new({
105
- :browser_name => "iPad",
106
- :platform => :mac,
107
- :javascript_enabled => true
108
- }.merge(opts))
109
- end
110
-
111
- def opera(opts = {})
112
- new({
113
- :browser_name => "opera",
114
- :javascript_enabled => true,
115
- :takes_screenshot => true,
116
- :css_selectors_enabled => true
117
- }.merge(opts))
118
- end
119
-
120
133
  def phantomjs(opts = {})
134
+ WebDriver.logger.deprecate 'Selenium support for PhantomJS', 'headless Chrome/Firefox or HTMLUnit'
121
135
  new({
122
- :browser_name => "phantomjs",
123
- :javascript_enabled => true,
124
- :takes_screenshot => true,
125
- :css_selectors_enabled => true
136
+ browser_name: 'phantomjs',
137
+ javascript_enabled: true,
138
+ takes_screenshot: true,
139
+ css_selectors_enabled: true
126
140
  }.merge(opts))
127
141
  end
128
142
 
129
143
  def safari(opts = {})
130
144
  new({
131
- :browser_name => "safari",
132
- :javascript_enabled => true,
133
- :takes_screenshot => true,
134
- :css_selectors_enabled => true
145
+ browser_name: 'safari',
146
+ platform: :mac,
147
+ javascript_enabled: true,
148
+ takes_screenshot: true,
149
+ css_selectors_enabled: true
135
150
  }.merge(opts))
136
151
  end
137
152
 
@@ -143,15 +158,15 @@ module Selenium
143
158
  data = data.dup
144
159
 
145
160
  caps = new
146
- caps.browser_name = data.delete("browserName")
147
- caps.version = data.delete("version")
148
- caps.platform = data.delete("platform").downcase.to_sym if data.has_key?('platform')
149
- caps.javascript_enabled = data.delete("javascriptEnabled")
150
- caps.css_selectors_enabled = data.delete("cssSelectorsEnabled")
151
- caps.takes_screenshot = data.delete("takesScreenshot")
152
- caps.native_events = data.delete("nativeEvents")
153
- caps.rotatable = data.delete("rotatable")
154
- caps.proxy = Proxy.json_create(data['proxy']) if data.has_key?('proxy')
161
+ caps.browser_name = data.delete('browserName')
162
+ caps.version = data.delete('version')
163
+ caps.platform = data.delete('platform').downcase.tr(' ', '_').to_sym if data.key?('platform')
164
+ caps.javascript_enabled = data.delete('javascriptEnabled')
165
+ caps.css_selectors_enabled = data.delete('cssSelectorsEnabled')
166
+ caps.takes_screenshot = data.delete('takesScreenshot')
167
+ caps.native_events = data.delete('nativeEvents')
168
+ caps.rotatable = data.delete('rotatable')
169
+ caps.proxy = Proxy.json_create(data['proxy']) if data.key?('proxy') && !data['proxy'].empty?
155
170
 
156
171
  # any remaining pairs will be added as is, with no conversion
157
172
  caps.merge!(data)
@@ -160,6 +175,7 @@ module Selenium
160
175
  end
161
176
  end
162
177
 
178
+ #
163
179
  # @option :browser_name [String] required browser name
164
180
  # @option :version [String] required browser version number
165
181
  # @option :platform [Symbol] one of :any, :win, :mac, or :x
@@ -169,10 +185,6 @@ module Selenium
169
185
  # @option :native_events [Boolean] does this driver use native events?
170
186
  # @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
171
187
  #
172
- # Firefox-specific options:
173
- #
174
- # @option :firefox_profile [Selenium::WebDriver::Firefox::Profile] the firefox profile to use
175
- #
176
188
  # @api public
177
189
  #
178
190
 
@@ -194,12 +206,12 @@ module Selenium
194
206
  end
195
207
 
196
208
  def merge!(other)
197
- if other.respond_to?(:capabilities, true) && other.capabilities.kind_of?(Hash)
209
+ if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
198
210
  @capabilities.merge! other.capabilities
199
- elsif other.kind_of? Hash
211
+ elsif other.is_a? Hash
200
212
  @capabilities.merge! other
201
213
  else
202
- raise ArgumentError, "argument should be a Hash or implement #capabilities"
214
+ raise ArgumentError, 'argument should be a Hash or implement #capabilities'
203
215
  end
204
216
  end
205
217
 
@@ -214,10 +226,11 @@ module Selenium
214
226
  end
215
227
  end
216
228
 
229
+ #
217
230
  # @api private
218
231
  #
219
232
 
220
- def as_json(opts = nil)
233
+ def as_json(*) # rubocop:disable Metrics/CyclomaticComplexity
221
234
  hash = {}
222
235
 
223
236
  @capabilities.each do |key, value|
@@ -225,10 +238,16 @@ module Selenium
225
238
  when :platform
226
239
  hash['platform'] = value.to_s.upcase
227
240
  when :firefox_profile
228
- hash['firefox_profile'] = value.as_json['zip'] if value
241
+ if value
242
+ WebDriver.logger.deprecate(':firefox_profile capabilitiy', 'Selenium::WebDriver::Firefox::Options#profile')
243
+ hash['firefox_profile'] = value.as_json['zip']
244
+ end
229
245
  when :proxy
230
246
  hash['proxy'] = value.as_json if value
231
247
  when String, :firefox_binary
248
+ if key == :firefox_binary && value
249
+ WebDriver.logger.deprecate(':firefox_binary capabilitiy', 'Selenium::WebDriver::Firefox::Options#binary')
250
+ end
232
251
  hash[key.to_s] = value
233
252
  when Symbol
234
253
  hash[camel_case(key.to_s)] = value
@@ -240,28 +259,26 @@ module Selenium
240
259
  hash
241
260
  end
242
261
 
243
- def to_json(*args)
244
- WebDriver.json_dump as_json
262
+ def to_json(*)
263
+ JSON.generate as_json
245
264
  end
246
265
 
247
266
  def ==(other)
248
- return false unless other.kind_of? self.class
267
+ return false unless other.is_a? self.class
268
+
249
269
  as_json == other.as_json
250
270
  end
251
271
  alias_method :eql?, :==
252
272
 
253
273
  protected
254
274
 
255
- def capabilities
256
- @capabilities
257
- end
275
+ attr_reader :capabilities
258
276
 
259
277
  private
260
278
 
261
279
  def camel_case(str)
262
- str.gsub(/_([a-z])/) { $1.upcase }
280
+ str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
263
281
  end
264
-
265
282
  end # Capabilities
266
283
  end # Remote
267
284
  end # WebDriver
@@ -0,0 +1,51 @@
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
+
20
+ module Selenium
21
+ module WebDriver
22
+ module Remote
23
+
24
+ #
25
+ # Driver implementation for remote server.
26
+ # @api private
27
+ #
28
+
29
+ class Driver < WebDriver::Driver
30
+ include DriverExtensions::UploadsFiles
31
+ include DriverExtensions::TakesScreenshot
32
+ include DriverExtensions::HasSessionId
33
+ include DriverExtensions::Rotatable
34
+ include DriverExtensions::HasRemoteStatus
35
+ include DriverExtensions::HasWebStorage
36
+
37
+ def initialize(opts = {})
38
+ listener = opts.delete(:listener)
39
+ @bridge = Bridge.handshake(opts)
40
+ if @bridge.dialect == :oss
41
+ extend DriverExtensions::HasTouchScreen
42
+ extend DriverExtensions::HasLocation
43
+ extend DriverExtensions::HasNetworkConnection
44
+ end
45
+ super(@bridge, listener: listener)
46
+ end
47
+
48
+ end # Driver
49
+ end # Remote
50
+ end # WebDriver
51
+ end # Selenium
@@ -1,11 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Remote
4
23
  module Http
5
24
  class Common
6
25
  MAX_REDIRECTS = 20 # same as chromium/gecko
7
- CONTENT_TYPE = "application/json"
8
- DEFAULT_HEADERS = { "Accept" => CONTENT_TYPE }
26
+ CONTENT_TYPE = 'application/json'
27
+ DEFAULT_HEADERS = {
28
+ 'Accept' => CONTENT_TYPE,
29
+ 'Content-Type' => "#{CONTENT_TYPE}; charset=UTF-8",
30
+ 'User-Agent' => "selenium/#{WebDriver::VERSION} (ruby #{Platform.os})"
31
+ }.freeze
9
32
 
10
33
  attr_accessor :timeout
11
34
  attr_writer :server_url
@@ -14,27 +37,28 @@ module Selenium
14
37
  @timeout = nil
15
38
  end
16
39
 
40
+ def quit_errors
41
+ [IOError]
42
+ end
43
+
17
44
  def close
18
45
  # hook for subclasses - will be called on Driver#quit
19
46
  end
20
47
 
21
48
  def call(verb, url, command_hash)
22
- url = server_url.merge(url) unless url.kind_of?(URI)
49
+ url = server_url.merge(url) unless url.is_a?(URI)
23
50
  headers = DEFAULT_HEADERS.dup
24
- headers['Cache-Control'] = "no-cache" if verb == :get
51
+ headers['Cache-Control'] = 'no-cache' if verb == :get
25
52
 
26
53
  if command_hash
27
- payload = WebDriver.json_dump(command_hash)
28
- headers["Content-Type"] = "#{CONTENT_TYPE}; charset=utf-8"
29
- headers["Content-Length"] = payload.bytesize.to_s if [:post, :put].include?(verb)
30
-
31
- if $DEBUG
32
- puts " >>> #{url} | #{payload}"
33
- puts " > #{headers.inspect}"
34
- end
54
+ payload = JSON.generate(command_hash)
55
+ headers['Content-Length'] = payload.bytesize.to_s if %i[post put].include?(verb)
56
+
57
+ WebDriver.logger.info(" >>> #{url} | #{payload}")
58
+ WebDriver.logger.debug(" > #{headers.inspect}")
35
59
  elsif verb == :post
36
- payload = "{}" # work around http://code.google.com/p/selenium/issues/detail?id=1396
37
- headers["Content-Length"] = "2"
60
+ payload = '{}'
61
+ headers['Content-Length'] = '2'
38
62
  end
39
63
 
40
64
  request verb, url, headers, payload
@@ -43,30 +67,37 @@ module Selenium
43
67
  private
44
68
 
45
69
  def server_url
46
- @server_url or raise Error::WebDriverError, "server_url not set"
70
+ return @server_url if @server_url
71
+
72
+ raise Error::WebDriverError, 'server_url not set'
47
73
  end
48
74
 
49
- def request(verb, url, headers, payload)
50
- raise NotImplementedError, "subclass responsibility"
75
+ def request(*)
76
+ raise NotImplementedError, 'subclass responsibility'
51
77
  end
52
78
 
53
79
  def create_response(code, body, content_type)
54
- code, body, content_type = code.to_i, body.to_s.strip, content_type.to_s
55
- puts "<- #{body}\n" if $DEBUG
80
+ code = code.to_i
81
+ body = body.to_s.strip
82
+ content_type = content_type.to_s
83
+ WebDriver.logger.info("<- #{body}")
56
84
 
57
85
  if content_type.include? CONTENT_TYPE
58
86
  raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
59
- Response.new(code, WebDriver.json_load(body))
87
+
88
+ Response.new(code, JSON.parse(body))
60
89
  elsif code == 204
61
90
  Response.new(code)
62
91
  else
63
- msg = "unexpected response, code=#{code}, content-type=#{content_type.inspect}"
64
- msg << "\n#{body}" unless body.empty?
92
+ msg = if body.empty?
93
+ "unexpected response, code=#{code}, content-type=#{content_type.inspect}"
94
+ else
95
+ "unexpected response, code=#{code}, content-type=#{content_type.inspect}\n#{body}"
96
+ end
65
97
 
66
98
  raise Error::WebDriverError, msg
67
99
  end
68
100
  end
69
-
70
101
  end # Common
71
102
  end # Http
72
103
  end # Remote
@@ -1,14 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
1
20
  require 'curb'
2
21
 
3
22
  module Selenium
4
23
  module WebDriver
5
24
  module Remote
6
25
 
7
- # added for rescue
8
- Bridge::QUIT_ERRORS << Curl::Err::RecvError
9
-
10
26
  module Http
11
-
12
27
  #
13
28
  # An alternative to the default Net::HTTP client.
14
29
  #
@@ -24,14 +39,18 @@ module Selenium
24
39
 
25
40
  class Curb < Common
26
41
 
42
+ def quit_errors
43
+ [Curl::Err::RecvError] + super
44
+ end
45
+
27
46
  private
28
47
 
29
48
  def request(verb, url, headers, payload)
30
- client.url = url.to_s
49
+ client.url = url.to_s
31
50
 
32
51
  # workaround for http://github.com/taf2/curb/issues/issue/40
33
52
  # curb will handle this for us anyway
34
- headers.delete "Content-Length"
53
+ headers.delete 'Content-Length'
35
54
 
36
55
  client.headers = headers
37
56
 
@@ -43,10 +62,10 @@ module Selenium
43
62
  when :get
44
63
  client.http_get
45
64
  when :post
46
- client.post_body = payload || ""
65
+ client.post_body = payload || ''
47
66
  client.http_post
48
67
  when :put
49
- client.put_data = payload || ""
68
+ client.put_data = payload || ''
50
69
  client.http_put
51
70
  when :delete
52
71
  client.http_delete
@@ -60,18 +79,17 @@ module Selenium
60
79
  end
61
80
 
62
81
  def client
63
- @client ||= (
82
+ @client ||= begin
64
83
  c = Curl::Easy.new
65
84
 
66
85
  c.max_redirects = MAX_REDIRECTS
67
86
  c.follow_location = true
68
87
  c.timeout = @timeout if @timeout
69
- c.verbose = !!$DEBUG
88
+ c.verbose = WebDriver.logger.info?
70
89
 
71
90
  c
72
- )
91
+ end
73
92
  end
74
-
75
93
  end # Curb
76
94
  end # Http
77
95
  end # Remote