ऑटोमेटेड एक्सेसिबिलिटी टेस्टिंग

ऑटोमेटेड एक्सेसिबिलिटी टेस्टिंग render हुए पेजों या components पर rules चलाती है और मशीन से जाँचे जा सकने वाली स्थितियाँ रिपोर्ट करती है: बिना alt attribute की image, बिना accessible name का form control, WCAG contrast threshold से नीचे का टेक्स्ट, ग़लत ARIA attribute। यह तेज़ है, दोहराने योग्य है और हर pipeline में होनी चाहिए। पर यह स्वभाव से अधूरी है — W3C का अपना evaluation overview कहता है कि कोई भी टूल अकेले तय नहीं कर सकता कि साइट एक्सेसिबिलिटी मानकों को पूरा करती है, और जानकार मानवीय मूल्यांकन आवश्यक है।

यह गाइड बताती है कि rules और मानवीय निर्णय के बीच रेखा कहाँ है, ACT rules क्या हैं, आम engines कैसे जुड़ते हैं, unit, component, end-to-end और CI स्तर पर checks कैसे चलाएँ, और नतीजों का triage, baseline और रिपोर्ट कैसे करें — बिना हरे scan को conformance मान लेने के।

Automated rules क्या तय कर सकते हैं — और किसके लिए इंसान चाहिए

Rule किसी सवाल को तब तय कर सकता है जब जवाब पूरी तरह DOM, accessibility tree और computed styles में मौजूद हो। अर्थ, गुणवत्ता या अनुभव के सवाल वह तय नहीं कर सकता। कई WCAG success criteria दोनों को मिलाते हैं: टूल देख सकता है कि alt attribute मौजूद है (1.1.1 का हिस्सा), पर यह नहीं कि टेक्स्ट image के समकक्ष है या नहीं। किसी भी प्रकाशित दावे से सावधान रहें कि टूल WCAG का एक तय हिस्सा कवर करते हैं; ज़रूरी यह जानना है कि आपकी कौन-सी checks निर्णायक हैं और कौन-सी सिर्फ़ सवाल उठाती हैं।

  • आम तौर पर तय होने योग्य: missing alt attribute; बिना accessible name का form field या button; <html> पर lang न होना; ग़लत या ग़लत-वर्तनी वाले ARIA roles, states और properties; ज़रूरी ARIA children या parents का न होना; ठोस background पर सादे टेक्स्ट का contrast; viewport meta tag से zoom बंद होना; ख़ाली headings और links।
  • आंशिक रूप से तय होने योग्य (टूल flag करे, इंसान पुष्टि करे): images या gradients पर टेक्स्ट का contrast; image decorative है या नहीं; heading संरचना समझदार है या नहीं; target size जहाँ spacing अपवाद लागू हो सकते हैं; live region सही समय पर announce करता है या नहीं।
  • मानवीय निर्णय चाहिए: alt text और labels की गुणवत्ता; सार्थक focus order और reading order; errors मददगार ढंग से बताई गई हैं या नहीं (3.3.3); static attributes से आगे कस्टम widgets की कीबोर्ड operability; captions और audio description की सटीकता; motion आवश्यक है या नहीं; cognitive load और सरल भाषा; और क्या पूरा काम screen reader से हो सकता है।
Rule सिर्फ़ वही तय करता है जो पूरी तरह DOM, accessibility tree और computed styles में हो; बाक़ी के लिए इंसान चाहिए, इसलिए साफ़ scan का मतलब यह नहीं कि पेज conform करता है।

आम तौर पर तय होने योग्य

जवाब पूरी तरह DOM, accessibility tree और computed styles में है।

Images:
Missing alt attribute
संरचना:
ख़ाली headings और links
नाम और संदेश:
बिना accessible name का form field या button
टूल का आम संकेत:
Failure या pass के रूप में रिपोर्ट (जैसे axe-core में violations, passes)

आंशिक रूप से तय होने योग्य

टूल flag करे, इंसान पुष्टि करे।

Images:
Image decorative है या नहीं
संरचना:
Heading संरचना समझदार है या नहीं
नाम और संदेश:
Live region सही समय पर announce करता है या नहीं
टूल का आम संकेत:
मानवीय review के लिए flag (जैसे axe-core में incomplete): किसी इंसान को भेजें

मानवीय निर्णय चाहिए

अर्थ, गुणवत्ता या अनुभव का सवाल।

Images:
Alt text की गुणवत्ता
संरचना:
सार्थक focus order और reading order
नाम और संदेश:
Errors मददगार ढंग से बताई गई हैं या नहीं (3.3.3)
टूल का आम संकेत:
अक्सर कुछ नहीं: alt="image123" जैसे false negatives rules पास कर जाते हैं

उदाहरण ऊपर हर group की सूची से हैं। बराबर columns WCAG के बराबर हिस्से नहीं हैं; किसी तय हिस्से के दावे से सावधान रहें।

ACT rules: टेस्ट की साझा परिभाषा

दो टूल एक ही पेज के लिए अलग नतीजे दे सकते हैं क्योंकि वे criterion को अलग ढंग से समझते हैं। Accessibility Conformance Testing (ACT) rules इसी को हल करते हैं: हर rule किसी WCAG या ARIA आवश्यकता के हिस्से के लिए सटीक, दस्तावेज़ित टेस्ट प्रक्रिया है, जिसमें applicability, expectations, assumptions और test cases हैं। W3C उन्हें “All ACT Rules” पेज पर सूचीबद्ध करता है; उन्हें ACT Rules Community Group और Accessibility Guidelines Working Group की ACT Task Force विकसित करते हैं, और वे informative हैं — conformance तय करने के लिए आवश्यक नहीं।

