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
@@ -0,0 +1,223 @@
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
+ module OSS
24
+
25
+ #
26
+ # https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#command-reference
27
+ # @api private
28
+ #
29
+
30
+ class Bridge
31
+
32
+ COMMANDS = {
33
+ get_capabilities: [:get, 'session/:session_id'],
34
+ status: [:get, 'status'],
35
+
36
+ #
37
+ # basic driver
38
+ #
39
+
40
+ get_current_url: [:get, 'session/:session_id/url'],
41
+ get: [:post, 'session/:session_id/url'],
42
+ go_forward: [:post, 'session/:session_id/forward'],
43
+ go_back: [:post, 'session/:session_id/back'],
44
+ refresh: [:post, 'session/:session_id/refresh'],
45
+ quit: [:delete, 'session/:session_id'],
46
+ close: [:delete, 'session/:session_id/window'],
47
+ get_page_source: [:get, 'session/:session_id/source'],
48
+ get_title: [:get, 'session/:session_id/title'],
49
+ find_element: [:post, 'session/:session_id/element'],
50
+ find_elements: [:post, 'session/:session_id/elements'],
51
+ get_active_element: [:post, 'session/:session_id/element/active'],
52
+
53
+ #
54
+ # window handling
55
+ #
56
+
57
+ get_current_window_handle: [:get, 'session/:session_id/window_handle'],
58
+ get_window_handles: [:get, 'session/:session_id/window_handles'],
59
+ set_window_size: [:post, 'session/:session_id/window/:window_handle/size'],
60
+ set_window_position: [:post, 'session/:session_id/window/:window_handle/position'],
61
+ get_window_size: [:get, 'session/:session_id/window/:window_handle/size'],
62
+ get_window_position: [:get, 'session/:session_id/window/:window_handle/position'],
63
+ maximize_window: [:post, 'session/:session_id/window/:window_handle/maximize'],
64
+
65
+ #
66
+ # script execution
67
+ #
68
+
69
+ execute_script: [:post, 'session/:session_id/execute'],
70
+ execute_async_script: [:post, 'session/:session_id/execute_async'],
71
+
72
+ #
73
+ # screenshot
74
+ #
75
+
76
+ screenshot: [:get, 'session/:session_id/screenshot'],
77
+
78
+ #
79
+ # alerts
80
+ #
81
+
82
+ dismiss_alert: [:post, 'session/:session_id/dismiss_alert'],
83
+ accept_alert: [:post, 'session/:session_id/accept_alert'],
84
+ get_alert_text: [:get, 'session/:session_id/alert_text'],
85
+ set_alert_value: [:post, 'session/:session_id/alert_text'],
86
+ set_authentication: [:post, 'session/:session_id/alert/credentials'],
87
+
88
+ #
89
+ # target locator
90
+ #
91
+
92
+ switch_to_frame: [:post, 'session/:session_id/frame'],
93
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
94
+ switch_to_window: [:post, 'session/:session_id/window'],
95
+
96
+ #
97
+ # options
98
+ #
99
+
100
+ get_cookies: [:get, 'session/:session_id/cookie'],
101
+ add_cookie: [:post, 'session/:session_id/cookie'],
102
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'],
103
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
104
+
105
+ #
106
+ # timeouts
107
+ #
108
+
109
+ implicitly_wait: [:post, 'session/:session_id/timeouts/implicit_wait'],
110
+ set_script_timeout: [:post, 'session/:session_id/timeouts/async_script'],
111
+ set_timeout: [:post, 'session/:session_id/timeouts'],
112
+
113
+ #
114
+ # element
115
+ #
116
+
117
+ describe_element: [:get, 'session/:session_id/element/:id'],
118
+ find_child_element: [:post, 'session/:session_id/element/:id/element'],
119
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
120
+ click_element: [:post, 'session/:session_id/element/:id/click'],
121
+ submit_element: [:post, 'session/:session_id/element/:id/submit'],
122
+ get_element_value: [:get, 'session/:session_id/element/:id/value'],
123
+ send_keys_to_element: [:post, 'session/:session_id/element/:id/value'],
124
+ upload_file: [:post, 'session/:session_id/file'],
125
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
126
+ clear_element: [:post, 'session/:session_id/element/:id/clear'],
127
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
128
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
129
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
130
+ element_equals: [:get, 'session/:session_id/element/:id/equals/:other'],
131
+ is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'],
132
+ get_element_location: [:get, 'session/:session_id/element/:id/location'],
133
+ get_element_location_once_scrolled_into_view: [:get, 'session/:session_id/element/:id/location_in_view'],
134
+ get_element_size: [:get, 'session/:session_id/element/:id/size'],
135
+ drag_element: [:post, 'session/:session_id/element/:id/drag'],
136
+ get_element_value_of_css_property: [:get, 'session/:session_id/element/:id/css/:property_name'],
137
+ get_element_text: [:get, 'session/:session_id/element/:id/text'],
138
+
139
+ #
140
+ # rotatable
141
+ #
142
+
143
+ get_screen_orientation: [:get, 'session/:session_id/orientation'],
144
+ set_screen_orientation: [:post, 'session/:session_id/orientation'],
145
+
146
+ #
147
+ # interactions API
148
+ #
149
+
150
+ click: [:post, 'session/:session_id/click'],
151
+ double_click: [:post, 'session/:session_id/doubleclick'],
152
+ mouse_down: [:post, 'session/:session_id/buttondown'],
153
+ mouse_up: [:post, 'session/:session_id/buttonup'],
154
+ mouse_move_to: [:post, 'session/:session_id/moveto'],
155
+ send_modifier_key_to_active_element: [:post, 'session/:session_id/modifier'],
156
+ send_keys_to_active_element: [:post, 'session/:session_id/keys'],
157
+
158
+ #
159
+ # html 5
160
+ #
161
+
162
+ execute_sql: [:post, 'session/:session_id/execute_sql'],
163
+
164
+ get_location: [:get, 'session/:session_id/location'],
165
+ set_location: [:post, 'session/:session_id/location'],
166
+
167
+ get_app_cache: [:get, 'session/:session_id/application_cache'],
168
+ get_app_cache_status: [:get, 'session/:session_id/application_cache/status'],
169
+ clear_app_cache: [:delete, 'session/:session_id/application_cache/clear'],
170
+
171
+ get_network_connection: [:get, 'session/:session_id/network_connection'],
172
+ set_network_connection: [:post, 'session/:session_id/network_connection'],
173
+
174
+ get_local_storage_item: [:get, 'session/:session_id/local_storage/key/:key'],
175
+ remove_local_storage_item: [:delete, 'session/:session_id/local_storage/key/:key'],
176
+ get_local_storage_keys: [:get, 'session/:session_id/local_storage'],
177
+ set_local_storage_item: [:post, 'session/:session_id/local_storage'],
178
+ clear_local_storage: [:delete, 'session/:session_id/local_storage'],
179
+ get_local_storage_size: [:get, 'session/:session_id/local_storage/size'],
180
+
181
+ get_session_storage_item: [:get, 'session/:session_id/session_storage/key/:key'],
182
+ remove_session_storage_item: [:delete, 'session/:session_id/session_storage/key/:key'],
183
+ get_session_storage_keys: [:get, 'session/:session_id/session_storage'],
184
+ set_session_storage_item: [:post, 'session/:session_id/session_storage'],
185
+ clear_session_storage: [:delete, 'session/:session_id/session_storage'],
186
+ get_session_storage_size: [:get, 'session/:session_id/session_storage/size'],
187
+
188
+ #
189
+ # ime
190
+ #
191
+
192
+ ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'],
193
+ ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'],
194
+ ime_is_activated: [:get, 'session/:session_id/ime/activated'],
195
+ ime_deactivate: [:post, 'session/:session_id/ime/deactivate'],
196
+ ime_activate_engine: [:post, 'session/:session_id/ime/activate'],
197
+
198
+ #
199
+ # touch
200
+ #
201
+
202
+ touch_single_tap: [:post, 'session/:session_id/touch/click'],
203
+ touch_double_tap: [:post, 'session/:session_id/touch/doubleclick'],
204
+ touch_long_press: [:post, 'session/:session_id/touch/longclick'],
205
+ touch_down: [:post, 'session/:session_id/touch/down'],
206
+ touch_up: [:post, 'session/:session_id/touch/up'],
207
+ touch_move: [:post, 'session/:session_id/touch/move'],
208
+ touch_scroll: [:post, 'session/:session_id/touch/scroll'],
209
+ touch_flick: [:post, 'session/:session_id/touch/flick'],
210
+
211
+ #
212
+ # logs
213
+ #
214
+
215
+ get_available_log_types: [:get, 'session/:session_id/log/types'],
216
+ get_log: [:post, 'session/:session_id/log']
217
+ }.freeze
218
+
219
+ end # Bridge
220
+ end # OSS
221
+ end # Remote
222
+ end # WebDriver
223
+ 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,9 +20,9 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Remote
23
-
24
23
  # @api private
