Scope
- Site assessed
- Example Shop Ltd (fictional)
- Scope
- Journey audit — product page, cart, checkout, account
- Standard
- WCAG 2.2 Level AA
- Method
- Automated analysis plus manual keyboard and VoiceOver testing
- Date of assessment
- 22 September 2026
- Reviewer
- Sergio Gualda
Summary
55/100
7 findings
This score is an internal Uxerfy assessment indicator based on the checks included in this review. It is not a legal certification or a statement of WCAG conformance.
All findings
-
01 of 07 · /checkout/ — card and address fields
Payment form errors are not announced
Found by: Manual
- Problem
- Submitting the form with an invalid field inserts the message into the DOM beside the field and renders it in red. It is not associated with the input via aria-describedby, the field does not receive aria-invalid, there is no live region, and focus remains on the submit button.
- Who it affects
- A screen reader user presses "Pay" and receives no signal at all. The experience is that the button does not work. In testing, the payment could not be completed.
- Recommended fix
- Associate each message with its field using aria-describedby; mark the field aria-invalid="true"; on submit, move focus to the first field in error, or render an error summary at the top of the form with links to each field.
- Acceptance criteria
- With a screen reader running, submitting the form with an invalid field announces the error and lets you reach the affected field without looking for it.
-
02 of 07 · /product/ — variant selector
The size selector cannot be reached by keyboard
Found by: Manual
- Problem
- Sizes are built from <div> elements carrying a click handler. They are not focusable, do not respond to Enter or Space, and expose no role or selected state.
- Who it affects
- Without a mouse there is no way to choose a size, and without a size there is no way to add to cart. The purchase journey ends at the product page.
- Recommended fix
- Replace with a native radio group (<fieldset> with <legend> and <input type="radio">), or buttons with role="radio" and full keyboard handling. The native version brings focus, activation, role and state with no code.
- Acceptance criteria
- Using the keyboard alone, the size group can be reached, moved through with the arrow keys, a size selected, and the product added to the cart.
-
03 of 07 · Site-wide — tabbing down any long page
Focus is hidden behind the sticky header
Found by: Manual
- Problem
- The header is position: sticky at 72px tall. Tabbing downwards scrolls the focused element to the top edge of the viewport, where the header covers it entirely.
- Who it affects
- Keyboard users intermittently lose sight of the focused element and have to tab backwards to re-orient.
- Recommended fix
- Add scroll-margin-top: 88px to focusable elements, or scroll-padding-top on the scroll container.
- Acceptance criteria
- Tabbing down a long page leaves the focused element fully visible at every step.
-
04 of 07 · /product/ — gallery (6 images)
Product images carry no useful alternative text
Found by: Automated
- Problem
- Four of the six images use the SKU as alternative text ("SKU-4471-BLK"). Two of them carry information that appears nowhere else: the size chart and the materials list.
- Who it affects
- Information needed to make the purchase decision is available only to people who can see the images.
- Recommended fix
- Write alternative text describing what each image contributes in context. For the size chart and materials list, reproduce the content as real text on the page — a picture of a table should not be the only source of that data.
- Acceptance criteria
- With images disabled, the page still communicates the available sizes and the product composition.
-
05 of 07 · /product/ — colour selector
Colour variants are distinguished by colour alone
Found by: Manual
- Problem
- The swatches are coloured circles with no visible name and no alternative text. The selected state is indicated only by a darker border.
- Who it affects
- Anyone who cannot distinguish the colours cannot tell what they are choosing or what they have chosen.
- Recommended fix
- Add the colour name as visible text beside the swatch or as an accessible label, and mark the selected state with more than colour: a tick, a ring with sufficient contrast, or text.
- Acceptance criteria
- In greyscale, each available colour can be identified and the selected one can be told apart.
-
06 of 07 · Site-wide — struck-through prices, delivery notes, footer
Secondary text does not meet minimum contrast
Found by: Automated
- Problem
- The grey #9a9a9a on white gives a ratio of 2.85:1. The minimum for normal-size text is 4.5:1. It affects 14 instances across 5 templates.
- Who it affects
- People with low vision, and anyone with glare on their screen. It includes the "Free delivery over £50" line, which is commercially relevant information.
- Recommended fix
- Darken the grey to at least #767676 on white (4.54:1). Fix the secondary colour token in the design system rather than each instance.
- Acceptance criteria
- All normal-size text meets 4.5:1 against its actual background, measured on the computed colours.
-
07 of 07 · /account/orders/ — invoice column
Invoice download links do not say what they download
Found by: Automated
- Problem
- Each row contains a link reading "Download". Listed out of context, that is twelve identical entries.
- Who it affects
- Anyone navigating by links list cannot tell one invoice from another.
- Recommended fix
- Include the order number in the link text, or add the context with visually hidden text: "Download invoice for order 4471".
- Acceptance criteria
- The links list for the page contains twelve entries that can be told apart.
What to do next
- 01Fix the two critical findings. Both stop a purchase completing, and neither needs anything redesigned.
- 02Fix the contrast at the design system token, not instance by instance — that closes all 14 occurrences at once.
- 03Re-test the checkout by keyboard and with a screen reader before treating anything as closed.
- 04Order a re-test to record what was resolved, and on what date.