Rules proposed या approved चिह्नित होते हैं; approved rule को कम से कम एक टूल ने लागू किया है और संबंधित W3C working group ने review किया है। Implementations हर टूल के लिए सूचीबद्ध होते हैं और automated, semi-automated, manual या linter-आधारित हो सकते हैं। Rule titles के उदाहरण: “Image has non-empty accessible name” और “HTML page has lang attribute”। टेस्टर के लिए ACT rules उपयोगी निर्णायक हैं: जब किसी टूल के नतीजे पर विवाद हो, उसे rule की expectations और test cases से मिलाएँ।

Engines और टूल, तटस्थ विवरण के साथ

ज़्यादातर टूल एक rules engine और उसे चलाने का तरीका हैं। नीचे कौन-सा engine है, यह जानने से समझ आता है कि दो टूल अक्सर सहमत क्यों होते हैं।

  • axe-core — open-source JavaScript एक्सेसिबिलिटी rules engine जो browser context में चलता है। यह violations, passes, incomplete नतीजे (जिन्हें मानवीय review चाहिए) और inapplicable rules लौटाता है, और rules को WCAG स्तर से tag करता है। कई integrations इसे wrap करते हैं।
  • Lighthouse accessibility audit — Google के Lighthouse का हिस्सा; इसकी एक्सेसिबिलिटी checks axe-core पर आधारित हैं और यह weighted score देता है। 100 score का मतलब है audited rules पास हुए, यह नहीं कि पेज conform करता है।
  • Browser devtools accessibility panels — चुने गए element का accessibility tree, computed name, role, states और contrast जानकारी दिखाते हैं। Automated findings के manual सत्यापन के लिए अनिवार्य।
  • pa11y — URLs पर automated एक्सेसिबिलिटी checks चलाने का open-source command-line टूल, जिसे अक्सर CI में script किया जाता है।
  • Test-framework integrations — community और vendor packages Playwright, Cypress, Jest और ऐसे frameworks में एक्सेसिबिलिटी assertions जोड़ते हैं; static linters (जैसे JSX के लिए) कुछ render होने से पहले ही source code में कुछ समस्याएँ पकड़ते हैं।
  • Mobile — Android, TalkBack के साथ manual testing और अपने testing frameworks व Accessibility Scanner app से automated checks का दस्तावेज़ देता है; Apple का XCTest हाल के Xcode versions में accessibility audit समर्थन देता है।
  • चुनाव — W3C की Web Accessibility Evaluation Tools List से टूल guideline, प्रकार और वातावरण के अनुसार फ़िल्टर किए जा सकते हैं; W3C स्पष्ट कहता है कि वह किसी विशेष product का समर्थन नहीं करता।

आज़माएँ: HTML एक्सेसिबिलिटी चेकर

Unit, component, E2E tests और CI में checks चलाना

Checks को उस सबसे निचले स्तर पर रखें जो समस्या देख सके, फिर ऊपर व्यापक scans जोड़ें। Component और unit tests design-system component के हर variant में missing names और ग़लत ARIA पकड़ लेते हैं, पेज बनने से बहुत पहले। ध्यान दें कि jsdom जैसे DOM emulations layout की गणना नहीं करते, और axe-core का documentation बताता है कि उसका color-contrast rule JSDOM में काम नहीं करता, इसलिए contrast और layout rules को असली browser चाहिए। Elements को role और accessible name से query करना (Testing Library दस्तावेज़ की सुझाई प्राथमिकता) अपने आप में हल्की एक्सेसिबिलिटी check है: अगर test बटन को उसके नाम से नहीं ढूँढ पाता, तो screen reader भी नहीं ढूँढेगा।

End-to-end tests असली browsers में चलते हैं और पेजों को उन states में scan कर सकते हैं जो यूज़र देखते हैं — login के बाद, dialog खुला होने पर, validation errors दिखने पर। Playwright दस्तावेज़ इस पैटर्न को axe-आधारित package के साथ बताता है; Cypress के समकक्ष community plugins हैं। CI में हर pull request पर उन पेजों और components के लिए scans चलाएँ जिन्हें बदलाव छूता है, और पूरी साइट पर एक व्यापक scheduled scan।

// Example: Playwright + @axe-core/playwright, scanning a page in an error state
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

test('checkout form with errors has no WCAG A/AA violations', async ({ page }) => {
  await page.goto('/checkout');
  await page.getByRole('button', { name: 'Pay now' }).click(); // trigger validation
  await expect(page.getByRole('alert')).toBeVisible();

  const results = await new AxeBuilder({ page })
    .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
    .exclude('#third-party-chat') // documented exclusion, tracked separately
    .analyze();

  expect(results.violations).toEqual([]);
});

सिर्फ़ URLs नहीं, states को scan करें

Engine वही जाँचता है जो उसके चलने के क्षण render हुआ है। Load पर scan किया गया पेज क्लिक पर खुलने वाले menu, modal, error summary, empty state, dark theme या 320 px layout के बारे में कुछ नहीं बताता। उन states को दिखाने वाले interactions को script करें और हर एक के बाद scan करें। अगर आप दोनों themes देते हैं तो दोनों शामिल करें, कम से कम एक संकरा viewport, और अलग direction वाली हर locale — अरबी right-to-left पेज में उसके अंग्रेज़ी जुड़वाँ से अलग defects हो सकते हैं।

नतीजों का triage: false positives और false negatives

