selenium-webdriver 3.141.0 → 3.142.3

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +125 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/lib/selenium-webdriver.rb +2 -0
  6. data/lib/selenium/server.rb +9 -7
  7. data/lib/selenium/webdriver.rb +3 -1
  8. data/lib/selenium/webdriver/atoms.rb +20 -1
  9. data/lib/selenium/webdriver/atoms/getAttribute.js +6 -7
  10. data/lib/selenium/webdriver/atoms/isDisplayed.js +60 -59
  11. data/lib/selenium/webdriver/chrome.rb +10 -4
  12. data/lib/selenium/webdriver/chrome/bridge.rb +5 -3
  13. data/lib/selenium/webdriver/chrome/driver.rb +10 -13
  14. data/lib/selenium/webdriver/chrome/options.rb +4 -4
  15. data/lib/selenium/webdriver/chrome/profile.rb +4 -3
  16. data/lib/selenium/webdriver/chrome/service.rb +13 -13
  17. data/lib/selenium/webdriver/common.rb +4 -2
  18. data/lib/selenium/webdriver/common/action_builder.rb +2 -0
  19. data/lib/selenium/webdriver/common/alert.rb +2 -0
  20. data/lib/selenium/webdriver/common/bridge_helper.rb +8 -5
  21. data/lib/selenium/webdriver/common/driver.rb +22 -7
  22. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +2 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
  24. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +2 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +3 -3
  26. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +2 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +3 -1
  28. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +2 -0
  29. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -0
  30. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -0
  31. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +2 -0
  32. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -0
  33. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -1
  34. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -0
  35. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -3
  36. data/lib/selenium/webdriver/common/element.rb +3 -1
  37. data/lib/selenium/webdriver/common/error.rb +74 -18
  38. data/lib/selenium/webdriver/common/file_reaper.rb +3 -3
  39. data/lib/selenium/webdriver/common/html5/local_storage.rb +2 -0
  40. data/lib/selenium/webdriver/common/html5/session_storage.rb +2 -0
  41. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +4 -1
  42. data/lib/selenium/webdriver/common/interactions/input_device.rb +3 -0
  43. data/lib/selenium/webdriver/common/interactions/interaction.rb +3 -0
  44. data/lib/selenium/webdriver/common/interactions/interactions.rb +3 -1
  45. data/lib/selenium/webdriver/common/interactions/key_actions.rb +2 -0
  46. data/lib/selenium/webdriver/common/interactions/key_input.rb +4 -0
  47. data/lib/selenium/webdriver/common/interactions/none_input.rb +3 -0
  48. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +2 -0
  49. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +7 -0
  50. data/lib/selenium/webdriver/common/keyboard.rb +4 -1
  51. data/lib/selenium/webdriver/common/keys.rb +3 -0
  52. data/lib/selenium/webdriver/common/log_entry.rb +4 -2
  53. data/lib/selenium/webdriver/common/logger.rb +15 -40
  54. data/lib/selenium/webdriver/common/logs.rb +2 -0
  55. data/lib/selenium/webdriver/common/{options.rb → manager.rb} +27 -1
  56. data/lib/selenium/webdriver/common/mouse.rb +3 -0
  57. data/lib/selenium/webdriver/common/navigation.rb +2 -0
  58. data/lib/selenium/webdriver/common/platform.rb +26 -30
  59. data/lib/selenium/webdriver/common/port_prober.rb +6 -19
  60. data/lib/selenium/webdriver/common/profile_helper.rb +2 -0
  61. data/lib/selenium/webdriver/common/proxy.rb +13 -5
  62. data/lib/selenium/webdriver/common/search_context.rb +6 -8
  63. data/lib/selenium/webdriver/common/service.rb +87 -29
  64. data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
  65. data/lib/selenium/webdriver/common/socket_poller.rb +26 -18
  66. data/lib/selenium/webdriver/common/target_locator.rb +6 -4
  67. data/lib/selenium/webdriver/common/timeouts.rb +2 -0
  68. data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -6
  69. data/lib/selenium/webdriver/common/touch_screen.rb +4 -1
  70. data/lib/selenium/webdriver/common/w3c_action_builder.rb +3 -0
  71. data/lib/selenium/webdriver/common/{w3c_options.rb → w3c_manager.rb} +3 -1
  72. data/lib/selenium/webdriver/common/wait.rb +13 -5
  73. data/lib/selenium/webdriver/common/window.rb +2 -0
  74. data/lib/selenium/webdriver/common/zipper.rb +3 -3
  75. data/lib/selenium/webdriver/edge.rb +11 -5
  76. data/lib/selenium/webdriver/edge/bridge.rb +2 -0
  77. data/lib/selenium/webdriver/edge/driver.rb +5 -12
  78. data/lib/selenium/webdriver/edge/options.rb +3 -0
  79. data/lib/selenium/webdriver/edge/service.rb +8 -12
  80. data/lib/selenium/webdriver/firefox.rb +10 -4
  81. data/lib/selenium/webdriver/firefox/binary.rb +7 -6
  82. data/lib/selenium/webdriver/firefox/bridge.rb +47 -0
  83. data/lib/selenium/webdriver/firefox/driver.rb +2 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +4 -4
  85. data/lib/selenium/webdriver/firefox/launcher.rb +3 -0
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +7 -3
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +4 -2
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +5 -11
  89. data/lib/selenium/webdriver/firefox/options.rb +20 -7
  90. data/lib/selenium/webdriver/firefox/profile.rb +7 -8
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +3 -0
  92. data/lib/selenium/webdriver/firefox/service.rb +8 -19
  93. data/lib/selenium/webdriver/firefox/util.rb +2 -0
  94. data/lib/selenium/webdriver/ie.rb +10 -4
  95. data/lib/selenium/webdriver/ie/driver.rb +4 -10
  96. data/lib/selenium/webdriver/ie/options.rb +4 -2
  97. data/lib/selenium/webdriver/ie/service.rb +8 -12
  98. data/lib/selenium/webdriver/remote.rb +2 -0
  99. data/lib/selenium/webdriver/remote/bridge.rb +6 -4
  100. data/lib/selenium/webdriver/remote/capabilities.rb +23 -10
  101. data/lib/selenium/webdriver/remote/commands.rb +156 -0
  102. data/lib/selenium/webdriver/remote/driver.rb +2 -0
  103. data/lib/selenium/webdriver/remote/http/common.rb +11 -4
  104. data/lib/selenium/webdriver/remote/http/curb.rb +4 -2
  105. data/lib/selenium/webdriver/remote/http/default.rb +31 -25
  106. data/lib/selenium/webdriver/remote/http/persistent.rb +3 -1
  107. data/lib/selenium/webdriver/remote/oss/bridge.rb +5 -2
  108. data/lib/selenium/webdriver/remote/oss/commands.rb +106 -104
  109. data/lib/selenium/webdriver/remote/response.rb +11 -3
  110. data/lib/selenium/webdriver/remote/server_error.rb +2 -0
  111. data/lib/selenium/webdriver/remote/w3c/bridge.rb +28 -13
  112. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +37 -21
  113. data/lib/selenium/webdriver/remote/w3c/commands.rb +61 -58
  114. data/lib/selenium/webdriver/safari.rb +11 -4
  115. data/lib/selenium/webdriver/safari/bridge.rb +5 -3
  116. data/lib/selenium/webdriver/safari/driver.rb +8 -10
  117. data/lib/selenium/webdriver/safari/options.rb +2 -0
  118. data/lib/selenium/webdriver/safari/service.rb +6 -25
  119. data/lib/selenium/webdriver/support.rb +2 -0
  120. data/lib/selenium/webdriver/support/abstract_event_listener.rb +2 -0
  121. data/lib/selenium/webdriver/support/block_event_listener.rb +3 -1
  122. data/lib/selenium/webdriver/support/color.rb +11 -9
  123. data/lib/selenium/webdriver/support/escaper.rb +2 -0
  124. data/lib/selenium/webdriver/support/event_firing_bridge.rb +3 -1
  125. data/lib/selenium/webdriver/support/select.rb +19 -18
  126. data/lib/selenium/webdriver/version.rb +3 -1
  127. data/selenium-webdriver.gemspec +14 -7
  128. metadata +89 -23
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -19,7 +21,7 @@ module Selenium
19
21
  module WebDriver
