स्क्रीन रीडर टेस्टिंग

स्क्रीन रीडर टेस्टिंग यह जाँचती है कि पेज या ऐप assistive technology को सही जानकारी देता है या नहीं: हर element क्या है (उसका role), उसका नाम क्या है (accessible name), वह किस state में है, कंटेंट की संरचना कैसी है, और बदलाव announce होते हैं या नहीं। स्क्रीन रीडर वही बोल सकता है जो कोड उसे बताता है, इसलिए ज़्यादातर failures semantic होती हैं — ऐसा बटन जो असल में div है, बिना नाम का icon, ऐसी heading जो सिर्फ़ bold टेक्स्ट है।

यह गाइड समझाती है कि स्क्रीन रीडर semantics कैसे इस्तेमाल करते हैं, accessible names कैसे निकाले जाते हैं, headings, landmarks, links और कंट्रोल में क्या जाँचें, ARIA इस्तेमाल करने के नियम, dynamic कंटेंट और live regions कैसे टेस्ट करें, कौन-सी स्क्रीन रीडर-ब्राउज़र जोड़ियाँ इस्तेमाल करें, और टेस्ट केस व डिफ़ेक्ट उदाहरणों के साथ एक व्यावहारिक टेस्ट रूटीन।

स्क्रीन रीडर semantics कैसे इस्तेमाल करते हैं

ब्राउज़र DOM को accessibility tree में बदलता है: एक समानांतर संरचना जिसमें हर अर्थपूर्ण element का role (button, link, heading, textbox), नाम, states और properties (expanded, checked, required, invalid) और संबंध होते हैं। ऑपरेटिंग सिस्टम का accessibility API यह tree स्क्रीन रीडर तक पहुँचाता है, जो उसे बोलता है या braille display पर भेजता है। Visual styling किसी element का role नहीं बदलती: button जैसा दिखने वाला div tree में फिर भी generic element है। फिर भी CSS का tree पर असर होता है: display: none और visibility: hidden कंटेंट को tree से हटा देते हैं, और CSS से बना टेक्स्ट (::before और ::after) accessible name का हिस्सा बन सकता है।

स्क्रीन रीडर सिर्फ़ वही बोल सकता है जो accessibility tree तक पहुँचे: ब्राउज़र DOM से जो role, नाम, states और संबंध बनाता है। वैचारिक मॉडल
  1. 1DOMHTML elements और ARIA attributes<button aria-label="Search">

    शाखा: सिर्फ़ icon, aria-label नहीं: कोई नाम नहीं, इसलिए बस “button” सुनाई देता हैफ़ेल

  2. 2Accessibility treeब्राउज़र बनाता हैRole · नाम · states और properties · संबंधrole: button · name: "Search"
  3. 3OS का accessibility APITree को स्क्रीन रीडर तक पहुँचाता है
  4. 4स्क्रीन रीडर
  5. 5आवाज़ या braille display"Search, button"अपेक्षित

सरल रूप। Styling role नहीं बदलती: button जैसा दिखने वाला div tree में generic ही रहता है। फिर भी CSS display: none या visibility: hidden से tree से कंटेंट हटा सकती है, या ::before या ::after से नाम में टेक्स्ट जोड़ सकती है।

इसीलिए native HTML पहले आता है। button element का role button है, उसे फ़ोकस मिलता है, Enter और Space से चलता है और नाम अपने टेक्स्ट से लेता है — बिना अतिरिक्त कोड के। Headings (h1 से h6), lists, th वाली tables, label elements, fieldset और legend, और nav व main जैसे landmarks स्क्रीन रीडर यूज़र्स को वही संरचना देते हैं जो देखने वाले यूज़र देखते हैं। इस पेज की ज़्यादातर WCAG failures 1.3.1 Info and Relationships (संरचना प्रोग्राम से निर्धारित हो सके) और 4.1.2 Name, Role, Value (हर UI कंपोनेंट अपना name, role, states और value उजागर करे) के अंतर्गत आती हैं।

Windows पर डेस्कटॉप स्क्रीन रीडर के दो मुख्य मोड हैं। Browse mode (जिसे virtual cursor भी कहते हैं) में यूज़र arrow keys से पेज पढ़ता है और एक अक्षर से element के प्रकार पर कूदता है; focus mode (forms mode) में keystrokes फ़ोकस वाले कंट्रोल को जाती हैं, जिससे फ़ील्ड में टाइपिंग और arrow keys से widgets चलाना संभव होता है। कई कंट्रोल पर स्क्रीन रीडर अपने-आप मोड बदलते हैं; इस बदलाव को तोड़ने वाले custom widgets डिफ़ेक्ट का आम स्रोत हैं।

Accessible names और descriptions

Accessible name वह है जो स्क्रीन रीडर किसी element के लिए announce करता है, और वॉइस कंट्रोल यूज़र उसे चलाने के लिए यही बोलते हैं। ब्राउज़र इसे W3C की Accessible Name and Description Computation (accname 1.2, अभी Working Draft) के अनुसार निकालते हैं। सरल शब्दों में, नाम इनमें से पहले लागू होने वाले स्रोत से आता है:

  • aria-labelledby — referenced element या elements का टेक्स्ट।
  • aria-label — element पर ही लिखी string।
  • Native labelling — फ़ॉर्म फ़ील्ड के लिए label element, images के लिए alt, tables के लिए caption, fieldset के लिए legend।
  • Content — button, link और heading जैसे roles के लिए element का अपना टेक्स्ट।
  • Fallbacks — title attribute और inputs के लिए ख़ाली फ़ील्ड के अंदर दिखने वाला hint टेक्स्ट; ये भरोसेमंद नहीं हैं और अकेला नाम नहीं होने चाहिए।

