Missing form labels
forms/label-missing
- WCAG success criterion
- 3.3.2 (level A)
- Outcome class
- Automatic. An automated check that can report a confirmed violation.
- Area
- Accessibility, Forms & Interaction
- Default severity
- high
- axe-core rule
label
Why we flag this
Users do not know what input is expected.
Missing <label> elements.
What the rule checks
Scope. Rendered input (except hidden, submit, button, reset, image), select and textarea elements.
Expectation. Fails when the field has no programmatic label at all: no label[for], no wrapping <label>, no aria-label, no aria-labelledby, no title, no placeholder. A title or placeholder names the field (HTML-AAM), so such a field is not this violation but a review under forms/title-only-label or forms/placeholder-as-label. Fields that are not rendered (display:none, hidden, visibility:hidden) are presented to nobody and are not judged; a visually hidden field that stays in the accessibility tree is. Fields in open shadow roots, same-origin frames, inserted after load or shown in one viewport only are judged like any other. ARIA widgets (role=textbox) are not this rule's elements; their missing name is names/required-missing.
Source. WCAG 2.2 SC 1.3.1, 3.3.2, 4.1.2; HTML-AAM accessible name computation for input, select, textarea
Detection: shared; needs dom.
Failing example
The check reports a violation here. Corpus case missing_label. The page may contain further findings for other rules.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Missing label corpus case</title>
<meta name="viewport" content="width=device-width, initial-scale=1"><style>
/* #783: page shell, so the case only reports what it is about */
.skip, nav a { display: inline-block; padding: 12px; min-height: 44px; min-width: 44px; box-sizing: border-box; }
button, input, select, textarea { min-height: 44px; min-width: 44px; box-sizing: border-box; }
input[type="checkbox"], input[type="radio"] { width: 44px; height: 44px; }
</style>
</head>
<body>
<a class="skip" href="#main">Skip to main content</a>
<header><p>Example Shop</p><nav aria-label="Main"><a href="/" aria-current="page">Home</a> <a href="/help">Help</a></nav></header>
<main id="main">
<h1>Form with an unlabeled input</h1>
<form>
<input type="text" name="email">
<button type="submit">Send</button>
</form>
</main>
<footer><p>Example Shop, 2026</p></footer>
</body>
</html>Passing example
The check passes here and reports nothing. Corpus case form_heuristics_clean. The page may contain further findings for other rules.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Form heuristics: true negatives (#643)</title>
<meta name="viewport" content="width=device-width, initial-scale=1"><style>
/* #783: page shell, so the case only reports what it is about */
.skip, nav a { display: inline-block; padding: 12px; min-height: 44px; min-width: 44px; box-sizing: border-box; }
button, input, select, textarea { min-height: 44px; min-width: 44px; box-sizing: border-box; }
input[type="checkbox"], input[type="radio"] { width: 44px; height: 44px; }
</style>
</head>
<body>
<a class="skip" href="#main">Skip to main content</a>
<header><p>Example Shop</p><nav aria-label="Main"><a href="/" aria-current="page">Home</a> <a href="/help">Help</a></nav></header>
<main id="main">
<h1>Booking form</h1>
<form>
<!-- Mode switch: radios correctly grouped -->
<fieldset>
<legend>Mode</legend>
<label><input type="radio" name="mode" value="broken" checked> Broken</label>
<label><input type="radio" name="mode" value="fixed"> Fixed</label>
</fieldset>
<!-- Date field with instructions via aria-describedby: the
description counts as the format instruction -->
<label for="booking-date">Date</label>
<input type="text" id="booking-date" name="date" inputmode="numeric" aria-describedby="booking-date-hint">
<p id="booking-date-hint">Day of travel</p>
<!-- "passiert" contains "pass" but is no passport field -->
<label for="report-what">Was ist passiert?</label>
<textarea id="report-what" name="what" rows="4" aria-describedby="report-what-hint"></textarea>
<span id="report-what-hint">Was Sie erwartet haben und was stattdessen passiert ist</span>
<!-- A single checkbox, and a second one with a different name:
neither is a group -->
<label><input type="checkbox" class="bill-sr"> Screen reader view</label>
<label><input type="checkbox" name="newsletter"> Send me the newsletter</label>
<button type="submit">Search</button>
</form>
</main>
<footer><p>Example Shop, 2026</p></footer>
</body>
</html>This page is generated from the rule catalogue and the rule contracts; see therule overview for how the outcome classes are derived.