हर finding को तब तक परिकल्पना मानें जब तक devtools या assistive technology से सत्यापित न हो। False positives होते हैं — ग़लत background layer के सामने मापा गया contrast, flag हुआ hidden element, या कोई वैध ARIA pattern जिसे engine model नहीं करता। False negatives कहीं ज़्यादा आम और अदृश्य हैं: “image123” जैसा अर्थहीन alt, ग़लत फ़ील्ड का नाम बताने वाला label, सही roles वाला पर बिना कीबोर्ड समर्थन का कस्टम dropdown — ये सब rules पास कर जाते हैं।

Findings को पेज के बजाय rule और component के अनुसार group करें: साझा button component में एक missing name सैकड़ों एक जैसे नतीजे दे सकता है। हर group को WCAG success criterion से जोड़ें, severity यूज़र के काम पर असर के अनुसार तय करें (रुका हुआ checkout सजावटी icon से ऊपर है), और incomplete या needs review चिह्नित items को नज़रअंदाज़ करने के बजाय किसी इंसान को भेजें। ध्यान दें कि WCAG 2.2 ने 4.1.1 Parsing हटा दिया है, इसलिए duplicate ids जैसी markup-validity findings अपने आप में WCAG 2.2 failures नहीं हैं — जब तक वे कुछ और न तोड़ें, जैसे ग़लत element की ओर इशारा करता label या aria-labelledby।

आज़माएँ: AI बग गंभीरता सुझाव

Legacy issues का baseline, उन्हें छिपाए बिना

परिपक्व product पर zero-violations gate चालू करने से आम तौर पर हर build फ़ेल होता है। Baseline gate को उपयोगी बनाता है: मौजूदा violations रिकॉर्ड करें (rule id और component या selector जैसा स्थिर target), build केवल उन findings पर फ़ेल करें जो baseline में नहीं हैं, और baseline फ़ाइल को pull requests में code की तरह review करें। हर baselined item किसी backlog ticket से जुड़ा हो ताकि वह ठीक हो, भूला न जाए; baseline सिर्फ़ छोटा होना चाहिए। पूरे rules बंद करने से बचें — ऊपर के उदाहरण की तरह किसी ख़ास क्षेत्र को कारण और owner के साथ exclude करें।

{
  "generated": "2026-09-28",
  "known": [
    { "rule": "color-contrast", "target": ".legacy-footer a", "ticket": "A11Y-214" },
    { "rule": "label", "target": "#old-search input", "ticket": "A11Y-219" }
  ]
}

Automated नतीजों की ईमानदार रिपोर्टिंग

उपयोगी रिपोर्ट scope (पेज, states, viewports, themes, locales), engine और ruleset version, लक्षित WCAG version और स्तर, success criterion और severity के अनुसार गिनती, नए बनाम baselined issues, और स्पष्ट रूप से यह बताती है कि क्या automated रूप से टेस्ट नहीं हुआ। साफ़ automated run को कभी “WCAG compliant” न कहें। अलग-अलग defects manual defects की तरह ही लिखें — component, दिखने वाली विफलता, criterion, प्रभावित यूज़र्स — और rule दस्तावेज़ का link दें।

आज़माएँ: AI बग टाइटल जनरेटर

Automation, manual testing और WCAG-EM sampling को जोड़ना

टिकाऊ कार्यक्रम तरीकों की परतें बनाता है: हर बदलाव पर automated rules; हर feature पर कीबोर्ड, दृश्य प्रस्तुति और फ़ॉर्म की manual checks; मुख्य journeys की screen readers और zoom से assistive-technology टेस्टिंग; और जहाँ संभव हो, विकलांगता वाले लोगों के साथ sessions, जिन्हें W3C की evaluation guidance पूरे विकास में प्रोत्साहित करती है।

पूरी साइट के औपचारिक मूल्यांकन के लिए W3C की WCAG Evaluation Methodology (WCAG-EM 2.0) ढाँचा देती है: evaluation scope तय करना, product को explore करना, प्रतिनिधि sample चुनना, sample का मूल्यांकन करना, और findings रिपोर्ट करना। Sample एक structured चयन — आम views, आवश्यक functionality, अलग-अलग प्रकार के content और तकनीकें, और हर complete process का हर पेज — को randomly चुने गए सेट के साथ जोड़ता है। Automated scans पूरी साइट explore करने और वह sample चुनने के लिए उपयुक्त हैं; फिर sample का मूल्यांकन हर लागू success criterion के सामने होता है, ज़्यादातर हाथ से।

आज़माएँ: AI QA चेकलिस्ट जनरेटर

अक्सर पूछे जाने वाले सवाल

Automated टूल WCAG का कितना प्रतिशत टेस्ट कर सकते हैं?

कोई एक आधिकारिक आँकड़ा नहीं है, और यह engine, content और आंशिक रूप से automatable criteria को गिनने के तरीके पर निर्भर है। W3C का रुख़ है कि कोई टूल अकेले conformance तय नहीं कर सकता। योजना ऐसी बनाएँ कि automation एक हिस्सा भरोसे से पकड़े और बाक़ी manual और assistive-technology टेस्टिंग कवर करे।

क्या Lighthouse accessibility score 100 का मतलब है कि मेरी साइट सुलभ है?

नहीं। इसका मतलब है कि उस पेज पर उस state में audited automated rules पास हुए। कीबोर्ड operability, alt-text गुणवत्ता, error handling और screen reader अनुभव उस score के दायरे से बाहर हैं।

क्या एक्सेसिबिलिटी violations पर CI build फ़ेल होना चाहिए?

हाँ, बदलाव से छुए गए code में नए violations पर, और मौजूदा violations के लिए review किए गए baseline के साथ। एक साथ सब पर फ़ेल करने से टीमें अक्सर check ही बंद कर देती हैं।

“Needs review” या incomplete नतीजों का क्या करें?

