{"record":{"id":"e77081ec685611be","repo":"SeleniumHQ/selenium","slug":"invalid-arguments-opts-keys-e77081","errorCode":null,"errorMessage":"Invalid arguments: #{opts.keys}","messagePattern":"Invalid arguments: #(.+?)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"rb/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb","lineNumber":45,"sourceCode":"    class VirtualAuthenticatorOptions\n      PROTOCOL = {ctap2: 'ctap2', u2f: 'ctap1/u2f'}.freeze\n      TRANSPORT = {ble: 'ble', usb: 'usb', nfc: 'nfc', internal: 'internal'}.freeze\n\n      attr_accessor :protocol, :transport, :resident_key, :user_verification, :user_consenting, :user_verified\n      alias resident_key? resident_key\n      alias user_verification? user_verification\n      alias user_consenting? user_consenting\n      alias user_verified? user_verified\n\n      def initialize(**opts)\n        @protocol = opts.delete(:protocol) { :ctap2 }\n        @transport = opts.delete(:transport) { :usb }\n        @resident_key = opts.delete(:resident_key) { false }\n        @user_verification = opts.delete(:user_verification) { false }\n        @user_consenting = opts.delete(:user_consenting) { true }\n        @user_verified = opts.delete(:user_verified) { false }\n\n        raise ArgumentError, \"Invalid arguments: #{opts.keys}\" unless opts.empty?\n      end\n\n      #\n      # @api private\n      #\n\n      def as_json(*)\n        {'protocol' => PROTOCOL[protocol],\n         'transport' => TRANSPORT[transport],\n         'hasResidentKey' => resident_key?,\n         'hasUserVerification' => user_verification?,\n         'isUserConsenting' => user_consenting?,\n         'isUserVerified' => user_verified?}\n      end\n    end # VirtualAuthenticatorOptions\n  end # WebDriver\nend # Selenium\n","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/rb/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb#L27-L63","documentation":"Raised by VirtualAuthenticatorOptions#initialize when keyword arguments contain keys other than the six recognized options: :protocol, :transport, :resident_key, :user_verification, :user_consenting, :user_verified. After deleting known keys from the opts hash, any remaining keys trigger ArgumentError listing the unexpected ones.","triggerScenarios":"Calling VirtualAuthenticatorOptions.new(protoccol: :u2f) (typo). Passing :hasResidentKey (camelCase from the JSON spec) instead of :resident_key. Passing :userVerification instead of :user_verification. Passing an unrelated key like :name or :browser.","commonSituations":"Translating WebAuthn spec JSON fields (camelCase) to Ruby kwargs (snake_case) incorrectly. Typos in option names. Passing a Hash from external/config data without filtering.","solutions":["Use only recognized snake_case keys: protocol:, transport:, resident_key:, user_verification:, user_consenting:, user_verified:.","Valid values for protocol: :ctap2 (default) or :u2f. For transport: :ble, :usb (default), :nfc, :internal.","Filter external data before passing: opts.slice(:protocol, :transport, :resident_key, :user_verification, :user_consenting, :user_verified)."],"exampleFix":"// before\nopts = Selenium::WebDriver::VirtualAuthenticatorOptions.new(\n  protoccol: :u2f,          # typo\n  hasResidentKey: true,     # camelCase\n  userVerification: true    # camelCase\n)\n\n// after\nopts = Selenium::WebDriver::VirtualAuthenticatorOptions.new(\n  protocol: :u2f,\n  resident_key: true,\n  user_verification: true\n)","handlingStrategy":"validation","validationCode":"VALID_VA_OPTS = %i[protocol transport resident_key user_verification user_consenting user_verified].freeze\n\ndef safe_va_options(opts)\n  unknown = opts.keys - VALID_VA_OPTS\n  raise ArgumentError, \"Unknown VirtualAuthenticatorOptions keys: #{unknown}. Valid: #{VALID_VA_OPTS}\" unless unknown.empty?\n  Selenium::WebDriver::VirtualAuthenticatorOptions.new(**opts)\nend","typeGuard":"def valid_va_opts?(opts)\n  (opts.keys - %i[protocol transport resident_key user_verification user_consenting user_verified]).empty?\nend","tryCatchPattern":"begin\n  va_opts = Selenium::WebDriver::VirtualAuthenticatorOptions.new(**opts)\nrescue ArgumentError => e\n  raise unless e.message.include?('Invalid arguments')\n  filtered = opts.slice(:protocol, :transport, :resident_key, :user_verification, :user_consenting, :user_verified)\n  va_opts = Selenium::WebDriver::VirtualAuthenticatorOptions.new(**filtered)\nend","preventionTips":["Use snake_case Ruby kwargs: protocol, transport, resident_key, user_verification, user_consenting, user_verified.","Do not copy camelCase JSON keys (hasResidentKey, isUserConsenting) directly from the protocol spec.","Validate protocol (:ctap2, :u2f) and transport (:ble, :usb, :nfc, :internal) values against the PROTOCOL/TRANSPORT constants."],"tags":["virtual-authenticator","options","argument-error","ruby"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}