GUIDE / accessibility
Keyboard Navigation Testing
Learn keyboard navigation testing for web apps: tab order, focus indicators, skip links, modal focus traps, and practical QA test cases you can run today.
Keyboard navigation testing checks whether people can reach, operate, and understand your interface without a mouse or trackpad. Many users rely on keyboards full time, including people with motor disabilities and many power users. If a modal cannot be closed, a menu cannot be opened, or focus disappears into the void, the feature is broken for them no matter how pretty it looks.
This guide shows how to test keyboard accessibility, how to judge logical focus order, and how to test skip links and focus traps in modals. You will get a tab order testing checklist, keyboard only navigation test cases, and practical notes on visible focus indicator WCAG 2.4.7 expectations you can apply on real product journeys.
Why Keyboard Navigation Testing Belongs in Everyday QA
Keyboard issues are functional bugs with a clear user impact: a task cannot be completed. They are also common in modern front-end work because custom widgets, design systems, and JavaScript layers often reinvent behavior that native HTML already handled.
Typical failures:
- Interactive cards or divs that work only with click handlers.
- Focus styles removed for aesthetics.
- Modals that open without moving focus.
- Focus traps that lock users in with no Escape path.
- Off-canvas menus that keep background content in the tab order.
- Hidden elements that still receive focus.
- Skip links that are present in code but never become reachable or visible.
- Custom dropdowns that ignore arrow keys and Escape.
If your team already runs automated accessibility testing with axe, keep doing that. Keyboard navigation testing still has to happen because many operable failures are not fully visible to rule engines.
Keyboard Navigation Testing Principles
Before checklists, internalize five principles:
- Reachable. Every interactive control needed for a task can receive focus.
- Operable. Users can activate and manipulate controls with expected keys.
- Predictable. Focus order matches visual layout and task flow.
- Visible. Users can always see where focus is.
- Recoverable. Users can enter and leave components without dead ends.
These principles map cleanly to WCAG operable criteria around keyboard access, focus order, focus visible, and bypass blocks.
Keys and Expected Behaviors
| Key | Common use in web UIs |
|---|---|
| Tab | Move to next focusable control |
| Shift+Tab | Move to previous focusable control |
| Enter | Activate links, buttons, submit forms, select items |
| Space | Activate buttons, toggle checkboxes, scroll in some contexts |
| Escape | Close dialogs, menus, popovers |
| Arrow keys | Move within composite widgets (tabs, radios, menus, listboxes) |
| Home / End | Jump to first or last item in some widgets |
| Page Up / Page Down | Larger jumps in grids or long lists when supported |
A common QA mistake is using only Tab for everything. Many composite widgets are designed for arrows inside and Tab to enter or leave. Test the pattern that the control type promises.
How to Test Keyboard Accessibility Step by Step
Step 1: Set up a clean input mode
- Put the mouse aside, or at least do not use it for the journey.
- On laptops, avoid trackpad rescue habits.
- Use a physical keyboard when possible.
- Zoom to 100% unless zoom itself is under test.
- Note browser and OS because focus ring defaults can differ.
Step 2: Identify the journey and success criteria
Examples:
- Sign in.
- Create a project.
- Complete checkout.
- Filter a table and export.
- Update profile settings in a modal.
Write the success condition in task language: "User can complete checkout using only keyboard."
Step 3: Start at the top of the page
Press Tab from the address bar or page load focus and observe:
- Does a skip link appear early?
- Is the first focus stop sensible?
- Does focus become visible immediately?
Step 4: Walk the full tab order
Move forward and backward through the page. For each stop, ask:
- Is this control supposed to be interactive?
- Is the focus indicator easy to see against the background?
- Does the order match the visual layout?
- Did focus land on something hidden, empty, or decorative?
- Are there unexpected tab stops inside hidden content?
Step 5: Operate controls with the right keys
- Buttons and links with Enter or Space as appropriate.
- Checkboxes and switches with Space.
- Radios with arrows.
- Tabs and menus with arrows plus Enter or Space according to pattern.
- Dialogs with Escape and intentional focus containment.
Step 6: Exercise state changes
Open menus, dialogs, drawers, date pickers, and validation states. Many keyboard bugs exist only after the UI mutates.
Step 7: Confirm recovery and completion
Can the user finish the task and return to a known place? After closing a modal, does focus go back to the trigger? After submitting, is the next step reachable?
What Is a Logical Focus Order?
Logical focus order is the sequence keyboard users travel through interactive elements. It should support comprehension and task completion.
Good focus order traits
- Matches visual reading order for the language direction.
- Groups related controls together.
- Enters a component, finishes its controls, then leaves.
- Does not leap into footer links in the middle of a form without reason.
- Does not visit invisible or collapsed content that users cannot understand.
Common focus order bugs
| Bug | What you observe | Typical cause |
|---|---|---|
| Visual vs DOM mismatch | Focus jumps around the layout | CSS reorders visuals without matching DOM |
| Hidden tab stops | Focus vanishes or lands on unseen controls | display/visibility mistakes, off-screen panels left focusable |
| Grid chaos | Order traverses columns in confusing ways | DOM order not aligned to visual grid intent |
| Sticky chrome interruptions | Focus repeatedly hits the same chrome too early or too often | Over-aggressive sticky controls without skip options |
| Late primary action | Submit appears long after unrelated content | Footer content inserted between form fields in DOM |
When you find a mismatch, record both the visual path and the actual tab path. Screenshots with numbered focus stops are excellent evidence.
Visible Focus Indicator WCAG 2.4.7
WCAG 2.4.7 Focus Visible requires that keyboard focus has a visible indicator. Teams often remove default outlines and forget to replace them with something equally clear.
What good focus looks like
- High contrast against adjacent colors.
- Visible on light and dark backgrounds.
- Not dependent on color alone if other cues are weak.
- Thick enough or clear enough to spot quickly.
- Present for all interactive controls, including custom ones.
What bad focus looks like
- Outline removed with no replacement.
- One-pixel low-contrast ring on busy images.
- Focus style only on some components in the design system.
- Focus indicator clipped by
overflow: hidden. - Focus visible only in one theme mode.
QA method
As you tab, deliberately look away for a moment and then find focus again. If you need several seconds or a mouse hover to discover where you are, the indicator is too weak.
Pair visual checks with color contrast testing when indicators fail on certain backgrounds.
Skip Links and Bypass Mechanisms
Skip links help keyboard users avoid repeating large navigation blocks on every page. They are especially important on content sites and apps with heavy global chrome.
How to test skip links
- Load the page fresh.
- Press Tab until the skip control becomes focused.
- Confirm it is visible when focused, even if visually hidden before focus.
- Activate it with Enter.
- Confirm focus moves into main content.
- Press Tab again and confirm you are continuing from main content, not back at the logo only.
Failure modes
- Skip link never receives focus.
- Skip link focuses but remains invisible, so sighted keyboard users cannot tell what happened.
- Target anchor does not receive focus because it is not focusable.
- Target points to the wrong container.
- Multiple skip options exist but none land usefully.
Bypass can also include well-structured landmarks and headings for assistive technology users. Keyboard-only sighted users still need an operable skip path when navigation is long.
Modal Focus Traps and Dialog Behavior
Modals are the highest risk keyboard pattern in many products.
Expected modal keyboard behavior
When a dialog opens:
- Focus moves into the dialog, usually the title, close button, or first meaningful control.
- Background content is not in the tab order.
- Tab and Shift+Tab cycle within the dialog.
- Escape closes the dialog if that is the product pattern, unless a destructive confirmation requires a different rule.
- On close, focus returns to the control that opened the dialog, or another logical place if that control is gone.
How to test focus traps in modals
- Open the modal with the keyboard.
- Tab through all focusable controls multiple times forward and backward.
- Confirm you never land on the page behind.
- Try Escape.
- Close with the explicit close button.
- Confirm focus restoration.
- Repeat with validation errors open inside the modal.
- Repeat with nested popovers if the product has them.
Intentional vs accidental traps
An intentional focus trap in a modal is often correct. An accidental trap in a non-modal panel, onboarding tour, or broken menu is a defect. Also defect any trap with no keyboard exit.
Drawers and non-modal side panels need careful product decisions. If background interaction remains allowed, focus should not pretend the rest of the page is gone. If the drawer is modal, it should behave like a dialog.
Tab Order Testing Checklist
Use this checklist on every critical template:
Global page
- First tab stops are sensible.
- Skip link works and is visible on focus.
- Logo, primary nav, search, and account menus are reachable.
- Main content is reachable without endless chrome loops.
- Footer is reachable after main content, not randomly in the middle.
Forms
- Fields follow visual order.
- Labels do not break tab flow oddly.
- Inline actions near fields are reachable in context.
- Submit and secondary actions appear at a logical time.
- Error recovery remains keyboard operable.
- Date pickers and custom selects are fully operable.
Navigation widgets
- Desktop nav menus open and close with keys.
- Mobile menu button is operable and traps or releases focus correctly.
- Active nav state is exposed when relevant.
- Breadcrumbs are reachable and ordered.
Data UIs
- Table row actions are reachable without a mouse hover dependency.
- Sort controls work with keyboard.
- Pagination is reachable.
- Bulk action bars do not steal focus chaotically.
- Sticky action columns remain usable without hiding focus.
Overlays
- Modal focus trap behaves correctly.
- Popovers and menus dismiss with Escape.
- Tooltips do not block keyboard operation.
- Toast messages do not permanently steal tab order.
Keyboard Only Navigation Test Cases
Here are reusable cases you can copy into your test management tool.
TC-A11Y-KBD-001
Title: Complete login using keyboard only
Preconditions: User is logged out; account exists
Steps:
1. Load /login.
2. Use Tab to reach email, type credentials fields, reach Sign in.
3. Activate Sign in with Enter or Space as appropriate.
Expected:
- All controls reachable in logical order.
- Focus indicators visible throughout.
- User lands on authenticated home with focus in a sensible place.
TC-A11Y-KBD-002
Title: Settings modal focus trap and restore
Steps:
1. From settings page, Tab to Edit profile and activate it.
2. Confirm focus is inside the dialog.
3. Tab forward until focus cycles within dialog controls only.
4. Press Escape.
Expected:
- Background page not focused while open.
- Dialog closes.
- Focus returns to Edit profile.
TC-A11Y-KBD-003
Title: Skip link bypasses global navigation
Steps:
1. Load a content-heavy page.
2. Press Tab to focus Skip to main content.
3. Activate the skip link.
4. Press Tab once more.
Expected:
- Focus moves into main content region.
- Next tab stop is inside main content, not the first nav item again.
TC-A11Y-KBD-004
Title: Custom dropdown operable with keys
Steps:
1. Focus the dropdown trigger.
2. Open with Enter or Space.
3. Move options with arrow keys.
4. Select with Enter.
5. Dismiss with Escape without selection in a second run.
Expected:
- Expanded and collapsed states are clear.
- Selection updates the trigger value.
- Escape restores a usable closed state without keyboard trap.
TC-A11Y-KBD-005
Title: Validation errors remain keyboard operable
Steps:
1. Submit an empty required form using keyboard.
2. Observe focus management and error display.
3. Tab to the first invalid field and correct it.
4. Continue until submit succeeds.
Expected:
- Errors are reachable and understandable.
- User can fix fields without mouse.
- Focus is not lost after validation render.
Design System Patterns That Break Keyboards
Watch for these implementation patterns:
divorspanclick handlers withouttabindex, role, and key support.tabindex="0"on large containers that create awkward stops.- Positive
tabindexvalues that reorder focus in surprising ways. - Hover-only actions in tables and cards.
- Focus outlines disabled globally in CSS resets.
- Animations that move focused elements out from under the user.
- Infinite scroll regions with no keyboard path to actions.
- Third-party embeds that swallow keys and never return focus.
Prefer native elements: button, a, input, select, textarea, and dialog patterns with tested behavior.
Automation Support for Keyboard Navigation
You can automate useful regression checks:
- Critical journey completion with only keyboard events.
- Modal open moves focus into dialog.
- Escape closes dialog.
- Skip link target becomes focused.
- No element with
tabindexgreater than zero in your app code (lint rule).
Example Playwright sketch:
test("settings dialog keyboard trap", async ({ page }) => {
await page.goto("/app/settings");
await page.getByRole("button", { name: "Edit profile" }).focus();
await page.keyboard.press("Enter");
const dialog = page.getByRole("dialog");
await expect(dialog).toBeVisible();
await expect(dialog).toBeFocused(); // or expect focus inside dialog
await page.keyboard.press("Escape");
await expect(dialog).toBeHidden();
await expect(page.getByRole("button", { name: "Edit profile" })).toBeFocused();
});
Automation cannot fully judge whether a long page order "feels" logical. Keep human keyboard passes for templates and redesigns. Combine with screen reader testing when announcement and focus together determine success.
For a fuller human audit flow beyond focus order, pair this with manual accessibility testing.
Severity Guidance
| Severity | Example |
|---|---|
| Blocker | Cannot complete purchase because payment button never focused |
| High | Modal opens and focus stays on background page |
| High | Focus indicator removed on primary theme |
| Medium | Order slightly odd but task still completable |
| Low | Minor extra tab stop on decorative control with no strong impact |
If a keyboard user needs a mouse to finish a core journey, that is a release blocker.
Common Mistakes
1. Testing only with Tab on composite widgets
Menus, tabs, and listboxes often need arrows. Tab-only testing creates false failures and false passes.
2. Calling a page accessible because "I could eventually get there"
Twenty-five useless tab stops before the main action can still be a serious barrier. Measure efficiency, not only eventual reachability.
3. Ignoring Shift+Tab
Backward navigation reveals traps and broken cycles that forward Tab misses.
4. Checking focus visibility only on white backgrounds
Indicators fail on images, dark themes, colored banners, and busy dashboards.
5. Forgetting dynamic states
Validation, lazy-loaded sections, and route transitions recreate the focus world. Test after those changes.
6. Accepting hover-only actions
If a row action appears only on hover and is not keyboard reachable, it is broken for keyboard users.
7. No focus restore strategy after dialogs
Losing place after close forces users to restart long pages.
8. Relying only on automated scanners
Keep the manual craft. Use the broader WCAG accessibility testing checklist so keyboard work sits inside a full process.
Team Rituals That Prevent Keyboard Regressions
- Add keyboard acceptance criteria to tickets for interactive UI.
- Require design-system components to document key behavior.
- Run a 15-minute keyboard smoke on release candidates for top journeys.
- File pattern-level bugs when multiple screens share one broken component.
- Ban global
outline: nonewithout an approved replacement.
If your team trains with competitive QA scenarios, practice keyboard-only runs in QABattle battles to build speed and discipline before production releases.
Worked Example: Checkout Keyboard Pass
Journey goal: buy a plan using keyboard only.
- Land on pricing, Tab to plan CTA, activate.
- Confirm focus lands in checkout form, not the footer.
- Complete fields in visual order.
- Open coupon popover, apply code, Escape or close cleanly.
- Open billing country select, operate with keys.
- Submit empty required fields once to check error recovery.
- Fix errors and submit.
- Confirm success page focus and next actions are reachable.
Defect examples you might find:
- Plan CTA is a non-focusable card.
- Coupon popover leaves focus on the page behind.
- Country list opens but arrows do nothing.
- Submit button is skipped because a hidden bot field is focusable.
- Success primary action has no focus styles on the dark success banner.
Each of those is a concrete product bug with clear reproduction steps.
Keyboard Navigation Testing Checklist for Releases
- Top journeys completable keyboard-only.
- Logical focus order verified on changed templates.
- Visible focus indicators confirmed on light and dark surfaces.
- Skip links validated on content and app shells.
- Modals and drawers tested for trap, escape, and restore.
- Custom widgets tested with Tab and arrow patterns.
- No hover-only essential actions.
- Validation and async states rechecked.
- Critical keyboard regressions automated where stable.
- Residual risks documented.
Final Takeaways
Keyboard navigation testing is one of the highest yield accessibility skills a QA engineer can build. It requires no expensive lab on day one: a keyboard, a journey list, and careful observation of reachability, order, operability, visibility, and recovery. Master tab order, focus indicators, skip links, and modal behavior, then expand into composite widgets and automation.
For a full accessibility process around this skill, continue with the accessibility testing checklist and screen reader testing. When you are ready for hands-on practice, sign up for QABattle and train keyboard-only discipline on realistic UI challenges.
FAQ
Questions testers ask
How do you test keyboard accessibility?
Unplug from mouse-first habits and complete real journeys using only the keyboard. Tab and Shift+Tab through controls, use Enter and Space to activate, Escape to dismiss, and arrow keys where composite widgets require them. Confirm every interactive control is reachable, operable, and has a visible focus indicator.
What is a logical focus order?
Logical focus order means keyboard focus moves in a sequence that matches the visual layout and user expectations, usually left to right and top to bottom in left-to-right languages. Focus should not jump randomly, skip important controls, or move into hidden off-screen elements while appearing to leave the main task flow.
How do you test skip links and focus traps in modals?
For skip links, load the page, press Tab until the skip control appears, activate it, and confirm focus lands in main content. For modals, open the dialog, confirm focus moves inside, Tab cycles only within the dialog, Escape closes when expected, and focus returns to a sensible trigger after close.
What is a visible focus indicator?
A visible focus indicator is the clear visual mark that shows which element currently has keyboard focus. WCAG 2.4.7 Focus Visible requires a keyboard focus indicator that users can see. Custom styles are fine if contrast and clarity remain strong across themes and backgrounds.
Which keys should QA exercise beyond Tab?
At minimum: Tab, Shift+Tab, Enter, Space, Escape, and arrow keys for menus, tabs, listboxes, radio groups, and grids. Some widgets also use Home, End, Page Up, and Page Down. Match keys to the control pattern instead of forcing Tab-only interaction everywhere.
Can automation replace manual keyboard testing?
Automation can verify that critical paths are reachable and that some focus moves happen after actions, but it is weaker at judging whether order feels logical or whether focus indicators are actually visible in context. Use automation for regression and humans for judgment-heavy passes.
RELATED GUIDES
Continue the route
Accessibility Testing Checklist (WCAG 2.2)
Use this WCAG accessibility testing checklist for WCAG 2.2 AA: audit process, A vs AA vs AAA, functional test cases, and a practical QA starting path.
Screen Reader Testing: NVDA, VoiceOver, JAWS
Learn screen reader testing with NVDA, VoiceOver, and JAWS: practical checklists, ARIA announcements, live regions, and QA workflows that catch real barriers.
Automated Accessibility Testing with axe-core
Learn automated accessibility testing with axe-core: CI integration, Playwright scans, what automation catches, and limits you still must test by hand.
Color Contrast and Visual Accessibility Testing
Learn color contrast testing for WCAG: ratio rules, text and UI checks, non-text contrast, tools for designers and QA, and mistakes that hide real risk.