व्यवहार में names, labels और descriptions जाँचना

किसी element को सुनने से पहले ब्राउज़र developer tools के accessibility pane में उसका computed name, role और states देखें: यह बताता है कि कोई चीज़ जैसे announce होती है वैसे क्यों होती है। फिर तीन चीज़ें जाँचें। पहली, हर interactive element का नाम हो — सिर्फ़ icon वाले buttons (search, close, delete, menu) क्लासिक failure हैं। दूसरी, नाम में दिखने वाला label शामिल हो: 2.5.3 Label in Name माँगता है कि जिस कंट्रोल के label में टेक्स्ट है, उसके accessible name में वह टेक्स्ट हो, इसलिए "Send" दिखाने वाले बटन का नाम "Submit form" नहीं हो सकता। तीसरी, नाम संदर्भ से बाहर भी उपयोगी हो: बीस पतों की सूची में "Delete" की जगह "Delete address: 12 MG Road" बेहतर है।

Description अतिरिक्त जानकारी जोड़ता है, आमतौर पर aria-describedby से: पासवर्ड नियम, तारीख़ का फ़ॉर्मेट, फ़ील्ड से जुड़ा error message। Descriptions name और role के बाद announce होते हैं, कभी-कभी रुककर, और यूज़र उनमें से कुछ बंद कर सकते हैं, इसलिए ज़रूरी जानकारी नाम या दिखने वाले label में होनी चाहिए। फ़ॉर्म labels, निर्देश और error messages accessible फ़ॉर्म गाइड में विस्तार से कवर हैं।

Headings, landmarks और पेज टाइटल

स्क्रीन रीडर यूज़र शायद ही कभी पेज ऊपर से नीचे पढ़ते हैं। वे headings या landmarks की सूची खोलते हैं, या एक heading से दूसरी पर कूदते हैं, ताकि ज़रूरी हिस्सा मिले। इससे संरचना टेस्ट करने योग्य बनती है: headings सूची खोलें और जो दिखता है उससे तुलना करें। हर दिखने वाली heading असली heading element हो, levels hierarchy दिखाएँ (एक मुख्य h1, सेक्शन के लिए h2, उनके अंदर h3), और heading टेक्स्ट अपने सेक्शन का वर्णन करे (2.4.6 Headings and Labels)। heading जैसा दिखने वाला लेकिन markup न किया गया styled टेक्स्ट 1.3.1 फ़ेल करता है।

Landmarks पेज के क्षेत्र चिह्नित करते हैं: header (banner), nav (navigation), main, aside (complementary), footer (contentinfo), साथ में search और form regions। जाँचें कि मुख्य कंटेंट main के अंदर है, दोहराया navigation nav में है, और एक ही प्रकार के कई regions हों तो हर एक का label हो, जैसे "Main menu" और "Footer links"। अंत में, पेज टाइटल सबसे पहले announce होता है: 2.4.2 Page Titled ऐसा टाइटल माँगता है जो विषय या उद्देश्य बताए, और single-page applications को हर route change पर इसे अपडेट करना चाहिए।

ARIA: roles, states, properties और इस्तेमाल के नियम

WAI-ARIA 1.2 (W3C Recommendation) roles (element क्या है: tab, dialog, menu, alert), states (बदलने वाली स्थितियाँ: aria-expanded, aria-checked, aria-selected) और properties (ज़्यादा स्थिर विशेषताएँ: aria-label, aria-controls, aria-required) परिभाषित करता है। ARIA सिर्फ़ वही बदलता है जो accessibility tree में उजागर होता है; व्यवहार नहीं बदलता। ARIA Authoring Practices Guide साफ़ कहता है कि ARIA roles से ब्राउज़र कीबोर्ड व्यवहार या styling नहीं देते — role="button" वाले div को फिर भी tabindex और key handlers चाहिए।

W3C की दो बातें इसके इस्तेमाल का सार हैं। लंबे समय से चला आ रहा "first rule of ARIA use" कहता है कि अगर आप ऐसा native HTML element या attribute इस्तेमाल कर सकते हैं जिसमें ज़रूरी semantics और व्यवहार पहले से हैं, तो किसी दूसरे element पर ARIA जोड़ने की बजाय वही करें। और APG का "No ARIA is better than bad ARIA" चेतावनी देता है कि ग़लत ARIA स्क्रीन पर मौजूद चीज़ को ग़लत रूप में पेश करता है, जिससे अनुभव बिना ARIA से भी बदतर हो सकता है। टेस्टिंग में सबसे आम ARIA डिफ़ेक्ट:

  • व्यवहार के बिना role — ऐसे elements पर role="button", role="tab" या role="checkbox" जिन्हें कीबोर्ड से फ़ोकस या ऑपरेट नहीं किया जा सकता।
  • कभी न बदलने वाली states — मेन्यू खुलने के बाद भी aria-expanded "false" रहता है; दूसरा tab चुनने पर aria-selected नहीं हटता।
  • focusable elements वाले कंटेंट पर aria-hidden="true", जिससे कीबोर्ड फ़ोकस ऐसी चीज़ पर जाता है जिसे स्क्रीन रीडर नहीं पहचानता।
  • बिना role वाले सादे div या span पर aria-label — WAI-ARIA 1.2 generic role को नाम देना वर्जित करता है, इसलिए यह label शायद announce न हो।
  • दिखने वाले label के विपरीत नाम, जो 2.5.3 Label in Name फ़ेल करता है।
  • साधारण कंटेंट पर application roles — साइट navigation सूची पर role="menu", या पेज के किसी हिस्से पर role="application", जो स्क्रीन रीडर के keys सँभालने का तरीका बदल देता है।