उन्हें किसी इंसान को भेजें। ये वे मामले हैं जिन्हें engine तय नहीं कर सका — जैसे background image पर टेक्स्ट — और अक्सर असली defects यहीं छिपे होते हैं।

क्या unit tests में एक्सेसिबिलिटी checks चला सकते हैं?

हाँ, संरचना और names के लिए: component render करके accessibility engine या role-आधारित queries चलाने से missing labels और ग़लत ARIA जल्दी पकड़े जाते हैं। Contrast और layout checks को असली browser चाहिए, इसलिए उन्हें browser में component tests या end-to-end tests में रखें।

क्या automated टूल native mobile apps पर काम करते हैं?

Platform टूल हैं — Android automated एक्सेसिबिलिटी checks और Accessibility Scanner app का दस्तावेज़ देता है, और Apple के XCTest में हाल के versions में accessibility audits हैं — पर वेब की तरह वे TalkBack और VoiceOver टेस्टिंग के पूरक हैं, विकल्प नहीं।

संदर्भ

  • Evaluating Web Accessibility OverviewW3C Web Accessibility Initiative (WAI)एक्सेसिबिलिटी मूल्यांकन के लिए W3C का प्रवेश-पृष्ठ: शुरू से और पूरे विकास में मूल्यांकन क्यों, और मैनुअल जाँच, टूल व यूज़र भागीदारी कैसे साथ काम करते हैं।
  • All ACT RulesW3C Web Accessibility Initiative (WAI)Accessibility Conformance Testing (ACT) नियम: WCAG और ARIA आवश्यकताओं के सटीक, दस्तावेज़ित टेस्ट तरीके, ताकि ऑटोमेटेड और मैनुअल नतीजे एक जैसे हों।
  • Web Content Accessibility Guidelines (WCAG) 2.2W3C · 2024W3C की Recommendation जो सुलभ वेब कंटेंट के लिए टेस्ट करने योग्य success criteria तय करती है — चार सिद्धांतों और तीन conformance स्तरों (A, AA, AAA) में व्यवस्थित।
  • WCAG Evaluation Methodology (WCAG-EM) 2.0W3C · 2026पूरी वेबसाइट को WCAG के सामने जाँचने की W3C पद्धति: दायरा तय करना, खोजबीन, प्रतिनिधि सैंपल चुनना, ऑडिट और रिपोर्ट।
  • Web Accessibility Evaluation Tools ListW3C Web Accessibility Initiative (WAI)एक्सेसिबिलिटी मूल्यांकन टूल की प्रकार, guideline और वातावरण के अनुसार फ़िल्टर करने योग्य सूची — W3C इन्हें बिना समर्थन के सूचीबद्ध करता है।
  • Playwright DocumentationMicrosoft (Playwright)Playwright का आधिकारिक दस्तावेज़ — Chromium, WebKit और Firefox चलाने वाला end-to-end टेस्ट फ़्रेमवर्क।
  • Cypress DocumentationCypress.ioCypress से ब्राउज़र में एंड-टू-एंड और कंपोनेंट टेस्टिंग का आधिकारिक दस्तावेज़।
  • About Queries — Testing LibraryTesting Libraryक्वेरी प्रकार और उनकी प्राथमिकता — role और label पहले, टेक्स्ट बाद में, test id आख़िर में — ताकि टेस्ट एलिमेंट वैसे ढूँढें जैसे यूज़र और सहायक तकनीक।

अभ्यास

Pull request पर automated एक्सेसिबिलिटी scan का triage करें

आपका काम

आप Darb Bus के QA engineer हैं — यह bus ticket booking का web app है (काल्पनिक)। Pull request #482 एक नया पेज जोड़ता है जिसमें seat map और passenger details form है। हर pull request पर Playwright के end-to-end test में axe-core चलता है, legacy issues के लिए baseline के साथ। पहला run फ़ेल हुआ; फिर developer ने commit a2 push किया जिससे job हरा हो गया, और अब PR description कहता है कि पेज WCAG 2.2 AA compliant है। Merge से पहले आप नतीजों, check और इस दावे की review करते हैं। नीचे के material में संदर्भ, check, दोनों runs, एक HTML validator का output, baseline, PR का टेक्स्ट और पेज के markup का अंश है।

गाइड के साथ काग़ज़ पर काम करें: rules क्या तय कर सकते हैं और क्या नहीं, triage, baselining, states को scan करना और ईमानदार रिपोर्टिंग। हर finding को WCAG 2.2 success criterion से जोड़ें और booking के काम पर असर के हिसाब से टीम के स्केल पर severity तय करें: Blocker, Critical, Major, Minor, Trivial। Contrast ratios material में दिए हैं, इसलिए किसी contrast टूल की ज़रूरत नहीं। इसके लिए 20–30 मिनट रखें।

सामग्री
Darb Bus - bus ticket booking का web app (काल्पनिक)। English और Arabic UI,
light और dark theme। टीम का लक्ष्य WCAG 2.2 level AA है।
PR #482 "Seat map and passenger details" पेज /booking/details जोड़ता है: seat map
पर seat चुनें (required), passenger details भरें (emergency contact को छोड़कर
सभी fields required), फिर "Continue to payment"।
हर pull request पर E2E job a11y-e2e चलता है: @axe-core/playwright के ज़रिए axe-core।

1. Commit a2 के बाद का check (e2e/booking-details.a11y.spec.ts)

