{"record":{"id":"76e9e1e400b9d926","repo":"SeleniumHQ/selenium","slug":"invalid-arguments-opts-keys-76e9e1","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/credential.rb","lineNumber":67,"sourceCode":"              rp_id: opts['rpId'],\n              private_key: decode(opts['privateKey']),\n              sign_count: opts['signCount'],\n              user_handle: user_handle)\n        end\n      end\n\n      attr_reader :id, :resident_credential, :rp_id, :user_handle, :private_key, :sign_count\n      alias resident_credential? resident_credential\n\n      def initialize(id:, resident_credential:, rp_id:, private_key:, **opts)\n        @id = id\n        @resident_credential = resident_credential\n        @rp_id = rp_id\n        @user_handle = opts.delete(:user_handle) { nil }\n        @private_key = private_key\n        @sign_count = opts.delete(:sign_count) { 0 }\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        credential_data = {'credentialId' => Credential.encode(id),\n                           'isResidentCredential' => resident_credential?,\n                           'rpId' => rp_id,\n                           'privateKey' => Credential.encode(private_key),\n                           'signCount' => sign_count}\n        credential_data['userHandle'] = Credential.encode(user_handle) if user_handle\n        credential_data\n      end\n    end # Credential\n  end # WebDriver\nend # Selenium","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/rb/lib/selenium/webdriver/common/virtual_authenticator/credential.rb#L49-L85","documentation":"Raised by Selenium::WebDriver::Credential#initialize when the keyword arguments contain keys other than the recognized ones (:id, :resident_credential, :rp_id, :private_key, and the optional :user_handle, :sign_count consumed via **opts). After deleting known keys from opts, if any remain, ArgumentError is raised listing the unexpected keys.","triggerScenarios":"Calling Credential.new(id: ..., rp_id: ..., foo: 'bar') with a typo'd key like :rpId (camelCase) instead of :rp_id. Passing :signCount instead of :sign_count. Passing an extra key that doesn't belong (e.g., :name, :description).","commonSituations":"Copying JSON field names (camelCase) from the WebAuthn spec or DevTools protocol directly as Ruby keyword args (which use snake_case). Typos in keyword argument names. Passing a Hash constructed from external data with unexpected keys.","solutions":["Use only recognized snake_case keys: id:, resident_credential:, rp_id:, private_key:, user_handle:, sign_count:.","Prefer the factory methods Credential.resident(...) and Credential.non_resident(...) which guide correct usage.","If constructing from external data, filter keys before passing: credential_data.slice(:id, :resident_credential, :rp_id, :private_key, :user_handle, :sign_count)."],"exampleFix":"// before\ncred = Selenium::WebDriver::Credential.new(\n  id: [1, 2, 3],\n  resident_credential: true,\n  rpId: 'example.com',       # camelCase typo\n  privateKey: [4, 5, 6],     # camelCase typo\n  signCount: 0               # camelCase typo\n)\n\n// after\ncred = Selenium::WebDriver::Credential.new(\n  id: [1, 2, 3],\n  resident_credential: true,\n  rp_id: 'example.com',\n  private_key: [4, 5, 6],\n  sign_count: 0\n)\n# or use factory:\ncred = Selenium::WebDriver::Credential.resident(\n  id: [1, 2, 3], rp_id: 'example.com', private_key: [4, 5, 6]\n)","handlingStrategy":"validation","validationCode":"VALID_CREDENTIAL_KEYS = %i[id resident_credential rp_id private_key user_handle sign_count].freeze\n\ndef safe_credential(opts)\n  unknown = opts.keys - VALID_CREDENTIAL_KEYS\n  raise ArgumentError, \"Unknown Credential keys: #{unknown}. Valid: #{VALID_CREDENTIAL_KEYS}\" unless unknown.empty?\n  Selenium::WebDriver::Credential.new(**opts)\nend","typeGuard":"def valid_credential_opts?(opts)\n  (opts.keys - %i[id resident_credential rp_id private_key user_handle sign_count]).empty?\nend","tryCatchPattern":"begin\n  cred = Selenium::WebDriver::Credential.new(**opts)\nrescue ArgumentError => e\n  raise unless e.message.include?('Invalid arguments')\n  # filter to known keys and retry\n  filtered = opts.slice(:id, :resident_credential, :rp_id, :private_key, :user_handle, :sign_count)\n  cred = Selenium::WebDriver::Credential.new(**filtered)\nend","preventionTips":["Use snake_case Ruby kwargs, not camelCase JSON field names from the WebAuthn spec.","Prefer the Credential.resident and Credential.non_resident factory methods for guided construction.","When building credentials from external/JSON data, map camelCase to snake_case explicitly."],"tags":["virtual-authenticator","credential","argument-error","ruby"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}