20
22
  module IE
21
23
  class Options
22
- KEY = 'se:ieOptions'.freeze
24
+ KEY = 'se:ieOptions'
23
25
  SCROLL_TOP = 0
24
26
  SCROLL_BOTTOM = 1
25
27
  CAPABILITIES = {
@@ -86,7 +88,7 @@ module Selenium
86
88
  def initialize(**opts)
87
89
  @args = Set.new(opts.delete(:args) || [])
88
90
  @options = opts
89
- @options[:native_events] ||= true
91
+ @options[:native_events] = true if @options[:native_events].nil?
90
92
  end
91
93
 
92
94
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -23,27 +25,21 @@ module Selenium
23
25
  #
24
26
 
25
27
  class Service < WebDriver::Service
26
- DEFAULT_PORT = 5555
27
- @executable = 'IEDriverServer'.freeze
28
- @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
28
+ @default_port = 5555
29
+ @executable = 'IEDriverServer'
30
+ @missing_text = <<~ERROR
29
31
  Unable to find IEDriverServer. Please download the server from
30
32
  http://selenium-release.storage.googleapis.com/index.html and place it somewhere on your PATH.
31
33
  More info at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver.
32
34
  ERROR
35
+ @shutdown_supported = true
33
36
 
34
37
  private
35
38
 
36
- def start_process
37
- @process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
38
- @process.start
39
- end
40
-
41
- def cannot_connect_error_text
42
- "unable to connect to IE server #{@host}:#{@port}"
43
- end
44
-
39
+ # Note: This processing is deprecated
45
40
  def extract_service_args(driver_opts)
46
41
  driver_args = super
42
+ driver_opts = driver_opts.dup
47
43
  driver_args << "--log-level=#{driver_opts.delete(:log_level).to_s.upcase}" if driver_opts.key?(:log_level)
48
44
  driver_args << "--log-file=#{driver_opts.delete(:log_file)}" if driver_opts.key?(:log_file)
49
45
  driver_args << "--implementation=#{driver_opts.delete(:implementation).to_s.upcase}" if driver_opts.key?(:implementation)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -24,7 +26,7 @@ module Selenium
24
26
 
25
27
  PORT = 4444
26
28
  COMMANDS = {
27
- new_session: [:post, 'session'.freeze]
29
+ new_session: [:post, 'session']
28
30
  }.freeze
29
31
 
30
32
  attr_accessor :context, :http, :file_detector
@@ -46,6 +48,7 @@ module Selenium
46
48
  unless Capabilities.respond_to?(desired_capabilities)
47
49
  raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
48
50
  end
51
+
49
52
  desired_capabilities = Capabilities.__send__(desired_capabilities)
50
53
  end
51
54
 
@@ -112,9 +115,7 @@ module Selenium
112
115
  end
113
116
  end
114
117
 
115
- unless @session_id
116
- raise Error::WebDriverError, 'no sessionId in returned payload'
117
- end
118
+ raise Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
118
119
 
119
120
  if oss_status
120
121
  WebDriver.logger.info 'Detected OSS dialect.'
@@ -172,6 +173,7 @@ module Selenium
172
173
 
173
174
  def commands(command)
174
175
  raise NotImplementedError unless command == :new_session
176
+
175
177
  COMMANDS[command]
176
178
  end
177
179
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -44,6 +46,7 @@ module Selenium
44
46
  end
45
47
 
46
48
  next if key == :proxy
49
+
47
50
  define_method "#{key}=" do |value|
48
51
  @capabilities[key] = value
49
52
  end
@@ -80,14 +83,21 @@ module Selenium
80
83
  def edge(opts = {})
81
84
  new({
82
85
  browser_name: 'MicrosoftEdge',
83
- platform: :windows,
84
- javascript_enabled: true,
85
- takes_screenshot: true,
86
- css_selectors_enabled: true
86
+ platform: :windows
87
87
  }.merge(opts))
88
88
  end
89
89
 
90
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 = {})
91
101
  new({
92
102
  browser_name: 'firefox',
93
103
  javascript_enabled: true,
@@ -175,10 +185,6 @@ module Selenium
175
185
  # @option :native_events [Boolean] does this driver use native events?
176
186
  # @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
177
187
  #
178
- # Firefox-specific options:
179
- #
180
- # @option :firefox_profile [Selenium::WebDriver::Firefox::Profile] the firefox profile to use
181
- #
182
188
  # @api public
183
189
  #
184
190
 
@@ -224,7 +230,7 @@ module Selenium
224
230
  # @api private
225
231
  #
226
232
 
227
- def as_json(*)
233
+ def as_json(*) # rubocop:disable Metrics/CyclomaticComplexity
228
234
  hash = {}
229
235
 
230
236
  @capabilities.each do |key, value|
@@ -232,10 +238,16 @@ module Selenium
232
238
  when :platform
233
239
  hash['platform'] = value.to_s.upcase
234
240
  when :firefox_profile
235
- 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
236
245
  when :proxy
237
246
  hash['proxy'] = value.as_json if value
238
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
239
251
  hash[key.to_s] = value
240
252
  when Symbol
241
253
  hash[camel_case(key.to_s)] = value
@@ -253,6 +265,7 @@ module Selenium
253
265
 
254
266
  def ==(other)
255
267
  return false unless other.is_a? self.class
268
+
256
269
  as_json == other.as_json
257
270
  end
258
271
  alias_method :eql?, :==
@@ -0,0 +1,156 @@
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
+ # https://w3c.github.io/webdriver/#endpoints
26
+ # @api private
27
+ #
28
+
29
+ class Bridge
30
+ COMMANDS = {
31
+ status: [:get, 'status'],
32
+
33
+ #
34
+ # session handling
35
+ #
36
+
37
+ new_session: [:post, 'session'],
38
+ delete_session: [:delete, 'session/:session_id'],
39
+
40
+ #
41
+ # basic driver
42
+ #
43
+
44
+ get: [:post, 'session/:session_id/url'],
45
+ get_current_url: [:get, 'session/:session_id/url'],
46
+ back: [:post, 'session/:session_id/back'],
47
+ forward: [:post, 'session/:session_id/forward'],
48
+ refresh: [:post, 'session/:session_id/refresh'],
49
+ get_title: [:get, 'session/:session_id/title'],
50
+
51
+ #
52
+ # window and Frame handling
53
+ #
54
+
55
+ get_window_handle: [:get, 'session/:session_id/window'],
56
+ new_window: [:post, 'session/:session_id/window/new'],
57
+ close_window: [:delete, 'session/:session_id/window'],
58
+ switch_to_window: [:post, 'session/:session_id/window'],
59
+ get_window_handles: [:get, 'session/:session_id/window/handles'],
60
+ fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
61
+ minimize_window: [:post, 'session/:session_id/window/minimize'],
62
+ maximize_window: [:post, 'session/:session_id/window/maximize'],
63
+ set_window_size: [:post, 'session/:session_id/window/size'],
64
+ get_window_size: [:get, 'session/:session_id/window/size'],
65
+ set_window_position: [:post, 'session/:session_id/window/position'],
66
+ get_window_position: [:get, 'session/:session_id/window/position'],
67
+ set_window_rect: [:post, 'session/:session_id/window/rect'],
68
+ get_window_rect: [:get, 'session/:session_id/window/rect'],
69
+ switch_to_frame: [:post, 'session/:session_id/frame'],
70
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
71
+
72
+ #
73
+ # element
74
+ #
75
+
76
+ find_element: [:post, 'session/:session_id/element'],
77
+ find_elements: [:post, 'session/:session_id/elements'],
78
+ find_child_element: [:post, 'session/:session_id/element/:id/element'],
79
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
80
+ get_active_element: [:get, 'session/:session_id/element/active'],
81
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
82
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
83
+ get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
84
+ get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
85
+ get_element_text: [:get, 'session/:session_id/element/:id/text'],
86
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
87
+ get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
88
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
89
+
90
+ #
91
+ # document handling
92
+ #
93
+
94
+ get_page_source: [:get, 'session/:session_id/source'],
95
+ execute_script: [:post, 'session/:session_id/execute/sync'],
96
+ execute_async_script: [:post, 'session/:session_id/execute/async'],
97
+
98
+ #
99
+ # cookies
100
+ #
101
+
102
+ get_all_cookies: [:get, 'session/:session_id/cookie'],
103
+ get_cookie: [:get, 'session/:session_id/cookie/:name'],
104
+ add_cookie: [:post, 'session/:session_id/cookie'],
105
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
106
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'],
107
+
108
+ #
109
+ # timeouts
110
+ #
111
+
112
+ set_timeout: [:post, 'session/:session_id/timeouts'],
113
+
114
+ #
115
+ # actions
116
+ #
117
+
118
+ actions: [:post, 'session/:session_id/actions'],
119
+ release_actions: [:delete, 'session/:session_id/actions'],
120
+
121
+ #
122
+ # Element Operations
123
+ #
124
+
125
+ element_click: [:post, 'session/:session_id/element/:id/click'],
126
+ element_tap: [:post, 'session/:session_id/element/:id/tap'],
127
+ element_clear: [:post, 'session/:session_id/element/:id/clear'],
128
+ element_send_keys: [:post, 'session/:session_id/element/:id/value'],
129
+
130
+ #
131
+ # alerts
132
+ #
133
+
134
+ dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
135
+ accept_alert: [:post, 'session/:session_id/alert/accept'],
136
+ get_alert_text: [:get, 'session/:session_id/alert/text'],
137
+ send_alert_text: [:post, 'session/:session_id/alert/text'],
138
+
139
+ #
140
+ # screenshot
141
+ #
142
+
143
+ take_screenshot: [:get, 'session/:session_id/screenshot'],
144
+ take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
145
+
146
+ #
147
+ # server extensions
148
+ #
149
+
150
+ upload_file: [:post, 'session/:session_id/se/file']
151
+ }.freeze
152
+
153
+ end # Bridge
154
+ end # Remote
155
+ end # WebDriver
156
+ end # Selenium
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -21,7 +23,7 @@ module Selenium
21
23
  module Http
22
24
  class Common
23
25
  MAX_REDIRECTS = 20 # same as chromium/gecko
24
- CONTENT_TYPE = 'application/json'.freeze
26
+ CONTENT_TYPE = 'application/json'
25
27
  DEFAULT_HEADERS = {
26
28
  'Accept' => CONTENT_TYPE,
27
29
  'Content-Type' => "#{CONTENT_TYPE}; charset=UTF-8",
@@ -50,7 +52,7 @@ module Selenium
50
52
 
51
53
  if command_hash
52
54
  payload = JSON.generate(command_hash)
53
- headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
55
+ headers['Content-Length'] = payload.bytesize.to_s if %i[post put].include?(verb)
54
56
 
55
57
  WebDriver.logger.info(" >>> #{url} | #{payload}")
56
58
  WebDriver.logger.debug(" > #{headers.inspect}")
@@ -66,6 +68,7 @@ module Selenium
66
68
 
67
69
  def server_url
68
70
  return @server_url if @server_url
71
+
69
72
  raise Error::WebDriverError, 'server_url not set'
70
73
  end
71
74
 
@@ -81,12 +84,16 @@ module Selenium
81
84
 
82
85
  if content_type.include? CONTENT_TYPE
83
86
  raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
87
+
84
88
  Response.new(code, JSON.parse(body))
85
89
  elsif code == 204
86
90
  Response.new(code)
87
91
  else
88
- msg = "unexpected response, code=#{code}, content-type=#{content_type.inspect}"
89
- 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
90
97
 
91
98
  raise Error::WebDriverError, msg
92
99
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -77,7 +79,7 @@ module Selenium
77
79
  end
78
80
 
79
81
  def client
80
- @client ||= (
82
+ @client ||= begin
81
83
  c = Curl::Easy.new
82
84
 
83
85
  c.max_redirects = MAX_REDIRECTS
@@ -86,7 +88,7 @@ module Selenium
86
88
  c.verbose = WebDriver.logger.info?
87
89
 
88
90
  c
89
- )
91
+ end
90
92
  end
91
93
  end # Curb
92
94
  end # Http
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
2
4
  # or more contributor license agreements. See the NOTICE file
3
5
  # distributed with this work for additional information
@@ -48,22 +50,26 @@ module Selenium
48
50
  self.read_timeout = value
49
51
  end
50
52
 
53
+ def close
54
+ @http&.finish
55
+ end
56
+
51
57
  private
52
58
 
53
59
  def http
54
- @http ||= (
55
- http = new_http_client
56
- if server_url.scheme == 'https'
57
- http.use_ssl = true
58
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
59
- end
60
+ @http ||= begin
61
+ http = new_http_client
62
+ if server_url.scheme == 'https'
63
+ http.use_ssl = true
64
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
65
+ end
60
66
 
61
- # Defaulting open_timeout to nil to be consistent with Ruby 2.2 and earlier.
62
- http.open_timeout = self.open_timeout
63
- http.read_timeout = self.read_timeout if self.read_timeout
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
64
70
 
65
- http
66
- )
71
+ http.start
72
+ end
67
73
  end
68
74
 
69
75
  MAX_RETRIES = 3
@@ -83,22 +89,26 @@ module Selenium
83
89
  #
84
90
  # http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
85
91
  raise if retries >= MAX_RETRIES
92
+
86
93
  retries += 1
87
94
  sleep 2
88
95
  retry
89
96
  rescue Errno::EADDRNOTAVAIL => ex
90
97
  # a retry is sometimes needed when the port becomes temporarily unavailable
91
98
  raise if retries >= MAX_RETRIES
99
+
92
100
  retries += 1
93
101
  sleep 2
94
102
  retry
95
103
  rescue Errno::ECONNREFUSED => ex
96
104
  raise ex.class, "using proxy: #{proxy.http}" if use_proxy?
105
+
97
106
  raise
98
107
  end
99
108
 
100
109
  if response.is_a? Net::HTTPRedirection
101
110
  raise Error::WebDriverError, 'too many redirects' if redirects >= MAX_REDIRECTS
111
+
102
112
  request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
103
113
  else
104
114
  create_response response.code, response.body, response.content_type
@@ -108,9 +118,7 @@ module Selenium
108
118
  def new_request_for(verb, url, headers, payload)
109
119
  req = Net::HTTP.const_get(verb.to_s.capitalize).new(url.path, headers)
110
120
 
111
- if server_url.userinfo
112
- req.basic_auth server_url.user, server_url.password
113
- end
121
+ req.basic_auth server_url.user, server_url.password if server_url.userinfo
114
122
 
115
123
  req.body = payload if payload
116
124
 
@@ -124,9 +132,7 @@ module Selenium
124
132
  def new_http_client
125
133
  if use_proxy?
126
134
  url = @proxy.http
127
- unless proxy.respond_to?(:http) && url
128
- raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}"
129
- end
135
+ raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}" unless proxy.respond_to?(:http) && url
130
136
 
131
137
  proxy = URI.parse(url)
132
138
 
@@ -138,15 +144,15 @@ module Selenium
138
144
  end
139
145
 
140
146
  def proxy
141
- @proxy ||= (
142
- proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
143
- no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
147
+ @proxy ||= begin
148
+ proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
149
+ no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
144
150
 
145
- if proxy
146
- proxy = "http://#{proxy}" unless proxy.start_with?('http://')
147
- Proxy.new(http: proxy, no_proxy: no_proxy)
151
+ if proxy
152
+ proxy = "http://#{proxy}" unless proxy.start_with?('http://')
153
+ Proxy.new(http: proxy, no_proxy: no_proxy)
154
+ end
148
155
  end
149
- )
150
156
  end
151
157
 
152
158
  def use_proxy?
@@ -161,7 +167,7 @@ module Selenium
161
167
  rescue ArgumentError
162
168
  false
163
169
  end
164
- )
170
+ )
165
171
  end
166
172
 
167
173
  !ignored