( Robust / WCAG 4.1.2 )
Frame title is not unique
What is this issue?
More than one <iframe> or <frame> element on a single page has an identical title attribute value, compared case-insensitively after trimming whitespace. Each frame does have an accessible name (this isn’t the missing-title condition), but the names collide, so two conceptually different embedded documents announce the same way.
This commonly happens when a page repeats a component (a set of product widgets, a row of social embeds, several chat or booking iframes) built from a shared template that hardcodes a single generic title string instead of generating one specific to each instance.
Why does this matter?
Screen readers let users jump directly between frames using a dedicated navigation feature: a list of frames by title, similar to how a heading list lets users jump between sections. That feature depends entirely on each frame’s title being distinguishable; if three frames all announce as “Widget,” the list shows three identical entries with no way to tell from the list alone which is which.
The user is forced to open each one individually and inspect its content just to figure out which is the one they actually want, defeating the entire point of a quick-navigation feature. For a page with several embedded widgets (comparison tools, calculators, maps for different locations), that turns a two-second jump into a lengthy process of trial and error.
Who is affected?
- Screen reader users: see identical entries in the frame navigation list and can’t identify which frame is which without opening each one and listening to its content, defeating the purpose of jumping directly to a specific frame.
What users experience
Marcus uses NVDA on Windows to compare shipping costs across a retail comparison site, which embeds each retailer’s live shipping-calculator widget in its own <iframe>, every one titled simply “Widget.” He opens NVDA’s Elements List filtered to frames, expecting to jump straight to the retailer he’s interested in, and sees five entries that all read “Widget” with no way to distinguish them. He has to close the list, tab through the page linearly instead, and enter each frame one at a time until he stumbles onto the right one: the exact multi-step process the frame list exists to let him skip.
How do I fix it?
Make each frame’s title specific to what it individually contains, so no two frames on the page share the same value. This works because it restores the one-to-one relationship between a frame’s title and its actual content that the frame navigation feature depends on: a distinct title lets a user identify the right frame from the list alone, without opening it first.
When frames are generated from a shared template or component, derive the title dynamically from data specific to that instance (a retailer’s name, a location, a product SKU) rather than hardcoding one literal string that every rendered copy inherits identically.
Code Examples
<iframe src="/chat-widget" title="Widget"></iframe>
<iframe src="/map-widget" title="Widget"></iframe><iframe src="/chat-widget" title="Live chat support"></iframe>
<iframe src="/map-widget" title="Store location map"></iframe>Both frames go from sharing one generic, unhelpful title to each having a title that describes its actual purpose: “Live chat support” versus “Store location map” tells a screen reader user which one to pick without needing to open either.
Common Mistakes
Mistake: “As long as every frame has some title, this rule doesn’t apply.” This rule is specifically about duplicate titles, not missing ones; frame-title covers the missing case separately. A page where every frame has a non-empty title can still fail this rule if two or more of those titles are identical to each other.
Mistake: “Appending a number to a generic title, like ‘Widget 1’ and ‘Widget 2’, is a real fix.” Numbering satisfies the technical uniqueness requirement but leaves the underlying problem mostly unsolved: a user picking between “Widget 1” and “Widget 2” still has no idea what either one actually does. Prefer a title describing the frame’s actual content whenever the frames genuinely differ in purpose.
Mistake: “This is a minor issue since the frames are still individually accessible once you’re inside them.” The whole value of a screen reader’s frame list is choosing the right frame before entering it. Once a user is forced to enter every frame just to identify it, the navigation shortcut this feature exists to provide has already failed, regardless of how accessible each frame’s internal content turns out to be.
How RedFlag Detects This
Automated: axe-core rule, runs on every scan. RedFlag calls axe-core’s frame-title-unique rule as part of every scan, restricted to the WCAG 2.0/2.1/2.2 A and AA rule set. The rule collects the accessible name of every <iframe> and <frame> element on the page, compares them case-insensitively after trimming whitespace, and flags any frame whose name matches another frame’s name exactly.
False negative: the rule only catches an exact match after trimming and case-normalizing: two titles that are nearly identical but differ by a single word or character (“Widget A” versus “Widget a-1”) pass this check even though they may still be confusingly similar in practice. False positive: none typical for this check, since comparing normalized name strings for an exact match is a binary condition axe-core evaluates reliably. Manual step: for any frames with genuinely distinct titles, confirm those titles are different enough in meaning, not just in exact character sequence, that a user could reliably tell them apart from a list.
Manual Testing
- Open the page in Chrome or Firefox with NVDA or VoiceOver running.
- Open the screen reader’s frame or object list (NVDA: Insert+F7, filtered to Frames; VoiceOver: the Rotor).
- Read through every frame title listed and check whether any two entries are identical or near-identical.
- If two or more frames share the same title, or titles that are different only in trivial ways that don’t actually help distinguish their content, the check fails.
Related WCAG Success Criteria
4.1.2 Name, Role, Value: Every interface component must expose a name, role, and current value to assistive technology, and that name should be meaningful enough to serve its purpose. Two frames sharing an identical name both technically have a name, but the shared value fails to serve 4.1.2’s underlying purpose of letting assistive technology distinguish between components.
Related Issues
iframe has no accessible title covers the earlier-stage failure this rule builds on: no title at all, rather than a title duplicated across two or more frames.
Frame with focusable content has no accessible name shares the same iframe-naming mechanism, focused on the keyboard-navigation consequence of an unnamed frame rather than the frame-list navigation consequence this rule covers.
Links with the same accessible name go to different places is the closest parallel outside iframes: the same underlying problem, indistinguishable names for genuinely different destinations, applied to links instead of embedded frames.
References
- W3C Understanding 4.1.2: Name, Role, Value
- W3C Technique H64: Using the title attribute of the frame and iframe elements
- MDN: iframe title
Frequently asked questions
How similar can two frame titles be before they count as duplicates?
axe-core's check compares trimmed title text case-insensitively for an exact match. Two titles that are genuinely different strings, even if similar in meaning, do not trigger this rule; only an identical value repeated on more than one frame does.
Do frame-title and frame-title-unique ever both fire on the same iframe?
No. frame-title only fires when a frame has no accessible name at all; frame-title-unique only evaluates frames that already have one. A given iframe can fail at most one of the two checks, since having no name and having a duplicated name are mutually exclusive states.
Does numbering generic titles, like "Widget 1" and "Widget 2", fix this properly?
It satisfies the uniqueness requirement technically, but it is a weak fix compared to describing what each frame actually contains. "Widget 1" and "Widget 2" are distinguishable from each other but still tell a screen reader user nothing about what either widget does; prefer content-specific titles whenever the frames genuinely differ in purpose.
What if a page legitimately embeds the same content twice, like two identical ad units?
Append distinguishing context to each title rather than leaving them identical, such as "Advertisement, top of article" and "Advertisement, end of article." Even genuinely identical content benefits from a title that tells the user where they are on the page.