Dynamic कंटेंट, live regions और status messages

पेज लोड के बिना बदलने वाली हर चीज़ स्क्रीन रीडर यूज़र के लिए अदृश्य है, जब तक वह announce न हो या फ़ोकस उस पर न जाए। दोनों में से सोच-समझकर चुनें। फ़ोकस तब हिलाएँ जब यूज़र को नए कंटेंट पर कार्रवाई करनी हो (dialog खुलना, नया page view लोड होना)। फ़ोकस हिलाए बिना announce तब करें जब यूज़र को बस पता होना चाहिए कि कुछ हुआ: "Saved", "3 results", "Item added to cart", "Uploading 40%"। दूसरा मामला ठीक 4.1.3 Status Messages है, जो माँगता है कि status messages role या properties से प्रोग्राम द्वारा निर्धारित हो सकें ताकि assistive technology उन्हें फ़ोकस मिले बिना प्रस्तुत कर सके।

इसके साधन live regions हैं। role="status" (polite: यूज़र के idle होने पर announce) result counts और पुष्टियों के लिए ठीक है; role="alert" (assertive: बीच में टोकता है) errors जैसे ज़रूरी, समय-संवेदी संदेशों के लिए है; role="log" chat और activity feeds के लिए। टेस्ट करते समय हर बदलाव ट्रिगर करें और सुनें। आम failures: live region उसी पल अपने टेक्स्ट के साथ पेज में डाला जाता है, इसलिए कुछ announce नहीं होता; region display: none से छिपा है; spinner हर आधे सेकंड "loading" बोलता है; या सब कुछ alert है और यूज़र लगातार टोका जाता है।

स्क्रीन रीडर और ब्राउज़र की जोड़ियाँ

स्क्रीन रीडर और ब्राउज़र जोड़ी में टेस्ट होते हैं, क्योंकि नतीजा दोनों मिलकर बनाते हैं। जोड़ियाँ अपने ऑडियंस डेटा और कॉन्ट्रैक्ट के accessibility support baseline से चुनें, सूची छोटी रखें, और हर स्प्रिंट में सब टेस्ट करने की बजाय रिलीज़ दर रिलीज़ उन्हें बदलते रहें।

  • Windows — NVDA (मुफ़्त, open source) Firefox या Chrome के साथ; JAWS (commercial) Chrome या Edge के साथ; Windows में built-in Narrator, Edge के साथ।
  • macOS — built-in VoiceOver, आमतौर पर Safari के साथ टेस्ट।
  • iOS और iPadOS — VoiceOver, Safari और native ऐप्स के साथ।
  • Android — TalkBack, Chrome और native ऐप्स के साथ।
  • हर नतीजे के साथ स्क्रीन रीडर, ब्राउज़र और OS के वर्ज़न दर्ज करें; वर्ज़न बदलने पर व्यवहार बदलता है।

स्क्रीन रीडर टेस्ट का व्यावहारिक रूटीन

सारे commands सीखने की बजाय कुछ commands अच्छी तरह सीखें। यह रूटीन एक जोड़ी पर पंद्रह से तीस मिनट में ज़्यादातर पेज कवर करता है; शुरू में बोलने की गति आरामदायक रखें और जो सुनें उसे हूबहू लिखें।

  • 1. पेज लोड करें — टाइटल announce हुआ? भाषा और आवाज़ सही है?
  • 2. Headings सूची — NVDA में NVDA+F7 (Elements list); JAWS में Insert+F6; macOS VoiceOver में VO+U (rotor)। क्या outline दृश्य संरचना से मेल खाती है?
  • 3. Landmarks — NVDA में D; JAWS में R; VoiceOver में rotor से Landmarks।
  • 4. Links सूची — NVDA में NVDA+F7; JAWS में Insert+F7। क्या हर link अपने आप में समझ आता है?
  • 5. क्रम से पढ़ें — NVDA/JAWS में Down Arrow; macOS VoiceOver में VO+Right Arrow; iOS VoiceOver और TalkBack में दाईं ओर swipe।
  • 6. कंट्रोल चलाएँ — Tab से हर कंट्रोल पर जाएँ: name, role और state announce होते हैं? Enter/Space से चलाएँ; iOS/Android पर double-tap।
  • 7. फ़ॉर्म — labels, required फ़ील्ड और submit पर errors announce होते हैं?
  • 8. Dynamic बदलाव — toasts, filters और loading ट्रिगर करें: क्या वे फ़ोकस हिलाए बिना announce होते हैं?
  • 9. Dialogs — अपने नाम के साथ dialog के रूप में announce होता है? पीछे का पेज चुप रहता है? बंद होने पर फ़ोकस लौटता है?
  • 10. पूरा काम करें — एक असली प्रोसेस (search, checkout) सिर्फ़ स्क्रीन रीडर से पूरा करें।
  • NVDA key = Insert (Caps Lock भी सेट किया जा सकता है), VO = Control+Option; NVDA+Space browse और focus mode के बीच बदलता है, और Ctrl बोलना रोकता है।
1. Load the page    Title announced? Language/voice correct?
2. Headings list    NVDA: NVDA+F7 (Elements list) · JAWS: Insert+F6 · VoiceOver macOS: VO+U (rotor)
                   Does the outline match the visual structure?
3. Landmarks        NVDA: D · JAWS: R · VoiceOver: rotor > Landmarks
4. Links list       NVDA: NVDA+F7 · JAWS: Insert+F7 — does each link make sense?
5. Read in order    NVDA/JAWS: Down Arrow · VoiceOver macOS: VO+Right Arrow
                   iOS VoiceOver / TalkBack: swipe right
6. Operate controls Tab to each control: name + role + state announced?
                   Activate: Enter/Space · iOS/Android: double-tap