// imports as in the guide, plus the baseline file and the team helper newFindings(),
// which drops every finding whose rule + target pair is listed in a11y-baseline.json
test('booking details page is accessible', async ({ page }) => {
  await page.goto('/booking/details?trip=RUH-DMM-0715');
  const results = await new AxeBuilder({ page })
    .withTags(['wcag2a', 'wcag2aa'])
    // contrast is noisy here and is covered by the Jest unit tests (jsdom)
    .disableRules(['color-contrast'])
    .analyze();
  expect(newFindings(results.violations, baseline)).toEqual([]);
});

2. Job a11y-e2e, commit a1 पर run 1 (disableRules line से पहले): FAILED
   Scan हुआ: page load पर /booking/details, 1280 x 720, English UI, light theme

   #   rule               elements     target                           baseline
   Violations
   V1  button-name        40 elements  .seat-map button.seat            NEW
   V2  duplicate-id-aria   2 elements  input#phone                      NEW
   V3  image-alt           1 element   .trip-summary img.operator-logo  NEW
   V4  color-contrast      1 element   button#continue                  NEW
                                       #FFFFFF on #4CAF50 = 2.78:1, 16px bold;
                                       expected 4.5:1
   V5  color-contrast      3 elements  .legacy-footer a                 KNOWN A11Y-88
   V6  link-name           1 element   footer a.social-x                KNOWN A11Y-91
   Incomplete (needs review)
   I1  color-contrast      1 element   .trip-banner h2
                                       "Riyadh to Dammam", white, 24px;
                                       background could not be determined
                                       (background image)

   Developer का comment: "V1 false positive है: हर seat button में SVG icon है।"
   I1 की manual जाँच, हना (devtools colour picker, heading के पीछे सबसे हल्के
   बिंदु पर): #5C5C5C, सफ़ेद के सामने 6.7:1। Banner की photo destination के साथ
   बदलती है।

3. Commit a1 पर job markup-check (एक HTML validator; इसके messages WCAG 2.1 का
   हवाला देते हैं)

   duplicate id "phone"   2 elements   WCAG 4.1.1 Parsing - failure
   duplicate id "promo"   2 elements   WCAG 4.1.1 Parsing - failure

   कोई label या ARIA attribute id "promo" की ओर इशारा नहीं करता: यह दो decorative
   div wrappers पर है।

4. main पर a11y-baseline.json
   Tickets: A11Y-88 Open; A11Y-91 Open; A11Y-95 Done, 2 सितंबर 2026 को (payment
   पेज का promo code field दिखने वाले label के साथ दोबारा बनाया गया)

{
  "generated": "2026-08-14",
  "known": [
    { "rule": "color-contrast", "target": ".legacy-footer a", "ticket": "A11Y-88" },
    { "rule": "link-name", "target": "footer a.social-x", "ticket": "A11Y-91" },
    { "rule": "label", "target": "#promo-code", "ticket": "A11Y-95" },
    { "rule": "image-alt", "target": ".promo-banner img" }
  ]
}

5. Commit a2 "Make a11y job green" - run 2: PASSED, 0 नए violations
   यह part 1 में दिखी disableRules line जोड़ता है, और a11y-baseline.json में ये
   entries:

    { "rule": "button-name", "target": ".seat-map button.seat", "ticket": "A11Y-140" },
    { "rule": "duplicate-id-aria", "target": "input#phone", "ticket": "A11Y-141" },
    { "rule": "image-alt", "target": ".trip-summary img.operator-logo" }

6. PR description (ड्राफ़्ट)
   "Accessibility: axe 0 violations बताता है, और Lighthouse home page को
   accessibility score 100 देता है। नया booking पेज WCAG 2.2 AA compliant है।"

7. /booking/details के markup का अंश (English UI, seat चुनने के बाद; हर तरह की एक
   seat, कुल 40)

<div class="trip-summary">
  <img class="operator-logo" src="/img/op/17.png"> <span>Eastern Coaches</span>
  <span>Riyadh to Dammam, Fri 16 Oct 2026, 07:15</span>
</div>
<img src="/img/seat-legend.png" alt="legend">
<div class="seat-map">
  <button class="seat"><svg class="i-seat"><path d="..."/></svg></button>
  <button class="seat seat--taken"><svg class="i-seat"><path d="..."/></svg></button>
  <button class="seat seat--selected"><svg class="i-seat"><path d="..."/></svg></button>
</div>
<label for="dob">Passport number</label>
<input id="passport" name="passport">
<label for="passport">Date of birth</label>
<input id="dob" name="dob" placeholder="DD/MM/YYYY">
<span id="nat-label">Nationality</span>
<div role="combobox" aria-labelledby="nat-label" aria-expanded="false"
     aria-controls="nat-list" tabindex="0" onclick="toggleList()">Select</div>
<ul id="nat-list" role="listbox" hidden>
  <li role="option" onclick="pickNationality(this)">Saudi Arabia</li> ...
</ul>
<label for="phone">Mobile phone</label> <input id="phone" type="tel">
<label for="phone">Emergency contact phone</label> <input id="phone" type="tel">
<p class="error" hidden>Invalid input</p>
<button id="continue">Continue to payment</button>

   Legend image तीन seat icons दिखाती है, इन शब्दों के साथ: Available (सफ़ेद),
   Taken (ग्रे) और Selected (हरा)। Seat का state सिर्फ़ उसके fill रंग से दिखता है
   (classes seat--taken, seat--selected)। toggleList() list दिखाता या छिपाता है
   और aria-expanded बदलता है; कोई key handler नहीं है। हर p.error अपने field के
   नीचे है और submit पर दिखता है।
