Skip to content

Commit 247bc2b

Browse files
authored
[rb] Fix add_cause method not being able to process an array of hashes (#14433)
1 parent a04dd33 commit 247bc2b

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

rb/lib/selenium/webdriver/remote/response.rb

+18
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,30 @@ def assert_ok
5858

5959
def add_cause(ex, error, backtrace)
6060
cause = Error::WebDriverError.new
61+
backtrace = backtrace_from_remote(backtrace) if backtrace.is_a?(Array)
6162
cause.set_backtrace(backtrace)
6263
raise ex, cause: cause
6364
rescue Error.for_error(error)
6465
ex
6566
end
6667

68+
def backtrace_from_remote(server_trace)
69+
server_trace.filter_map do |frame|
70+
next unless frame.is_a?(Hash)
71+
72+
file = frame['fileName']
73+
line = frame['lineNumber']
74+
method = frame['methodName']
75+
76+
class_name = frame['className']
77+
file = "#{class_name}(#{file})" if class_name
78+
79+
method = 'unknown' if method.nil? || method.empty?
80+
81+
"[remote server] #{file}:#{line}:in `#{method}'"
82+
end
83+
end
84+
6785
def process_error
6886
return unless self['value'].is_a?(Hash)
6987

rb/sig/lib/selenium/webdriver/remote/response.rbs

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ module Selenium
2222

2323
def add_cause: (Error::WebDriverError ex, String error, Array[String] backtrace) -> Error::WebDriverError
2424

25+
def backtrace_from_remote: -> Array[String]
26+
2527
def process_error: () -> Array[Hash[untyped, untyped]]
2628
end
2729
end

rb/spec/integration/selenium/webdriver/error_spec.rb

+12
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ module WebDriver
4747
rescue WebDriver::Error::NoSuchElementError => e
4848
expect(e.backtrace).not_to be_empty
4949
end
50+
51+
it 'has backtrace when using a remote server', only: {driver: :remote,
52+
reason: 'This test should only apply to remote drivers'} do
53+
unless driver.is_a?(WebDriver::Remote::Driver)
54+
raise 'This error needs to be risen for the pending test not to fail on local drivers'
55+
end
56+
57+
driver.send(:bridge).instance_variable_set(:@session_id, 'fake_session_id')
58+
driver.window_handle
59+
rescue WebDriver::Error::InvalidSessionIdError => e
60+
expect(e.backtrace).not_to be_empty
61+
end
5062
end
5163
end # WebDriver
5264
end # Selenium

0 commit comments

Comments
 (0)