25
24
  class Response
25
+ STACKTRACE_KEY = 'stackTrace'
26
26
 
27
27
  attr_reader :code, :payload
28
28
  attr_writer :payload
@@ -49,9 +49,11 @@ module Selenium
49
49
 
50
50
  case val
51
51
  when Hash
52
- msg = val['message'] or return "unknown error"
53
- msg << ": #{val['alert']['text'].inspect}" if val['alert'].kind_of?(Hash) && val['alert']['text']
54
- msg << " (#{ val['class'] })" if val['class']
52
+ msg = val['message']
53
+ return 'unknown error' unless msg
54
+
55
+ msg << ": #{val['alert']['text'].inspect}" if val['alert'].is_a?(Hash) && val['alert']['text']
56
+ msg << " (#{val['class']})" if val['class']
55
57
  msg
56
58
  when String
57
59
  val
@@ -67,49 +69,67 @@ module Selenium
67
69
  private
68
70
 
69
71
  def assert_ok
70
- if e = error()
71
- raise e
72
- elsif @code.nil? || @code >= 400
73
- raise Error::ServerError, self
74
- end
72
+ e = error
73
+ raise e if e
74
+ return unless @code.nil? || @code >= 400
75
+
76
+ raise Error::ServerError, self
75
77
  end
76
78
 