7. Forms            Labels, required, errors announced on submit?
8. Dynamic changes  Trigger toasts, filters, loading: announced without focus move?
9. Dialogs          Announced as dialog with its name? Background silent? Focus returns on close?
10. Complete task   Finish one real process (search, checkout) with the screen reader only

NVDA key = Insert (Caps Lock can also be set) · VO = Control+Option
NVDA: NVDA+Space toggles browse/focus mode · Ctrl stops speech

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

स्क्रीन रीडर टेस्ट केस

इन्हें scope में हर पेज प्रकार और complete process के expected results के रूप में इस्तेमाल करें, और हर नतीजे के साथ जोड़ी दर्ज करें।

  • SR-01 — लोड पर पेज टाइटल announce होता है और पेज का वर्णन करता है (2.4.2)।
  • SR-02 — पेज की भाषा सही है और टेक्स्ट सही आवाज़ में पढ़ा जाता है; दूसरी भाषा के अंशों पर आवाज़ बदलती है (3.1.1, 3.1.2)।
  • SR-03 — Headings सूची तार्किक levels के साथ दृश्य संरचना दिखाती है (1.3.1, 2.4.6)।
  • SR-04 — main, navigation, header और footer landmarks मौजूद हैं; दोहराए landmark प्रकारों के labels हैं।
  • SR-05 — हर link का उद्देश्य उसके टेक्स्ट या संदर्भ से साफ़ है (2.4.4)।
  • SR-06 — हर button और कंट्रोल name, role और state announce करता है; toggles pressed या expanded बताते हैं (4.1.2)।
  • SR-07 — जानकारी देने वाली images के अर्थपूर्ण विकल्प हैं; सजावटी images चुप हैं (1.1.1)।
  • SR-08 — Custom widgets सही role और हर state बदलाव announce करते हैं (4.1.2)।
  • SR-09 — Status messages फ़ोकस हिलाए बिना announce होते हैं (4.1.3)।
  • SR-10 — Modal अपने नाम के साथ dialog के रूप में announce होता है, और खुले रहने तक पीछे का पेज नहीं पढ़ा जाता।
  • SR-11 — कोई दिखने वाली चीज़ स्क्रीन रीडर से छिपी नहीं है, और कोई छिपी चीज़ पढ़ी नहीं जाती।
  • SR-12 — कम से कम एक complete process सिर्फ़ स्क्रीन रीडर से पूरा किया जा सकता है।

डिफ़ेक्ट के उदाहरण

बग टाइटल के रूप में। रिपोर्ट में वर्ज़न सहित जोड़ी, स्टेप और सुना गया सटीक announcement जोड़ें — जैसे: NVDA 2026.x + Firefox, search icon पर Tab, सुना "button", अपेक्षित "Search, button"।

  • "Search icon बटन बिना नाम के button के रूप में announce होता है" — 4.1.2 Name, Role, Value।
  • "FAQ accordion headers expanded या collapsed state announce नहीं करते" — 4.1.2 Name, Role, Value।
  • "Offers पेज पर बारह links, सभी Read more के रूप में announce" — 2.4.4 Link Purpose (In Context)।
  • "सेक्शन टाइटल styled div elements हैं; headings सूची खाली है" — 1.3.1 Info and Relationships।
  • "Filters लगाने के बाद result count announce नहीं होता" — 4.1.3 Status Messages।
  • "Header पर aria-hidden, focusable menu बटन को स्क्रीन रीडर से छिपा देता है" — 4.1.2 Name, Role, Value।
  • "Send बटन का aria-label Submit form है; वॉइस कमांड Click Send कुछ नहीं करती" — 2.5.3 Label in Name।
  • "कंपनी लोगो logo-final-v2.png के रूप में announce होता है" — 1.1.1 Non-text Content।

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

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

किस स्क्रीन रीडर से टेस्ट करूँ?

उन जोड़ियों से जो आपके यूज़र्स और कॉन्ट्रैक्ट का support baseline माँगते हैं। आम न्यूनतम है Windows की एक जोड़ी, जैसे Firefox या Chrome के साथ NVDA, और मोबाइल के लिए iOS पर VoiceOver व Android पर TalkBack। बाकी जोड़ियाँ रिलीज़ दर रिलीज़ बदलें।

क्या हर चीज़ पर aria-label लगाएँ?

नहीं। ज़्यादातर elements अपना नाम दिखने वाले टेक्स्ट या native labels से लेते हैं, जिससे स्क्रीन रीडर और देखने वाले यूज़र एक जैसी जानकारी पाते हैं। aria-label मुख्यतः बिना दिखने वाले टेक्स्ट के कंट्रोल, जैसे icon buttons, के लिए इस्तेमाल करें, और यह कभी दिखने वाले label के उलट न हो।

क्या पेज को accessible बनाने के लिए ARIA ज़रूरी है?

नहीं। दिखने वाले labels, असली headings और landmarks वाले native HTML elements से बना पेज बिना ARIA के भी काफ़ी हद तक accessible होता है। ARIA उन चीज़ों के लिए है जो HTML व्यक्त नहीं कर सकता, जैसे tabs, expanded states और live regions, और इसे किसी भी दूसरे कोड की तरह टेस्ट करना चाहिए।

मेरा live region कुछ announce क्यों नहीं करता?

आमतौर पर region अपने संदेश के साथ ही पेज में जोड़ा गया, या display: none से छिपा है, या टेक्स्ट बदला ही नहीं। पेज लोड पर ख़ाली region रेंडर करें और बाद में उसका टेक्स्ट अपडेट करें। जाँचें कि role (status या alert) संदेश के अनुरूप है।

