class Selenium::WebDriver::Remote::Response

def [](key)

def [](key)
  @payload[key]
end

def add_cause(ex, error, backtrace)

def add_cause(ex, error, backtrace)
  cause = Error::WebDriverError.new
  backtrace = backtrace_from_remote(backtrace) if backtrace.is_a?(Array)
  cause.set_backtrace(backtrace)
  raise ex, cause: cause
rescue Error.for_error(error)
  ex
end

def assert_ok

def assert_ok
  e = error
  raise e if e
  return unless @code.nil? || @code >= 400
  raise Error::ServerError, self
end

def backtrace_from_remote(server_trace)

def backtrace_from_remote(server_trace)
  server_trace.filter_map do |frame|
    next unless frame.is_a?(Hash)
    file = frame['fileName']
    line = frame['lineNumber']
    method = frame['methodName']
    class_name = frame['className']
    file = "#{class_name}(#{file})" if class_name
    method = 'unknown' if method.nil? || method.empty?
    "[remote server] #{file}:#{line}:in `#{method}'"
  end
end

def error

def error
  error, message, backtrace = process_error
  klass = Error.for_error(error) || return
  ex = klass.new(message)
  add_cause(ex, error, backtrace)
  ex
end

def initialize(code, payload = nil)

def initialize(code, payload = nil)
  @code = code
  @payload = payload || {}
  assert_ok
end

def process_error

def process_error
  return unless self['value'].is_a?(Hash)
  [
    self['value']['error'],
    self['value']['message'],
    self['value']['stacktrace']
  ]
end