{"record":{"id":"1fbd9115cf2a93b9","repo":"teamcapybara/capybara","slug":"unknown-keys-type-1fbd91","errorCode":null,"errorMessage":"Unknown keys type","messagePattern":"Unknown keys type","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/capybara/selenium/nodes/safari_node.rb","lineNumber":108,"sourceCode":"\nprivate\n\n  def _send_keys(keys, actions = browser_action, down_keys = ModifierKeysStack.new)\n    case keys\n    when *MODIFIER_KEYS\n      down_keys.press(keys)\n      actions.key_down(keys)\n    when String\n      keys = keys.upcase if down_keys&.include?(:shift)\n      actions.send_keys(keys)\n    when Symbol\n      actions.send_keys(keys)\n    when Array\n      down_keys.push\n      keys.each { |sub_keys| _send_keys(sub_keys, actions, down_keys) }\n      down_keys.pop.reverse_each { |key| actions.key_up(key) }\n    else\n      raise ArgumentError, 'Unknown keys type'\n    end\n    actions\n  end\n\n  MODIFIER_KEYS = %i[control left_control right_control\n                     alt left_alt right_alt\n                     shift left_shift right_shift\n                     meta left_meta right_meta\n                     command].freeze\nend\n","sourceCodeStart":90,"sourceCodeEnd":119,"githubUrl":"https://github.com/teamcapybara/capybara/blob/15b5fdb76e972e9623d5af2123ed3755594f9732/lib/capybara/selenium/nodes/safari_node.rb#L90-L119","documentation":"Raised by _send_keys in the Selenium Safari node when a value sent to an element is not a String, Symbol, or Array. The dispatcher case-matches those three types and everything else (Integer, Float, nil, Hash) falls into the else branch with 'Unknown keys type'.","triggerScenarios":"find('#pin').send_keys(1234) or el.set(42) on the selenium_safari driver; send_keys(nil); arrays mixing invalid members such as [1, :enter]; passing keycodes as integers copied from other driver APIs.","commonSituations":"Passing numeric values from factories, Faker, or Cucumber step tables straight to send_keys; porting specs from rack_test (which stringifies input) to selenium; translating Java/JS sendKeys examples that use char codes literally.","solutions":["Convert before sending: find('#pin').send_keys(pin.to_s)","Send special keys as symbols: send_keys('text', :enter) or send_keys([:shift, 'a'])","Centralize input in a helper that coerces: def type_into(el, val) el.send_keys(String(val)) end"],"exampleFix":"# before\nfind('#pin').set(1234)\n\n# after\nfind('#pin').set(1234.to_s)","handlingStrategy":"type-guard","validationCode":"def valid_keys?(k)\n  case k\n  when String, Symbol then true\n  when Array then k.all? { |sub| valid_keys?(sub) }\n  else false\n  end\nend\n\nfind('#pin').send_keys(value) if valid_keys?(value)","typeGuard":"def coerce_keys(k)\n  case k\n  when String, Symbol, Array then k\n  else k.to_s\n  end\nend\n\nfind('#pin').send_keys(coerce_keys(user_pin))","tryCatchPattern":"begin\n  el.send_keys(value)\nrescue ArgumentError => e\n  raise unless e.message == 'Unknown keys type'\n  el.send_keys(value.to_s)\nend","preventionTips":["Call .to_s on any external or numeric data before send_keys","Use Selenium key symbols (:enter, :shift) for special keys, never integer codes","Route all keyboard input through one coercion helper"],"tags":["send-keys","safari","selenium","type-validation","input"],"backgroundTag":"invalid-argument-type","analyzedSha":"15b5fdb76e972e9623d5af2123ed3755594f9732","analyzedAt":"2026-08-21T16:53:45.588Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}