क्या स्क्रीन रीडर अरबी और हिंदी पढ़ते हैं?

मुख्य स्क्रीन रीडर संबंधित भाषा की आवाज़ उपलब्ध होने पर अरबी और हिंदी बोल सकते हैं, और सही उच्चारण नियम लागू करने के लिए पेज के lang attribute पर निर्भर रहते हैं। जाँचें कि अरबी पेज lang="ar" और हिंदी पेज lang="hi" घोषित करें, अंदर के अंग्रेज़ी अंश चिह्नित हों, और नंबर व मिश्रित strings तार्किक क्रम में पढ़े जाएँ।

संदर्भ

  • Accessible Rich Internet Applications (WAI-ARIA) 1.2W3C · 2023W3C Recommendation जो ARIA roles, states और properties परिभाषित करती है — कस्टम विजेट अपना अर्थ सहायक तकनीक को कैसे बताते हैं।
  • ARIA Authoring Practices Guide (APG)W3C Web Accessibility Initiative (WAI)आम विजेट (tabs, menus, dialogs, comboboxes) के पैटर्न, अपेक्षित कीबोर्ड इंटरैक्शन और ARIA उपयोग के साथ — वह संदर्भ जिससे टेस्टर कस्टम कंपोनेंट की तुलना करते हैं।
  • Accessible Name and Description Computation 1.2W3C · 2026ब्राउज़र किसी एलिमेंट का accessible name और description लेबल, ARIA एट्रिब्यूट और कंटेंट से कैसे निकालते हैं (W3C Working Draft)।
  • Web Content Accessibility Guidelines (WCAG) 2.2W3C · 2024W3C की Recommendation जो सुलभ वेब कंटेंट के लिए टेस्ट करने योग्य success criteria तय करती है — चार सिद्धांतों और तीन conformance स्तरों (A, AA, AAA) में व्यवस्थित।
  • Understanding WCAG 2.2W3C Web Accessibility Initiative (WAI)WCAG 2.2 की हर guideline और success criterion की व्याख्या: उद्देश्य, किसे लाभ, उदाहरण और तकनीकें (नॉर्मेटिव नहीं)।
  • Accessibility — MDNMDN Web Docs (Mozilla)सुलभ वेब पेज बनाने और जाँचने की व्यावहारिक गाइड: सिमैंटिक HTML, ARIA, कीबोर्ड सपोर्ट और टेस्टिंग।
  • Accessibility — Human Interface GuidelinesAppleiOS और अन्य प्लेटफ़ॉर्म के लिए Apple की एक्सेसिबिलिटी डिज़ाइन गाइडेंस: VoiceOver, Dynamic Type, कंट्रास्ट, टच टारगेट और मोशन।
  • Test your app's accessibilityAndroid Developers (Google)Android ऐप की एक्सेसिबिलिटी को TalkBack जैसी सेवाओं से मैन्युअली और प्लेटफ़ॉर्म के टेस्टिंग टूल से ऑटोमेटेड तरीके से कैसे जाँचें।

अभ्यास

सर्च रिज़ल्ट पेज के स्क्रीन रीडर सेशन की समीक्षा करें

आपका काम

आप Dawa नाम के online pharmacy web app (काल्पनिक) का English UI टेस्ट करते हैं। आपके साथी उमर ने search results पेज पर गाइड का टेस्ट रूटीन एक जोड़ी — Firefox के साथ NVDA — पर चलाया और जो सुना उसे हूबहू लिखा। Bugs दर्ज करने से पहले आप उसके log की तुलना पेज के markup से करते हैं। नीचे के material में scope में आने वाला काम, markup का एक अंश, scripts क्या करती हैं, और log है। Announcements अंग्रेज़ी में उद्धृत हैं, क्योंकि टेस्ट हो रहा पेज English UI है।

गाइड के name computation क्रम, उसके टेस्ट केस SR-01 से SR-12 और उसमें दिए WCAG 2.2 criteria के साथ काग़ज़ पर काम करें। हर row failure नहीं है, और हर समस्या WCAG failure नहीं है: बताएँ कौन-सी क्या है। अगर आपके पास NVDA या VoiceOver है, तो अंश को local HTML फ़ाइल के रूप में सेव करके names और roles ख़ुद सुन सकते हैं; शब्द अलग होंगे, findings नहीं। इसके लिए 30–45 मिनट रखें।

सामग्री
Dawa - online pharmacy web app (काल्पनिक)। English UI; Arabic UI भी है।
टेस्ट हो रहा पेज: search results, staging build 3.8.0, single-page application।
पेज में सिर्फ़ header और main कंटेंट है: न navigation menu, न footer, न dialog।
Scope में काम: "vitamin D" के results में 1000 IU का filter लगाएँ और पहले product
का एक pack cart में जोड़ें।
जोड़ी: Windows 11 पर Firefox के साथ NVDA (टेस्टर ने वर्ज़न नहीं लिखे)।
Announcements गाइड की तरह name, role, state के रूप में लिखे हैं; असली शब्द और
क्रम स्क्रीन रीडर और वर्ज़न के हिसाब से बदलते हैं।

Markup का अंश (एक product card दिखाया है; बाक़ी 11 उसी template से बने हैं)

<html lang="ar">
<head><title>Dawa</title></head>
<body>
  <header>
    <a href="/"><img src="/img/logo.svg" alt="Dawa home"></a>
    <button class="icon" onclick="openSearch()"><svg class="i-search"></svg></button>
  </header>
  <main>
    <h1>Results for vitamin D</h1>
    <p id="count">12 products</p>
    <div class="toggle" role="button" tabindex="0" aria-expanded="false"
         onclick="toggleFilters()">Filters</div>
    <div id="filters" hidden>
      <label><input type="checkbox" onchange="applyFilter()"> 1000 IU</label>
    </div>
    <ul class="products">
      <li>
        <img src="/p/IMG_4021.jpg" alt="IMG_4021.jpg">
        <div class="card-title">Vitamin D3 1000 IU, 60 tablets</div>
        <p>SAR 39.00</p>
        <a href="/p/4021">Details</a>
        <button aria-label="Buy now" onclick="addToCart(4021)">Add to cart</button>
      </li>
    </ul>
  </main>
