class Selenium::WebDriver::Remote::Response

@api private

Constants

STACKTRACE_KEY

Attributes

code[R]
payload[RW]

Public Class Methods

new(code, payload = nil) click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 30
def initialize(code, payload = nil)
  @code    = code
  @payload = payload || {}

  assert_ok
end

Public Instance Methods

[](key) click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 65
def [](key)
  @payload[key]
end
error() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 37
def error
  klass = Error.for_code(status) || return

  ex = klass.new(error_message)
  ex.set_backtrace(caller)
  add_backtrace ex

  ex
end
error_message() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 47
def error_message
  val = value

  case val
  when Hash
    msg = val['message']
    return 'unknown error' unless msg

    msg << ": #{val['alert']['text'].inspect}" if val['alert'].is_a?(Hash) && val['alert']['text']
    msg << " (#{val['class']})" if val['class']
    msg
  when String
    val
  else
    "unknown error, status=#{status}: #{val.inspect}"
  end
end

Private Instance Methods

add_backtrace(ex) click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 79
def add_backtrace(ex)
  return unless error_payload.is_a?(Hash)

  # Legacy Firefox returns String in ['value'], while we expect Hash.
  # Use #dig when Firefox legacy is removed (4.0).
  server_trace = error_payload[STACKTRACE_KEY] ||
                 error_payload[STACKTRACE_KEY.downcase] ||
                 (error_payload['value'] && error_payload['value'][STACKTRACE_KEY])
  return unless server_trace

  backtrace = case server_trace
              when Array
                backtrace_from_remote(server_trace)
              when String
                server_trace.split("\n")
              end

  ex.set_backtrace(backtrace + ex.backtrace)
end
assert_ok() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 71
def assert_ok
  e = error
  raise e if e
  return unless @code.nil? || @code >= 400

  raise Error::ServerError, self
end
backtrace_from_remote(server_trace) click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 99
def backtrace_from_remote(server_trace)
  server_trace.map { |frame|
    next unless frame.is_a?(Hash)

    file = frame['fileName']
    line = frame['lineNumber']
    meth = frame['methodName']

    class_name = frame['className']
    file = "#{class_name}(#{file})" if class_name

    meth = 'unknown' if meth.nil? || meth.empty?

    "[remote server] #{file}:#{line}:in `#{meth}'"
  }.compact
end
error_payload() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 116
def error_payload
  # Even errors are wrapped in 'value' for w3c
  # Grab 'value' key for error, leave original payload alone and let the bridge process
  @error_payload ||= !@payload.key?('sessionId') ? @payload['value'] : @payload
end
status() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 122
def status
  return unless error_payload.is_a? Hash

  @status ||= error_payload['status'] || error_payload['error']
end
value() click to toggle source
# File lib/selenium/webdriver/remote/response.rb, line 128
def value
  return unless error_payload.is_a? Hash

  @value ||= error_payload['value'] || error_payload['message']
end