चरण
  1. Run 1 का triage करें: हर violation और incomplete नतीजे के लिए तय करें कि वह true positive है या false positive और आप उसे कैसे सत्यापित करेंगे, नतीजों को component के अनुसार group करें, WCAG 2.2 criterion बताएँ और नए नतीजों की severity तय करें। V1 पर developer के comment और markup-check की दोनों findings पर भी फ़ैसला लें।
  2. Commit a2 और baseline की review करें: आप क्या स्वीकार करेंगे और क्या अस्वीकार, और क्यों? इस PR के बाद baseline में क्या होना चाहिए?
  3. ख़ुद check की review करें: वह क्या नहीं देख सकता, यह लिखें, और बेहतर scan plan बनाएँ — test levels, tags, states, locales, viewports और themes।
  4. Markup के अंश में वह खोजें जो rules पास कर देते हैं पर जिसे इंसान को आँकना होता है। हर finding के लिए criterion, severity और वह manual या assistive-technology check बताएँ जो उसे पकड़ता है।
  5. PR description के एक्सेसिबिलिटी वाले वाक्य को ईमानदार रिपोर्ट के रूप में दोबारा लिखें।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

V1: true positive, और developer का comment ग़लत है। जिस svg में न title हो, न aria-label, न कोई टेक्स्ट, वह button को कोई accessible name नहीं देता: devtools का accessibility pane role button और ख़ाली name दिखाता है, और ACT rule “Button has non-empty accessible name” एक non-empty name की अपेक्षा करता है। 40 elements seat button component का एक defect हैं, 40 defects नहीं। Criterion: 4.1.2 Name, Role, Value। Severity: Blocker — screen reader यूज़र 40 बार “button” सुनता है, seats में फ़र्क़ नहीं कर पाता, यह नहीं जान पाता कि कौन-सी ख़ाली हैं, और seat के बिना आगे नहीं बढ़ सकता, इसलिए booking सिर्फ़ अंदाज़े से पूरी हो सकती है। Expected: हर seat का नाम उसके number और state से, जैसे “Seat 12, available”; state की बात नीचे markup review में है।

V2: true positive, और अपने rule के नाम से ज़्यादा गंभीर। दोनों labels में for="phone" है, और label उस id वाले पहले element की ओर इशारा करता है, इसलिए mobile phone field को दोनों labels मिलते हैं और emergency contact field को कोई नहीं। Criterion: 4.1.2 Name, Role, Value, क्योंकि उस field का कोई accessible name नहीं है। Severity: Major — field optional है, पर screen reader यूज़र नहीं जान पाता कि कौन-सा number कहाँ जाए, और ग़लत number emergency contact बन सकता है। Fix: unique ids, जैसे emergency-phone। phone वाली markup-check line वही defect है, इसलिए एक ticket दोनों को cover करे। Duplicate id promo WCAG 2.2 failure नहीं है: WCAG 2.2 ने 4.1.1 Parsing हटा दिया है, और कोई label या ARIA attribute उस id की ओर इशारा नहीं करता, इसलिए वह कोई name या relationship नहीं तोड़ता। चाहें तो इसे low-priority code-quality item के रूप में दर्ज करें, और कहें कि WCAG 2.2 लक्ष्य वाले प्रोजेक्ट में validator के messages 4.1.1 का हवाला देना बंद करें।

V3: true positive, 1.1.1 Non-text Content। Operator का नाम logo के बगल वाले टेक्स्ट में पहले से है, इसलिए सही fix alt="" है, जो image को decorative बनाता है; “Eastern Coaches logo” जैसा alt नाम को दो बार पढ़वाएगा। Severity: Minor — screen reader file name पढ़ सकता है, जो शोर है, पर काम पर असर नहीं पड़ता।