</body>
</html>

Scripts क्या करती हैं (developer के अनुसार)
  toggleFilters()  #filters दिखाती या छिपाती है; और कुछ नहीं बदलती
  applyFilter()    list दोबारा लोड करती है और #count का टेक्स्ट बदलती है,
                   जैसे "4 products"
  addToCart(id)    सफल होने पर यह element body में जोड़ती है, 3 सेकंड बाद हटाती है:
                   <div class="toast" role="status">Added to cart</div>
Screen पर product name (.card-title) बड़ा और bold है और heading जैसा दिखता है।

Session log (टेस्टर: उमर)
1  पेज लोड करें: home पेज से results खोले, फिर NVDA+T (टाइटल पढ़ें)।
   सुना: "Dawa" और ब्राउज़र का नाम। उसके बाद का अंग्रेज़ी टेक्स्ट अरबी आवाज़ में
   पढ़ा जाता है और समझना मुश्किल है।
2  Headings सूची: NVDA+F7, Headings। एक item: "Results for vitamin D", level 1।
3  Landmarks: D, फिर D। सुना: "banner landmark", "main landmark"।
4  Links सूची: NVDA+F7, Links। सुना: "Dawa home", फिर 12 बार "Details"।
5  क्रम से पढ़ें: पहले card में Down Arrow। सुना: "list, 12 items",
   "IMG_4021.jpg, graphic", "Vitamin D3 1000 IU, 60 tablets",
   "SAR 39.00", "Details, link", "Buy now, button"।
6  कंट्रोल चलाएँ: search icon पर Tab। सुना: "button"।
   Filters पर Tab। सुना: "Filters, button, collapsed"।
   Enter: filter panel screen पर खुलता है।
   Shift+Tab, फिर Tab। सुना: "Filters, button, collapsed"।
7  Dynamic बदलाव: 1000 IU checkbox पर Space। सुना: "1000 IU, checkbox, checked"।
   Screen पर count "4 products" हो जाता है; और कुछ नहीं सुना।
8  Dynamic बदलाव: पहले card में "Buy now" पर Enter। Screen पर 3 सेकंड तक
   "Added to cart"। कुछ नहीं सुना, इसलिए उमर ने फिर Enter दबाया।
9  पूरा काम करें: cart पेज: "Vitamin D3 1000 IU, 60 tablets" x 2।
   उमर का note: "किसी भी चीज़ से पता नहीं चला कि यह हो गया।"
चरण
  1. Log पढ़ने से पहले, सिर्फ़ markup से लिखें कि हर image और कंट्रोल क्या उजागर करता है — name, role और state: logo link, search icon, खोलने से पहले और बाद में Filters, product image, Details और Add to cart। गाइड का name क्रम इस्तेमाल करें: aria-labelledby, aria-label, native label, content, fallbacks।
  2. Log की तुलना अपनी predictions से row दर row करें। हर row के लिए लिखें: pass या fail, संबंधित SR टेस्ट केस, लागू हो तो WCAG 2.2 success criterion, markup में कारण, और अपेक्षित announcement।
  3. हर failure के लिए गाइड की शैली में बग टाइटल लिखें, और search icon के लिए पूरी report body: वर्ज़न सहित जोड़ी, steps, क्या सुना और क्या अपेक्षित था।
  4. Scope वाले काम के लिए SR-12 का फ़ैसला करें, और वे findings बताएँ जिनसे काम fail होता है या ग़लत नतीजे पर ख़त्म होता है।
  5. लिखें कि bugs दर्ज करने से पहले क्या जोड़ना या जाँचना ज़रूरी है, और आगे क्या टेस्ट करना है।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

Markup से predictions। Logo link: नाम image के alt से आता है, इसलिए "Dawa home, link"। Search icon: ऐसा button जिसमें सिर्फ़ एक svg है, न aria-labelledby, न aria-label, न टेक्स्ट, न title, इसलिए उसका कोई नाम नहीं और वह सिर्फ़ "button" announce होता है। Filters: "Filters, button, collapsed", और यह collapsed ही रहता है, क्योंकि toggleFilters() कभी aria-expanded नहीं बदलती। Product image: alt फ़ाइल का नाम है, इसलिए "IMG_4021.jpg, graphic"। Product का नाम: सादा टेक्स्ट, heading नहीं। Details: "Details, link", सभी बारह cards पर एक जैसा। Add to cart: name क्रम में aria-label content से पहले आता है, इसलिए नाम "Buy now" है, दिखने वाला "Add to cart" नहीं। Result count और toast: टेक्स्ट बदलने से पहले पेज में कोई live region नहीं है, इसलिए कुछ announce नहीं होता। उमर का log हर prediction से मेल खाता है। इसीलिए गाइड कहती है कि सुनने से पहले accessibility pane में computed name, role और states देखें: markup बताता है कि आप क्या सुनेंगे।