77
79
  def add_backtrace(ex)
78
- unless value.kind_of?(Hash) && value['stackTrace']
79
- return
80
- end
80
+ return unless error_payload.is_a?(Hash)
81
+
82
+ # Legacy Firefox returns String in ['value'], while we expect Hash.
83
+ # Use #dig when Firefox legacy is removed (4.0).
84
+ server_trace = error_payload[STACKTRACE_KEY] ||
85
+ error_payload[STACKTRACE_KEY.downcase] ||
86
+ (error_payload['value'] && error_payload['value'][STACKTRACE_KEY])
87
+ return unless server_trace
88
+
89
+ backtrace = case server_trace
90
+ when Array
91
+ backtrace_from_remote(server_trace)
92
+ when String
93
+ server_trace.split("\n")
94
+ end
81
95
 
82
- server_trace = value['stackTrace']
96
+ ex.set_backtrace(backtrace + ex.backtrace)
97
+ end
83
98
 
84
- backtrace = server_trace.map do |frame|
85
- next unless frame.kind_of?(Hash)
99
+ def backtrace_from_remote(server_trace)
100
+ server_trace.map { |frame|
101
+ next unless frame.is_a?(Hash)
86
102
 
87
103
  file = frame['fileName']
88
104
  line = frame['lineNumber']
89
105
  meth = frame['methodName']
90
106
 
91
- if class_name = frame['className']
92
- file = "#{class_name}(#{file})"
93
- end
107
+ class_name = frame['className']
108
+ file = "#{class_name}(#{file})" if class_name
94
109
 
95
- if meth.nil? || meth.empty?
96
- meth = 'unknown'
97
- end
110
+ meth = 'unknown' if meth.nil? || meth.empty?
98
111
 
99
112
  "[remote server] #{file}:#{line}:in `#{meth}'"
100
- end.compact
113
+ }.compact
114
+ end
101
115
 
102
- ex.set_backtrace(backtrace + ex.backtrace)
116
+ def error_payload
117
+ # Even errors are wrapped in 'value' for w3c
118
+ # Grab 'value' key for error, leave original payload alone and let the bridge process
119
+ @error_payload ||= !@payload.key?('sessionId') ? @payload['value'] : @payload
103
120
  end
104
121
 
105
122
  def status
106
- @payload['status'] || @payload['error']
123
+ return unless error_payload.is_a? Hash
124
+
125
+ @status ||= error_payload['status'] || error_payload['error']
107
126
  end
108
127
 
109
128
  def value
110
- @payload['value'] || @payload['message']
111
- end
129
+ return unless error_payload.is_a? Hash
112
130
 
131
+ @value ||= error_payload['value'] || error_payload['message']
132
+ end
113
133
  end # Response
114
134
  end # Remote
115
135
  end # WebDriver
@@ -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
@@ -21,15 +21,13 @@ module Selenium
21
21
  module WebDriver
22
22
  module Error
23
23
  class ServerError < StandardError
24
-
25
24
  def initialize(response)
26
- if response.kind_of? String
25
+ if response.is_a? String
27
26
  super(response)
28
27
  else
29
28
  super("status code #{response.code}")
30
29
  end
31
30
  end
32
-
33
31
  end # ServerError
34
32
  end # Error
35
33
  end # WebDriver