Table of Contents
- ACT 1: EXPOSITION
-
ACT 2: CONFRONTATION
-
Features Overview
- 1. Show, Don't Just Tell (Visual Highlighting)
- 2. The Separation of Concerns: Violations vs. Informative
- 3. Strict WCAG Criteria Filtering
- 4. Immediate Context & Interactive Panels
- 5. Precision Element Locators
- 6. Intuitive, Organized UI & Built-In Documentation
- 7. Built for the Modern Web (Shadow DOM & Iframes)
- 8. Zero-Friction Ticketing (One-Click Reporting)
- Audit Library and Ruleset
- Limitations and Technical Bounds
-
Features Overview
- ACT 3: RESOLUTION
ACT 1: EXPOSITION
Let's be brutally honest. For many teams, accessibility testing feels like eating vegetables. We know it matters. We want to do the right thing. But it almost always gets pushed to the very end of the meal (or sprint, either way). It becomes a chore, an afterthought, or worse, a massive QA bottleneck right before release.
Why? The feedback loop is broken.
Developers write code, push it, and maybe later a CI pipeline throws an error. Or a QA engineer logs a ticket with a vague description like, "Screen reader does not read this button." Then begins the tedious dance of inspecting the DOM, hunting for the exact element, and trying to remember the specific WCAG rule that was violated. The friction is incredibly high.
A while back, I introduced a Cypress plugin called wick-a11y, read the release article here. Think of it as your John Wick style ally for smashing accessibility barriers inside your E2E tests. It is great for guarding your pipeline. But what about before you even push your code? What if you could see accessibility issues as clearly as a glaring UI bug while you are actively developing?
Enter WICK-AG-Lens: Accessibility Inspector extension.
It is a brand new free and open-source Chrome browser extension designed to eliminate the friction between writing code and testing for accessibility. No more digging through console logs. No more guessing. Just immediate visual feedback directly within your page layout.
ACT 2: CONFRONTATION
Building an accessibility inspector is not just about throwing rules at a page. It is about how that information is presented to developers, QA testers, and accessibility professionals so they can actually use it. WICK-AG-Lens was engineered around a few core philosophies to drastically reduce your cognitive load.
Features Overview
1. Show, Don't Just Tell (Visual Highlighting)
Context is everything. Instead of printing a sterile list of errors in a DevTools console, WICK-AG-Lens draws highly visible bounding boxes and color-coded badges directly over the target elements on your page. Seeing a <button> without a label visually highlighted right where it sits in the layout immediately tells you how to fix it. Reading a console error requires mental translation.
2. The Separation of Concerns: Violations vs. Informative
A major source of fatigue in accessibility tooling is noise. To combat this, I divided the 40 independent audits into two distinct tabs: actionable violations and structural information checks.
Automated tools cannot understand intent. A script can easily verify that a focus path exists and check the order of tabindex attributes. But it takes a human to look at that highlighted path on the screen and realize the focus jumps wildly from the header, down to the footer, and back up to the main navigation. A machine sees valid code. A human sees a terrible user experience. By separating these tabs, developers can ruthlessly hunt real bugs in the Violations tab, while accessibility professionals and QA can explore the architecture in the Informative tab without the noise.
3. Strict WCAG Criteria Filtering
Not every project targets the same compliance standard. WICK-AG-Lens includes a dynamic filter bar allowing you to specifically toggle target WCAG Versions (2.0, 2.1, 2.2) and Conformance Levels (A, AA, AAA). The UI and execution engine will instantly adapt, hiding irrelevant audits or specific legend criteria (like differing AA vs. AAA contrast thresholds) so you only see exactly what you are testing for.
4. Immediate Context & Interactive Panels
Clicking on any badge on the page opens an interactive panel. This panel tells you exactly what the tool highlighted, why it is important for users with disabilities, and provides the exact CSS selector or logic applied to identify them.
5. Precision Element Locators
There is also a "View Elements" button in the DevTools panel. This opens a modal containing the list of all DOM elements identified by the accessibility audit. From there, you just click the crosshair icon next to an element and the extension instantly scrolls the affected element into view, marking it with a highly visible pulsating ring.
6. Intuitive, Organized UI & Built-In Documentation
The extension is designed for maximum configuration in a simple way. The panel utilizes expandable/collapsible category groups to keep your workspace clean and focused. It is fully keyboard-friendly. Plus, if you ever need a refresher on a rule, a complete documentation modal is embedded directly inside the extension, so no need to leave the browser or search a wiki to understand the technical bounds.
7. Built for the Modern Web (Shadow DOM & Iframes)
The modern web is a messy place. The scanner utilizes custom deep bottom-up traversal logic to pierce standard open web components to evaluate encapsulated markup. It also fully traverses the internal DOM of same-origin iframes, so you aren't left blind when inspecting complex widgets.
8. Zero-Friction Ticketing (One-Click Reporting)
QA engineers and testers spend half their lives writing bug tickets. WICK-AG-Lens includes a one-click reporting feature that instantly copies formatted text reports of all active audits and their findings directly to your clipboard. You just click the button, paste the clean text into Jira or GitHub, and move on.
Audit Library and Ruleset
WICK-AG-Lens performs 40 independent audits. Here is exactly what it is looking for under the hood:
Tab 1: Violations and Warnings
Keyboard Navigation
- Unfocusable Clickables: Flags generic elements with
onclickhandlers lackingtabindexandrole. Keyboard users cannot tab to or activate these elements.- Severity: Critical
- WCAG Alignment: 2.1.1 Keyboard (2.0 A)
- Badge Output:
"Unfocusable Clickable"
- Disabled Focus Outlines: Parses page CSS via heuristic evaluation to find focusable elements where
outline: noneis applied on focus without a fallback. Sighted keyboard users rely entirely on focus rings.- Severity: Critical
- WCAG Alignment: 2.4.7 Focus Visible (2.0 AA)
- Badge Output:
"Disabled Focus Ring (Heuristic)"
- Tabindex Violations: Flags elements with
tabindex > 0, overriding natural DOM focus order and creating unpredictable navigation paths.- Severity: Serious
- WCAG Alignment: 2.4.3 Focus Order (2.0 A)
- Badge Output:
tabindex="{val}"
- Accesskey Attributes: Flags explicit
accesskeyusage, which often conflicts with native browser or screen reader shortcuts.- Severity: Moderate
- WCAG Alignment: 2.1.4 Character Key Shortcuts (2.1 A)
- Badge Output:
accesskey="{val}"
Images & Media
- Missing Alt Text: Flags
<img>elements completely lacking analtattribute. Screen readers will read the raw filename if missing.- Severity: Critical
- WCAG Alignment: 1.1.1 Non-text Content (2.0 A)
- Badge Output:
"Missing alt"
- Uncaptioned Video: Flags
<video>elements lacking nested<track>elements for captions.- Severity: Critical
- WCAG Alignment: 1.2.2 Captions (Prerecorded) (2.0 A)
- Badge Output:
"<video> (No Captions)"
- Redundant Alt Text: Flags
altattributes containing words like "image" or "photo". Screen readers automatically announce images, making prefixes redundant.- Severity: Minor
- WCAG Alignment: 1.1.1 Non-text Content (2.0 A)
- Badge Output:
Redundant alt: "{text}"
Forms & Controls
- Unlabeled Form Inputs: Flags form controls missing
<label>wrappers,aria-label, orforattributes.- Severity: Critical
- WCAG Alignment: 3.3.2 Labels or Instructions (2.0 A)
- Badge Output:
"Unlabeled Input"
- Empty Buttons: Flags buttons with no text, aria-label, or child image alt. Screen readers will only announce 'Button'.
- Severity: Critical
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
"Empty Button"
- Placeholder as Label: Flags inputs relying solely on placeholders for their accessible name.
- Severity: Serious
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
"Placeholder as Label"
Links & Navigation
- Empty Links: Flags
<a>tags lacking readable text or accessible names.- Severity: Critical
- WCAG Alignment: 2.4.4 Link Purpose (In Context) (2.0 A)
- Badge Output:
"Empty Link"
- Suspicious Link Targets: Flags anchor tags acting as buttons (
href="#"orjavascript:) without a button role, which breaks spacebar operability.- Severity: Critical / Serious
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A), 2.1.1 Keyboard (2.0 A)
- Badge Output:
"Fake Button (JS)"or"Fake Button (#)"
- Generic Link Text: Flags ambiguous link text like "Click Here" or "Read More" using exact word boundaries.
- Severity: Moderate
- WCAG Alignment: 2.4.4 Link Purpose (In Context) (2.0 A)
- Badge Output:
Generic link: "{text}"
- Unwarned New Window Links: Flags
target="_blank"links lacking text or ARIA warnings, which unexpectedly disorients users.- Severity: Moderate
- WCAG Alignment: 3.2.5 Change on Request (2.0 AAA)
- Badge Output:
'target="_blank" (No Warning)'
ARIA & Semantics
- Focusable in Aria-Hidden: Flags elements that receive keyboard focus but are hidden from Assistive Technologies via
aria-hidden="true"on the element or an ancestor, creating a "ghost focus" trap.- Severity: Critical
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
"aria-hidden (Focusable)"
- Invalid ARIA State: Flags elements marked with
aria-invalid="true"indicating validation errors.- Severity: Serious
- WCAG Alignment: 3.3.1 Error Identification (2.0 A)
- Badge Output:
'aria-invalid="true"'
- Prohibited Author Names: Flags
presentationornoneroles that improperly contain aria labels, breaking semantics.- Severity: Serious
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
Prohibited name on role="{role}"
Structure and Document
- Auto-playing Media: Flags audio/video with
autoplayenabled, which conflicts with screen reader announcements.- Severity: Serious
- WCAG Alignment: 1.4.2 Audio Control (2.0 A)
- Badge Output:
"Autoplay Media"
- Heading Hierarchy Errors: Flags skipped sequential levels or fake structural classes to maintain logical document outlines.
- Severity: Moderate
- WCAG Alignment: 1.3.1 Info and Relationships (2.0 A)
- Badge Output:
"{TAG} (Skipped)"or"Fake Heading"
Visual & Contrast
- Text Color Contrast: Calculates the effective contrast ratio between visible text and its backing container, dynamically factoring in font-size and weight for large-text thresholds.
- Severity: Critical
- WCAG Alignment: 1.4.3 Contrast (Minimum) (2.0 AA), 1.4.6 Contrast (Enhanced) (2.0 AAA)
- Badge Output:
AA Fail ({ratio}:1),AAA Fail ({ratio}:1), orManual Check (Bg)
Tab 2: Informative and Structure
Keyboard Navigation
- Tabindex (Comparison): Highlights all tabindex usages simultaneously to provide a visual map of the programmatic focus strategy.
- WCAG Alignment: 2.4.3 Focus Order (2.0 A)
- Badge Output:
tabindex="{val}"
- Display Focus Order: Traces and numbers the natural sequential path of focusable elements, dynamically flagging elements hidden from AT.
- WCAG Alignment: 2.4.3 Focus Order (2.0 A)
- Badge Output:
#{counter}: <{tag}>or#{counter}: <{tag}> (Hidden from AT)
Images & Media
- Display Image Alternatives: Extracts and visually prints the alt text for all
<img>elements.- WCAG Alignment: 1.1.1 Non-text Content (2.0 A)
- Badge Output:
alt="{val}",alt="", or"Missing alt"
- Captioned Video: Highlights video elements that correctly implement
<track>captions.- WCAG Alignment: 1.2.2 Captions (Prerecorded) (2.0 A)
- Badge Output:
"<video> (Captioned)"
- Iframe Context & Titles: Extracts explicitly defined titles from embedded iframes.
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
title="{title}","Hidden Iframe", or"Missing Title"
Forms & Controls
- Form Field Descriptions: Identifies supplemental instructional text linked to inputs via
aria-describedbyortitle.- WCAG Alignment: 3.3.2 Labels or Instructions (2.0 A)
- Badge Output:
"aria-describedby"or"title"
- Fieldsets & Captions: Highlights visual grouping containers and their titles.
- WCAG Alignment: 1.3.1 Info and Relationships (2.0 A)
- Badge Output:
<{tag}>
- Touch Target Sizes: Computes the exact width and height pixel boundaries of interactive elements to catch undersized targets.
- WCAG Alignment: 2.5.8 Target Size (Minimum) (2.2 AA), 2.5.5 Target Size (Enhanced) (2.1 AAA)
- Badge Output:
{width}x{height}px
Links & Navigation
- Warned New Window Links: Highlights
target="_blank"links that correctly include accessible warnings.- WCAG Alignment: 3.2.5 Change on Request (2.0 AAA)
- Badge Output:
'target="_blank" (Warned)'
ARIA & Semantics
- ARIA Roles & Attributes: Maps all elements utilizing an explicit role definition.
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
role="{val}"
- ARIA Live Regions: Maps dynamic
aria-liveinjection containers.- WCAG Alignment: 4.1.3 Status Messages (2.1 AA)
- Badge Output:
aria-live="{val}"
- Required Fields: Maps mandatory inputs enforced via HTML5
requiredoraria-required.- WCAG Alignment: 3.3.1 Error Identification (2.0 A)
- Badge Output:
"required"or'aria-required="true"'
- Aria-Expanded State: Maps expandable widgets, color-coded by true or false state.
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
aria-expanded="{val}"
- Aria-Controls: Highlights elements that dictate the visibility of remote DOM elements.
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
"aria-controls"
- Aria-Owns: Highlights elements establishing parent/child relationships outside the DOM tree.
- WCAG Alignment: 4.1.2 Name, Role, Value (2.0 A)
- Badge Output:
"aria-owns"
Structure & Document
- Valid Heading Order: Maps the standard, sequential H1 to H6 structure.
- WCAG Alignment: 1.3.1 Info and Relationships (2.0 A)
- Badge Output:
<{tag}>
- Landmark Regions: Maps native HTML5 and ARIA structural containers.
- WCAG Alignment: 2.4.1 Bypass Blocks (2.0 A)
- Badge Output:
<{role or tag}>
- Table & Grid Structure: Highlights native tables, captions, headers, and custom div-based grids.
- WCAG Alignment: 1.3.1 Info and Relationships (2.0 A)
- Badge Output:
<{tag}>orrole="{role}"
- Lists and List Items: Maps unordered, ordered, and glossary lists and children.
- WCAG Alignment: 1.3.1 Info and Relationships (2.0 A)
- Badge Output:
<{tag}>
- Language Definitions: Maps the root document language declaration alongside inline phonetic shifts.
- WCAG Alignment: 3.1.1 Language of Page (2.0 A), 3.1.2 Language of Parts (2.0 AA)
- Badge Output:
"Missing Root Lang",Root lang="{val}", orlang="{val}"
Limitations and Technical Bounds
Before you dive in, it is important to understand the technical boundaries of what an automated browser extension can and cannot do:
- Visibility & Occlusion: It strictly ignores hidden elements (
display: none,inert,hidden, etc.) to perfectly match the native accessibility tree, but it cannot calculate 3D visual occlusion (e.g., an element covered by a high z-index modal). - Shadow DOM & Iframes: It successfully pierces open Web Components and same-origin iframes. Closed shadow roots and cross-origin iframes (like embedded third-party videos) remain inaccessible due to strict browser security policies.
- Contrast Heuristics: Contrast is calculated via computed DOM styles. While it dynamically computes thresholds based on font size and weight, elements layered over complex images or CSS gradients are automatically flagged for 'Manual Check'.
- Filter Isolation: WCAG version and conformance filters are strictly isolated. Selecting '2.2' does not automatically include '2.1' or '2.0'. You must explicitly check all versions and levels you wish to evaluate for your current analysis.
ACT 3: RESOLUTION
Accessibility is not just a checkbox to tick off before a release. It is about making the web work for everyone. But that doesn't mean the process of building accessible software has to be painful.
With wick-a11y guarding your Cypress pipelines and WICK-AG-Lens riding shotgun in your browser, you have a pretty solid duo to keep the noise down and the quality up. The goal is to catch these barriers early, fix them fast, and get back to building cool things.
Don't wait around. Install the extension, pull up your favorite notoriously inaccessible website, and watch the badges light up like a hit list. No bloated audits, just sharp, uncompromising accessibility inspection.
Install WICK-AG-Lens from the Chrome Web Store
The entire blueprint is open-source on GitHub at sclavijosuero/wick-ag-lens. If it gets the job done, pay the bounty with a star on the repository. Otherwise, I might be forced to call my friend Johnny to set things straight. 😎
Cheers!
I'd love to hear from you! Please don't forget to follow me, leave a comment, or a reaction if you found this article useful or insightful. ❤️ 🦄 🤯 🙌 🔥
You can also connect with me on my new YouTube channel: https://www.youtube.com/@SebastianClavijoSuero
If you'd like to support my work, consider buying me a coffee, and I get my boost to keep learning and sharing cool stuff with all of you.











Top comments (0)