Row 1 में दो failures हैं। SR-01 fail, 2.4.2 Page Titled: home पेज से खोले गए results view पर भी app shell का टाइटल "Dawa" ही है, जो साइट का नाम बताता है, view का नहीं; अपेक्षित है view का नाम बताने वाला टाइटल, जैसे "Results for vitamin D - Dawa", जो हर route change पर सेट हो। SR-02 fail, 3.1.1 Language of Page: English UI lang="ar" घोषित करता है, इसलिए NVDA अंग्रेज़ी टेक्स्ट अरबी आवाज़ में पढ़ता है; अपेक्षित है English UI पर lang="en" और Arabic UI पर lang="ar", जो यूज़र के भाषा बदलने पर अपडेट हो। दोनों app shell से आते हैं, इसलिए संभवतः हर view पर असर डालते हैं और एक ही जगह ठीक होते हैं।

Rows 2 से 4। Row 2: SR-03 fail, 1.3.1 Info and Relationships: product names headings जैसे दिखते हैं लेकिन div elements हैं, इसलिए headings सूची में सिर्फ़ h1 है; अपेक्षित है h1 और उसके बाद बारह product names, level 2 headings के रूप में। Row 3: SR-04 pass — पेज में सिर्फ़ header और main कंटेंट है, दोनों landmarks हैं, और कोई landmark प्रकार दो बार नहीं आता, इसलिए किसी को label की ज़रूरत नहीं। Row 4: "Dawa home" SR-05 pass करता है। बारह बार "Details" judgement का मामला है। हर link उसी list item में है जिसमें उसका product name है, और यह programmatically determined context है, इसलिए 2.4.4 Link Purpose (In Context), जो level A का criterion है, पूरा होता है; सिर्फ़ अपने टेक्स्ट से साफ़ links केवल 2.4.9 Link Purpose (Link Only), level AAA, माँगता है। जब तक आपके लक्ष्य में AAA शामिल न हो, इसे WCAG failure नहीं, improvement के रूप में दर्ज करें, क्योंकि links सूची product चुनने के लिए फिर भी बेकार है, और ऐसा नाम सुझाएँ जो दिखने वाले टेक्स्ट से शुरू हो, जैसे "Details: Vitamin D3 1000 IU, 60 tablets"। ऐसे context के बिना बारह "Read more" links, जैसा गाइड के उदाहरण में है, 2.4.4 फ़ेल करेंगे।

Row 5: list अपने 12 items के साथ, product name और price क्रम से पढ़े जाते हैं — pass। Image SR-07 फ़ेल करती है, 1.1.1 Non-text Content: फ़ाइल का नाम text alternative नहीं है। अपेक्षित है ऐसा alt जो image का उद्देश्य पूरा करे, जैसे "Vitamin D3 1000 IU, 60 tablets, pack", या alt="" अगर टीम तय करे कि image बगल के product name को ही दोहराती है। दोनों स्वीकार्य हैं; फ़ाइल का नाम कभी नहीं। यह card template में एक defect है, बारह नहीं। Row 5 के बाक़ी दो announcements, "Details, link" और "Buy now, button", row 4 में और नीचे Add to cart वाले हिस्से में कवर हैं।

Row 6। Search icon SR-06 फ़ेल करता है, 4.1.2 Name, Role, Value: अपेक्षित "Search, button", जैसे aria-label="Search" या visually hidden टेक्स्ट से; header हर पेज पर है, इसलिए हर पेज प्रभावित है। Filters SR-08 और यही criterion फ़ेल करता है: panel खुलता है लेकिन state "collapsed" ही रहती है; अपेक्षित है खोलने के बाद "Filters, button, expanded" और बंद करने के बाद "collapsed"। Markup एक दूसरा जोखिम भी दिखाता है: role="button" और सिर्फ़ onclick वाले div में key handling नहीं है, क्योंकि ARIA roles व्यवहार नहीं जोड़ते। Browse mode में NVDA element को click भेजकर चला सकता है, इसलिए toggle स्क्रीन रीडर के साथ चल सकता है और फिर भी कीबोर्ड यूज़र्स के लिए फ़ेल हो सकता है। स्क्रीन रीडर बंद करके दोहराएँ; अगर Enter और Space कुछ नहीं करते, तो 2.1.1 Keyboard के तहत अलग defect दर्ज करें, जैसा कीबोर्ड accessibility गाइड बताती है। एक fix दोनों को ठीक करता है: native button element जिसका aria-expanded script अपडेट करे — first rule of ARIA use।

Add to cart (rows 5 और 8) SR-06 फ़ेल करता है, 2.5.3 Label in Name: दिखने वाला label "Add to cart" है लेकिन नाम "Buy now", क्योंकि aria-label बटन के टेक्स्ट की जगह ले लेता है। वॉइस कंट्रोल यूज़र "Click Add to cart" बोले तो कोई match नहीं मिलता, और स्क्रीन रीडर यूज़र ऐसा action सुनता है जो तुरंत ख़रीदारी जैसा लगता है। अपेक्षित है दिखने वाले label से शुरू होने वाला नाम: कम से कम "Add to cart, button", या "Add to cart: Vitamin D3 1000 IU, 60 tablets, button", जो बारह बटनों को अलग भी करता है।

Rows 7 और 8 दो अलग कारणों से SR-09 फ़ेल करते हैं, 4.1.3 Status Messages। Checkbox ख़ुद pass है ("1000 IU, checkbox, checked"), लेकिन count एक सादा paragraph है जिसका कोई status role नहीं, इसलिए उसका बदलाव कभी announce नहीं होता; अपेक्षित है कि फ़ोकस checkbox पर रहते हुए "4 products" polite तरीके से announce हो, जैसे count को पेज लोड से ही role="status" देकर। Toast पर role="status" है, लेकिन script region और उसका टेक्स्ट एक ही पल में जोड़ती है, इसलिए यह भरोसे से announce नहीं होता; अपेक्षित है कि फ़ोकस बटन पर रहते हुए "Added to cart" polite तरीके से announce हो — पेज लोड से एक ख़ाली status region रखकर और संदेश उसमें लिखकर।

