{"record":{"id":"d4f22898315d8e6e","repo":"microsoft/playwright","slug":"unknown-button-button","errorCode":null,"errorMessage":"Unknown button: ${button}","messagePattern":"Unknown button: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/bidi/bidiInput.ts","lineNumber":153,"sourceCode":"\nexport class RawTouchscreenImpl implements input.RawTouchscreen {\n  private readonly _session: BidiSession;\n\n  constructor(session: BidiSession) {\n    this._session = session;\n  }\n\n  async tap(progress: Progress, x: number, y: number, modifiers: Set<types.KeyboardModifier>) {\n  }\n}\n\nfunction toBidiButton(button: string): number {\n  switch (button) {\n    case 'left': return 0;\n    case 'right': return 2;\n    case 'middle': return 1;\n  }\n  throw new Error('Unknown button: ' + button);\n}\n","sourceCodeStart":135,"sourceCodeEnd":155,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/bidi/bidiInput.ts#L135-L155","documentation":"`toBidiButton` maps mouse button names to BiDi codes: left→0, middle→1, right→2. Any other string is rejected. The public API types restrict to 'left'|'right'|'middle', so this is a defensive guard reached mainly through type unsoundness or internal misuse.","triggerScenarios":"Calling mouse methods (down/up/click) with a button string outside the allowed set — typically via a cast to `any`, a JS caller passing arbitrary strings, or an internal path forwarding an unvalidated value.","commonSituations":"Type assertions bypassing `MouseButton`; JavaScript callers passing 'back'/'forward' which Playwright/BiDi don't support; dynamic button selection from config without validation.","solutions":["Use only 'left', 'right', or 'middle' for mouse buttons","Don't cast button values to `any`","Note that back/forward mouse buttons are not currently supported by Playwright/BiDi"],"exampleFix":"// before\nawait page.mouse.down({ button: 'back' as any });\n\n// after\nawait page.mouse.down({ button: 'middle' });","handlingStrategy":"type-guard","validationCode":"const BUTTONS = new Set(['left', 'right', 'middle']);\nfunction assertButton(b: string): void {\n  if (!BUTTONS.has(b)) throw new Error(`Unsupported mouse button: ${b}`);\n}\nassertButton(configButton);\nawait page.mouse.down({ button: configButton });","typeGuard":"function isMouseButton(b: unknown): b is 'left' | 'right' | 'middle' {\n  return b === 'left' || b === 'right' || b === 'middle';\n}","tryCatchPattern":null,"preventionTips":["Don't cast button values to `any`","Keep button config typed as 'left'|'right'|'middle'","Remember back/forward buttons aren't supported"],"tags":["bidi","input","mouse","types"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}