V4: true positive, 1.4.3 Contrast (Minimum)। Bold टेक्स्ट 14 pt, यानी लगभग 18.7 px, से ही large-scale गिना जाता है, इसलिए 16 px bold label को 4.5:1 चाहिए, और 2.78:1 फ़ेल है। Severity: Major — payment तक जाने का इकलौता रास्ता कम दृष्टि वाले यूज़र्स के लिए पढ़ना मुश्किल है, हालाँकि काम अब भी पूरा हो सकता है। रंग ठीक करें (जैसे #2E7D32 पर सफ़ेद लगभग 5.1:1 है) और असली browser में दोनों themes में दोबारा जाँचें। यही वह असली failure है जिसे commit a2 ने छिपा दिया।

V5 और V6 baseline में दर्ज legacy findings हैं जिनके tickets खुले हैं (A11Y-88, A11Y-91): वे इस PR को फ़ेल नहीं करते और इस PR ने उन्हें पैदा नहीं किया, पर रिपोर्ट में known issues के रूप में उनकी जगह है। I1 न violation है, न false positive: engine तय नहीं कर सका और सवाल इंसान को सौंप दिया। हना का माप, सबसे हल्के बिंदु पर 6.7:1, पास है: 24 px large-scale टेक्स्ट है, जिसे 3:1 चाहिए, और यह 4.5:1 भी पार करता है। इसे सबूत के साथ इस route के लिए passed दर्ज करें। क्योंकि photo destination के साथ बदलती है, कहें कि design हर photo पर यह contrast पक्का करे, जैसे टेक्स्ट के पीछे गहरे overlay से, या सबसे हल्की photos भी जाँचें।

Commit a2: इसे अस्वीकार करें। disableRules वाली line पूरा rule बंद कर देती है: इसने V4 छिपाया, जो इस PR की असली failure है, और यह पेज पर भविष्य के हर contrast regression को छिपा देगी। इसका कारण भी ग़लत है: jsdom layout की गणना नहीं करता, और axe-core का documentation बताता है कि उसका color-contrast rule JSDOM में काम नहीं करता, इसलिए Jest tests कोई contrast जाँचते ही नहीं। अगर किसी एक element को सच में बाहर रखना हो, तो सिर्फ़ उसी element को कारण, owner और ticket के साथ exclude करें। Baseline की तीन नई entries उस code के violations छिपाती हैं जो यह PR जोड़ता है: baseline legacy issues दर्ज करता है और उसे सिर्फ़ छोटा होना चाहिए, और gate ठीक इन्हीं को फ़ेल करने के लिए है; image-alt वाली entry में तो ticket भी नहीं है। इसके बजाय V1 से V4 इसी PR में ठीक करें। main वाले baseline में भी दो सुधार चाहिए। A11Y-95 की entry हटाएँ: issue ठीक हो चुका है, और उसकी entry उसके regression को छिपा देगी — पहले पूरी साइट के scheduled scan में पुष्टि करें, क्योंकि इस पेज का scan promo code field तक नहीं पहुँचता। और .promo-banner img के लिए ticket खोलें। PR के बाद baseline में तीन entries हैं — A11Y-88, A11Y-91 और नया ticket — और इस PR की कोई नहीं।

Check एक ही state scan करता है: load पर पेज, अंग्रेज़ी में, light theme, 1280 × 720। यह कभी चुनी हुई seat, खुली nationality list, validation errors, अरबी right-to-left पेज, संकरा viewport या dark theme नहीं देखता। इसके tags, wcag2a और wcag2aa, सिर्फ़ वे rules चलाते हैं जिन्हें axe-core WCAG 2.0 criteria के तहत रखता है; WCAG 2.2 AA लक्ष्य के लिए गाइड के उदाहरण की तरह wcag21a, wcag21aa और wcag22aa जोड़ें — मसलन axe-core अपने autocomplete check को 1.3.5 Identify Input Purpose के तहत रखता है, जो WCAG 2.1 का criterion है। बेहतर plan: end-to-end test में scan करें (1) load पर, (2) seat चुनने के बाद, (3) nationality list खुली होने पर और (4) required fields ख़ाली छोड़कर “Continue to payment” के बाद; चारों scans अरबी UI पर, 320 px चौड़े viewport पर और dark theme में दोहराएँ; color-contrast चालू रखें। नीचे के स्तर पर seat button का component test जोड़ें जो हर seat को role और name से ढूँढे, जैसे getByRole('button', { name: 'Seat 12, available' }): यह आज फ़ेल होगा, jsdom में चलता है, और पेज बनने से बहुत पहले missing name पकड़ लेता है। ऊपर के स्तर पर पूरी साइट का व्यापक scheduled scan रखें।

जो rules पास कर देते हैं पर जिसे इंसान को आँकना होता है: markup में पाँच findings। (1) Legend image में alt है, इसलिए image-alt पास होता है, पर “legend” उस बात के समकक्ष नहीं जो image कहती है: 1.1.1। उसके शब्द भी image of text हैं, जहाँ असली टेक्स्ट काम कर जाता: 1.4.5 Images of Text। Text alternative में तीनों रंग और उनके अर्थ लिखें, या बेहतर, legend को असली टेक्स्ट बनाएँ, जिससे दोनों ठीक हो जाते हैं। Severity: Major, जब तक यही seat के रंगों की इकलौती व्याख्या है। हर image के alt को उसके content से मिलाकर review करने पर पकड़ में आता है। (2) Seat का state सिर्फ़ रंग से दिखता है: 1.4.1 Use of Color; और taken व selected states assistive technologies तक बिल्कुल नहीं पहुँचते: 4.1.2। इसे V1 के साथ ठीक करें — जैसे taken seat को disabled button, selected seat पर aria-pressed="true", और रंग के अलावा कोई दिखने वाला फ़र्क़। यह seat map वाले Blocker का हिस्सा है। Greyscale में पेज देखने और screen reader से टेस्ट करने पर पकड़ में आता है।

(3) Passport number और date of birth के labels आपस में बदले हुए हैं। हर field का label है, इसलिए label rule पास होता है, पर passport field “Date of birth” के रूप में announce होता है और उल्टा भी: 1.3.1 Info and Relationships और 2.5.3 Label in Name। Severity: Critical — screen reader और voice control यूज़र ग़लत field में लिखते हैं; सबसे अच्छी स्थिति में error message आता है, सबसे बुरी में booking में passenger का ग़लत data जाता है। Devtools में हर field का computed name उसके दिखने वाले label से मिलाने पर पकड़ में आता है। (4) Nationality combobox का role, name और state सही हैं, पर सिर्फ़ onclick handler है: Enter, Space और arrow keys कुछ नहीं करतीं, इसलिए कीबोर्ड यूज़र nationality नहीं चुन सकते: 2.1.1 Keyboard। Severity: कीबोर्ड यूज़र्स के लिए Blocker, क्योंकि field required है। सिर्फ़ कीबोर्ड टेस्ट इसे पकड़ता है। (5) “Invalid input” न बताता है कि क्या ग़लत है, न यह कि कैसे ठीक करें, जबकि अपेक्षित format पता है: 3.3.3 Error Suggestion, जैसे “Enter the date of birth as DD/MM/YYYY”। Severity: Major। Scan कभी इस state तक पहुँचा ही नहीं, और शब्दों को वैसे भी इंसान को आँकना होता है। दो और बातें जाँचें: कोई चीज़ हर message को उसके field से नहीं जोड़ती, न उसे announce करती है (न aria-describedby, न aria-invalid, न live region), इसलिए error state में screen reader से पुष्टि करें कि यूज़र सुनता है कि किस field में क्या ग़लत है (3.3.1 Error Identification); और markup में कुछ भी required fields को चिह्नित नहीं करता (labels में “required” नहीं, required attribute नहीं), इसलिए अगर visual design भी उन्हें चिह्नित नहीं करता, तो यूज़र को यह सिर्फ़ errors से पता चलता है (3.3.2 Labels or Instructions)।

ड्राफ़्ट की जगह ईमानदार statement: “Accessibility, automated हिस्सा। Scope: सिर्फ़ load पर /booking/details; English UI, light theme, 1280 × 720। Engine: @axe-core/playwright के ज़रिए axe-core (version lockfile से); tags wcag2a और wcag2aa, यानी सिर्फ़ WCAG 2.0 A और AA rules, जबकि लक्ष्य WCAG 2.2 AA है। Run 1: इस PR के जोड़े code में 4 नए violations — 4.1.2 बिना name के seat buttons (40 elements, एक component, Blocker), 4.1.2 duplicate id phone जिससे emergency contact phone बिना label रह जाता है (Major), 1.4.3 Continue button 2.78:1 पर (Major), 1.1.1 बिना alt का operator logo (Minor); baseline में 2 findings (A11Y-88, A11Y-91); 1 incomplete नतीजा हाथ से जाँचा गया और पास हुआ। Commit a2 revert हुआ, चारों findings इसी PR में ठीक हो रहे हैं, और gate color-contrast के साथ चालू रहता है। Automation ने cover नहीं किया: बाक़ी states, अरबी UI, dark theme, संकरे viewports, कीबोर्ड operability, labels और text alternatives की शुद्धता, error messages और screen reader journey; markup की manual review में पाँच और defects मिले (tickets linked)। यह conformance का दावा नहीं है।” Lighthouse वाला वाक्य हटा दें: home page का score इस पेज के बारे में कुछ नहीं बताता, और वहाँ भी 100 का मतलब सिर्फ़ इतना है कि उस state में audited rules पास हुए।

अगर आपके जवाब अलग हैं, तो देखें कि हर finding के साथ उसका सबूत, criterion, कारण सहित severity, और owner या ticket है। स्वीकार्य अंतर: V1 या nationality combobox के लिए Blocker की जगह Critical, अगर आपकी टीम Blocker पूरी सेवा ठप होने के लिए रखती है; या operator के नाम वाला descriptive alt, अगर नाम टेक्स्ट के रूप में न दिखता। स्वीकार्य नहीं: V1 को false positive कहना, commit a2 का कोई भी हिस्सा मानना, duplicate id promo को WCAG 2.2 failure मानना, I1 को किसी इंसान की जाँच के बिना बंद करना, या scan हरा होने के आधार पर पेज को “WCAG compliant” कहना।

इस topic में आपकी प्रगति

QA रोडमैप का हिस्सा

इस गाइड में बताए गए टूल्स

HTML में आम एक्सेसिबिलिटी समस्याएँ जाँचें — ग़ायब alt text, बिना label के fields, बिना नाम के buttons और links, ARIA errors, headings, contrast — WCAG 2.2 से जुड़ी हुई।

वैलिडेशन नया

Mutqan AI से किसी भी फ़ीचर के लिए अनुकूलित QA चेकलिस्ट (functional, UI, API, security, performance, accessibility, release) बनाएँ।

टेस्ट जनरेशन AI

Mutqan AI से बिखरे हुए विवरण से स्पष्ट और खोजने में आसान बग टाइटल बनाएँ।

बग विश्लेषण AI

Mutqan AI से कारण सहित सुझाई गई गंभीरता (Blocker / Critical / Major / Minor / Trivial) पाएँ।

बग विश्लेषण AI

Mutqan Soft कैसे मदद कर सकता है

और गाइड

और गाइड
टेस्ट डिज़ाइन

एक्सेसिबिलिटी टेस्टिंग

WCAG 2.2 के साथ एक्सेसिबिलिटी टेस्टिंग: POUR सिद्धांत, A/AA/AAA लेवल, WCAG-EM मूल्यांकन, मैनुअल बनाम ऑटोमेटेड, स्प्रिंट और CI में अभ्यास, आम डिफ़ेक्ट।

17 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

सुलभ फ़ॉर्म की टेस्टिंग

WCAG 2.2 के अनुसार वेब फ़ॉर्म की एक्सेसिबिलिटी कैसे टेस्ट करें: labels, required फ़ील्ड, grouping, errors, autocomplete, redundant entry और सुलभ लॉगिन।

14 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

विज़ुअल एक्सेसिबिलिटी टेस्टिंग

WCAG 2.2 के अनुसार contrast, रंग का उपयोग, alt text, resize और reflow, text spacing, target size, motion और dark mode कैसे टेस्ट करें, checklists सहित।

11 मिनट पढ़ने का समय
ऑटोमेशन

CI/CD पाइपलाइन में टेस्टिंग

CI/CD पाइपलाइन में टेस्टिंग कैसे होती है: टेस्ट स्टेज, तेज़ फ़ीडबैक का क्रम, क्वालिटी गेट, JUnit रिपोर्ट, शार्डिंग, flaky टेस्ट और फ़ेलियर ट्राइएज।

16 मिनट पढ़ने का समय
ऑटोमेशन

UI टेस्ट ऑटोमेशन

UI टेस्ट ऑटोमेशन व्यवहार में: फ़्रेमवर्क की परतें, Selenium, Playwright और Cypress, locators, waits, assertions, page objects, टेस्ट डेटा और CI।

16 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

कीबोर्ड एक्सेसिबिलिटी टेस्टिंग

कीबोर्ड एक्सेसिबिलिटी कैसे टेस्ट करें: WCAG 2.2 criteria, focus order और visibility, trap, skip link, APG key patterns, dialog, टेस्ट केस, डिफ़ेक्ट।

12 मिनट पढ़ने का समय