Row 9: SR-12 को fail दर्ज करें। Product जुड़ सकता है, लेकिन कुछ भी इसकी पुष्टि नहीं करता, इसलिए उमर ने उसे दो बार जोड़ा और ग़लत quantity सिर्फ़ cart पेज पर दिखी; पेज पर भरोसा करने वाला यूज़र दो pack ऑर्डर करेगा। इसके पीछे के findings: चुप toast, "Buy now" नाम जो बटन का असर अस्पष्ट बनाता है, और काम में उससे पहले चुप result count और ग़लत Filters state। बिना नाम का search icon इस काम के रास्ते में नहीं है, लेकिन यह स्क्रीन रीडर यूज़र को इस पेज से नई search शुरू करने से रोकता है।

बग टाइटल: (1) "Header का search icon बटन बिना नाम के button के रूप में announce होता है" — 4.1.2। (2) "Add to cart बटन Buy now के रूप में announce होते हैं" — 2.5.3। (3) "Added to cart संदेश announce नहीं होता; यूज़र product दो बार जोड़ते हैं" — 4.1.3। (4) "Filter लगाने के बाद result count announce नहीं होता" — 4.1.3। (5) "Panel खुलने के बाद भी Filters toggle collapsed announce होता है" — 4.1.2। (6) "Product names styled div elements हैं; headings सूची में सिर्फ़ h1 है" — 1.3.1। (7) "Product images फ़ाइल नाम से announce होती हैं, जैसे IMG_4021.jpg" — 1.1.1। (8) "English UI lang="ar" घोषित करता है; NVDA अंग्रेज़ी टेक्स्ट अरबी आवाज़ में पढ़ता है" — 3.1.1। (9) "Search results view पर पेज टाइटल Dawa ही रहता है" — 2.4.2। Improvement: "Product cards के Details links, links सूची में अलग नहीं पहचाने जा सकते"। कीबोर्ड जाँच के बाद, अगर पुष्टि हो: "Filters toggle, Enter या Space पर प्रतिक्रिया नहीं देता" — 2.1.1।

(1) के लिए report body। Environment: Windows 11 (वर्ज़न) पर Firefox (वर्ज़न) के साथ NVDA (वर्ज़न), staging build 3.8.0। Steps: vitamin D का results पेज खोलें; Tab दबाते रहें जब तक फ़ोकस header के search icon पर न पहुँचे। सुना: "button"। अपेक्षित: "Search, button" (SR-06, 4.1.2 Name, Role, Value)। सबूत: accessibility pane role button और ख़ाली नाम दिखाता है। Scope: header हर पेज पर है।

दर्ज करने से पहले: NVDA, Firefox और Windows के वे वर्ज़न जोड़ें जो log में नहीं हैं, क्योंकि वर्ज़न बदलने पर व्यवहार बदलता है; हर computed name accessibility pane में पक्का करें; (8) और (9) का दायरा पक्का करने के लिए किसी और view, जैसे home पेज, पर टाइटल और भाषा जाँचें; और Filters toggle की सिर्फ़ कीबोर्ड वाली जाँच करें। आगे: support baseline की दूसरी जोड़ियों पर रूटीन दोहराएँ, जैसे mobile web के लिए iOS पर Safari के साथ VoiceOver और Android पर Chrome के साथ TalkBack, और Arabic UI पर, जहाँ lang="ar" सही है और आप जाँचते हैं कि अरबी टेक्स्ट अरबी आवाज़ में पढ़ा जाता है और prices व मिश्रित अरबी-अंग्रेज़ी strings तार्किक क्रम में पढ़ी जाती हैं। Fixes के बाद: उसी जोड़ी पर हर defect की confirmation testing, और header व product card इस्तेमाल करने वाले दूसरे पेजों की regression testing।

अगर आपके जवाब अलग हैं, तो हर finding को चार हिस्सों पर जाँचें: क्या सुना, क्या अपेक्षित था, markup में कारण, और criterion। स्वीकार्य अंतर: product image के लिए वर्णन वाले alt की जगह alt="", या SR-12 के लिए "pass with findings" अगर आपकी टीम यह नतीजा इस्तेमाल करती है, बशर्ते दो बार जुड़ने की बात रिपोर्ट में हो। दो जवाब यहाँ सही नहीं हैं: "Details" को 2.4.4 failure दर्ज करना, क्योंकि list item context देता है, और उसके बारे में कुछ भी दर्ज न करना, क्योंकि links सूची इस्तेमाल करने वाले यूज़र अब भी links में फ़र्क़ नहीं कर पाते।

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

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

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

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

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

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

बग विश्लेषण AI

मोटे-मोटे नोट्स को पूरी बग रिपोर्ट में बदलें: reproduce करने के स्टेप, अपेक्षित बनाम वास्तविक, environment, गंभीरता और attachments चेकलिस्ट।

बग विश्लेषण AI

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

और गाइड

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

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

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

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

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

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 मिनट पढ़ने का समय
ऑटोमेशन

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

Automated एक्सेसिबिलिटी checks क्या तय कर सकते हैं और क्या नहीं, ACT rules, आम engines, unit, E2E और CI में checks, triage, baselines और WCAG-EM।

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

एंड-टू-एंड प्रोडक्ट क्वालिटी एश्योरेंस

एंड-टू-एंड QA में क्या आता है — आवश्यकता समीक्षा, टेस्ट डिज़ाइन, फ़ंक्शनल, API, परफ़ॉर्मेंस और सुरक्षा टेस्टिंग, रिलीज़ गेट और मेट्रिक्स — और इसे कैसे चलाएँ।

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