Keyboard Navigation

Accessibilityintermediate

// Definition

The ability to operate all interactive elements of a user interface using only a keyboard — Tab to move between focusable elements, Enter/Space to activate controls, arrow keys within composite widgets, and Escape to dismiss overlays. WCAG 2.1 Success Criterion 2.1.1 requires that all functionality is operable via keyboard. QA testers verify keyboard navigation by tabbing through a page without a mouse, confirming a visible focus indicator appears on every focusable element, the tab order follows the logical reading order, and no keyboard trap prevents a user from moving forward or escaping a component.

// Why it matters

Everything must work without a mouse — keyboard users, screen-reader users, and many motor-impaired users depend on it. QA cares because it's both a legal requirement and a frequent break point: custom widgets, modals, and SPAs routinely trap focus or skip interactive elements. It's testable with nothing but the Tab key.

// How to test

// Tab order, focus visibility, no traps
cy.visit('/signup')
cy.get('body').tab()                       // (cypress-real-events / plugin)
cy.focused().should('have.attr', 'data-cy', 'email')   // logical first stop
cy.focused().tab()
cy.focused().should('have.attr', 'data-cy', 'password')
// Modal must trap focus while open, and restore it on close
cy.get('[data-cy=open-modal]').click()
cy.focused().should('exist') // focus moved into the modal
cy.get('body').type('{esc}')
cy.focused().should('have.attr', 'data-cy', 'open-modal') // focus returned

// Common mistakes

  • Focus order that doesn't match visual order (jumps around the page)
  • No visible focus indicator (or outline: none with nothing replacing it)
  • Modals/menus that trap focus and never release, or never receive it

// Related terms