कीबोर्ड एक्सेसिबिलिटी टेस्टिंग
कीबोर्ड एक्सेसिबिलिटी टेस्टिंग यह जाँचती है कि पेज या ऐप का हर फ़ंक्शन माउस या टच के बिना पहुँचा और चलाया जा सकता है, यूज़र को हमेशा पता रहता है कि फ़ोकस कहाँ है, और फ़ोकस तार्किक क्रम में चलता है। यह सबसे तेज़ और ऊँची वैल्यू वाली एक्सेसिबिलिटी जाँच है जो टेस्टर कर सकता है — बस एक कीबोर्ड और अनुशासन चाहिए — और यह ऐसे डिफ़ेक्ट पकड़ती है जो स्क्रीन रीडर, switch और वॉइस कंट्रोल के इस्तेमाल को भी तोड़ते हैं।
यह गाइड संबंधित WCAG 2.2 success criteria बताती है, कीबोर्ड टेस्ट सेशन चलाना दिखाती है, focus order, visible और unobscured focus, keyboard traps और bypass blocks समझाती है, ARIA Authoring Practices Guide से आम custom widgets की अपेक्षित keys देती है, और अंत में टेस्ट केस चेकलिस्ट, डिफ़ेक्ट उदाहरण और automate हो सकने वाली चीज़ें बताती है।
कीबोर्ड पर कौन निर्भर है और कौन-से criteria लागू होते हैं
बहुत से लोग कभी माउस इस्तेमाल नहीं करते: दृष्टिहीन यूज़र कीबोर्ड से चलने वाले स्क्रीन रीडर से नेविगेट करते हैं; कंपन या सीमित हाथ की गतिविधि वाले लोग कीबोर्ड, switch device या keystrokes की नकल करने वाला वॉइस कंट्रोल इस्तेमाल करते हैं; कुछ लोग बस इसे पसंद करते हैं। फ़ोन और टैबलेट पर external keyboard और switch access भी यही focus मॉडल इस्तेमाल करते हैं। अगर किसी चीज़ तक कीबोर्ड से पहुँचा नहीं जा सकता, तो ये सभी यूज़र उससे वंचित रह जाते हैं।
ये WCAG 2.2 success criteria कीबोर्ड टेस्ट का मूल हैं:
- 2.1.1 Keyboard (A) — सारी functionality कीबोर्ड इंटरफ़ेस से चलाई जा सके, अलग-अलग keystrokes के लिए ख़ास timing की ज़रूरत के बिना (freehand drawing जैसे path पर निर्भर इनपुट अपवाद हैं)।
- 2.1.2 No Keyboard Trap (A) — अगर कीबोर्ड से फ़ोकस किसी कंपोनेंट में जा सकता है, तो कीबोर्ड से बाहर भी आ सके; अगर कोई non-standard key चाहिए, तो यूज़र को बताया जाए।
- 2.1.4 Character Key Shortcuts (A) — एक अक्षर वाले shortcuts बंद या remap किए जा सकें, या सिर्फ़ तब काम करें जब संबंधित कंपोनेंट पर फ़ोकस हो।
- 2.4.1 Bypass Blocks (A) — कई पेजों पर दोहराए जाने वाले blocks को छोड़ने का तरीका हो, जैसे skip link।
- 2.4.3 Focus Order (A) — फ़ोकस ऐसे क्रम में चले जो अर्थ और operability बनाए रखे।
- 2.4.7 Focus Visible (AA) — कीबोर्ड फ़ोकस का दिखने वाला indicator हो।
- 2.4.11 Focus Not Obscured (Minimum) (AA) — फ़ोकस वाला कंपोनेंट sticky header या banner जैसे author के बनाए कंटेंट से पूरी तरह न छिपे।
- 3.2.1 On Focus (A) — सिर्फ़ फ़ोकस मिलने से context न बदले।
- संबंधित: tooltips और popovers के लिए 1.4.13 Content on Hover or Focus (AA), और AAA criteria 2.1.3 Keyboard (No Exception), 2.4.12 Focus Not Obscured (Enhanced) और 2.4.13 Focus Appearance।
कीबोर्ड टेस्ट सेशन कैसे चलाएँ
माउस को पहुँच से दूर रखें और फ़ोकस ब्राउज़र के address bar में रखकर शुरू करें, ताकि पहला Tab पेज के पहले element पर जाए। पेज पर दोनों दिशाओं में चलें और हर कंट्रोल चलाएँ। ज़रूरी keys:
- Tab और Shift+Tab — अगले और पिछले focusable element पर जाना।
- Enter — links और buttons चलाना, फ़ॉर्म सबमिट करना। Space — buttons चलाना, checkbox टॉगल करना, कुछ selects खोलना।
- Arrow keys — composite widgets के अंदर चलना: radio groups, tabs, menus, listboxes, sliders, grids।
- Escape — dialogs, menus, popovers और tooltips बंद करना।
- Home, End, Page Up, Page Down — lists, sliders और लंबे widgets में कूदना, जहाँ pattern इन्हें परिभाषित करता है।
Focus order, visible focus और focus not obscured
Focus order लेआउट के reading order का पालन करे: left-to-right पेज में ऊपर-बाएँ से नीचे-दाएँ, अरबी right-to-left पेज में ऊपर-दाएँ से। क्रम तब टूटता है जब DOM order दृश्य क्रम से अलग हो (CSS grid या flex से reordering, absolutely positioned panels) या जब authors positive tabindex इस्तेमाल करें, जो elements को बाकी सब से आगे खींच लेता है। tabindex="0" custom कंट्रोल को स्वाभाविक क्रम में जोड़ता है और tabindex="-1" element को सिर्फ़ script से focusable बनाता है; positive values लगभग हमेशा डिफ़ेक्ट होती हैं।
Left-to-right पेज: dir="ltr"
ऊपर-बाएँ से नीचे-दाएँ।
- Address bar से पहला Tab:
- Skip link, ऊपर-बाएँ
अरबी right-to-left पेज: dir="rtl"
वही DOM order, mirrored: ऊपर-दाएँ से शुरू।
- Address bar से पहला Tab:
- Skip link, ऊपर-दाएँ
डिफ़ेक्ट: positive tabindexफ़ेल
फ़ील्ड बाकी सब से आगे खिंच जाता है: 2.4.3 Focus Order फ़ेल।
- Address bar से पहला Tab:
- Footer का newsletter फ़ील्ड, skip link और header से पहले
उदाहरण के लिए पेज। नंबर Tab stops हैं; heading पर नंबर नहीं, क्योंकि कोई non-interactive element Tab stop नहीं होता; देखें KB-03।
Focus indicator हर focusable element पर और हर background पर दिखना चाहिए। Failure का सबसे आम कारण global "outline: none" है जिसका कोई replacement style नहीं। टेक्स्ट के अंदर links, रंगीन banners में buttons, cards और डार्क footer में inputs जाँचें। WCAG 2.2 AA सिर्फ़ इतना माँगता है कि indicator दिखे; AAA criterion 2.4.13 Focus Appearance आकार और कंट्रास्ट की requirements जोड़ता है, जो अच्छा डिज़ाइन लक्ष्य है।
अंत में जाँचें कि फ़ोकस कभी पूरी तरह न छिपे। Sticky headers और footers, cookie banners, chat launchers और bottom sheets पेज scroll होने पर अक्सर फ़ोकस वाले element को ढक देते हैं, जो 2.4.11 Focus Not Obscured (Minimum) फ़ेल करता है। लंबे पेजों पर सभी sticky elements के साथ Tab करें, 200% ज़ूम पर भी, जहाँ वे viewport का ज़्यादा हिस्सा ढकते हैं।
Keyboard traps और bypass blocks
Keyboard trap वह जगह है जहाँ फ़ोकस जा तो सकता है पर निकल नहीं सकता। आम संदिग्ध हैं: iframes में embedded third-party कंटेंट (maps, video players, payment fields), Tab को indentation के लिए पकड़ने वाले rich-text editors, custom date pickers, और dialogs की focus-management scripts जो dialog बंद होने के बाद भी फ़ोकस वापस खींचती रहती हैं। हर एक में Tab से जाएँ, फिर Tab, Shift+Tab और Escape से निकलने की कोशिश करें। अगर निकलने के लिए कुछ असामान्य चाहिए, तो कंपोनेंट को यूज़र को बताना होगा कि कैसे।
Bypass blocks संभावना नहीं, मेहनत के बारे में है। अगर कीबोर्ड यूज़र को हर पेज पर navigation पार करने के लिए चालीस बार Tab दबाना पड़े, तो पेज operable हो सकता है पर usable नहीं। WCAG 2.4.1 दोहराए जाने वाले blocks को छोड़ने का तरीका माँगता है। पहले focusable element के रूप में "Skip to main content" link कीबोर्ड यूज़र्स के लिए सबसे सीधा तरीका है; landmarks और headings स्क्रीन रीडर यूज़र्स की भी मदद करते हैं। जाँचें कि skip link फ़ोकस पर दिखता है, और उसे चलाने से सच में फ़ोकस हिलता है — सिर्फ़ scroll position नहीं — ताकि अगला Tab main content के पहले कंट्रोल पर जाए।
Custom widgets और अपेक्षित key patterns
Native HTML कंट्रोल — button, href वाला a, input, select, textarea, details — में कीबोर्ड व्यवहार पहले से होता है। div और span से बने custom widgets में कुछ नहीं होता जब तक डेवलपर न जोड़ें, और ARIA roles भी इसे नहीं जोड़ते। W3C का ARIA Authoring Practices Guide (APG) हर आम pattern के लिए वह कीबोर्ड interaction बताता है जिसकी यूज़र अपेक्षा करते हैं; इसे अपने टेस्ट केस में expected result के रूप में इस्तेमाल करें। Composite widgets में पूरा widget आमतौर पर एक Tab stop होता है और arrow keys उसके अंदर चलती हैं।
- Button — Enter और Space से चलता है। सिर्फ़ click पर प्रतिक्रिया देने वाला div फ़ेल है।
- Checkbox — Space टॉगल करता है। Radio group — Tab चुने हुए विकल्प पर group में प्रवेश करता है; arrow keys चलती और चुनती हैं।
- Tabs — Tab फ़ोकस को tab list में active tab पर ले जाता है; Left और Right arrows tabs के बीच चलते हैं; फिर Tab panel में जाता है।
- Menu button — Enter या Space मेन्यू खोलकर पहले item पर फ़ोकस करता है (Down Arrow भी खोल सकता है); arrows चलते हैं; Escape बंद करके फ़ोकस button पर लौटाता है।
- Combobox और listbox — Down Arrow विकल्प खोलता या उनमें चलता है; Enter चुनता है; Escape popup बंद करता है।
- Slider — arrow keys वैल्यू एक step बदलती हैं; Home और End न्यूनतम और अधिकतम पर ले जाते हैं।
- Right-to-left लेआउट — APG horizontal arrow keys का काम (अगले tab या slider की ज़्यादा वैल्यू के लिए Right Arrow) बताता है, पर right-to-left लेआउट की बात नहीं करता, इसलिए RTL के लिए अलग नियम तय नहीं करता। Mirrored अरबी लेआउट में यह टॉपिक (एक्सेसिबिलिटी टेस्टिंग पिलर और RTL टेस्टिंग गाइड देखें) यही expected result मानता है कि horizontal arrows दृश्य दिशा का पालन करें: अगला tab बाईं ओर होता है, इसलिए Left Arrow उस पर जाता है, और जिस mirrored slider का न्यूनतम मान दाईं ओर है उसमें Left Arrow वैल्यू बढ़ाता है। Up और Down Arrow, Home और End का अर्थ नहीं बदलता। यह नियम design specification में लिखें और जाँचें कि हर widget इसे एक ही तरह लागू करे।
- Disclosure और accordion — Enter या Space सेक्शन खोलता और बंद करता है।
- Dialog (modal) — Tab और Shift+Tab dialog के अंदर रहते हैं; Escape उसे बंद करता है।
Modal dialogs, menus और dynamic कंटेंट
ज़्यादातर single-page applications focus management में ही फ़ेल होती हैं। Modal dialog खुलने पर फ़ोकस उसके अंदर जाना चाहिए — पहले फ़ील्ड पर, पहले actionable element पर, या लंबे कंटेंट में dialog heading पर। खुले रहने तक Tab dialog के अंदर घूमे और पीछे का पेज पहुँच से बाहर रहे। बंद होने पर फ़ोकस उसी element पर लौटना चाहिए जिसने उसे खोला था, ताकि यूज़र वहीं से आगे बढ़े। showModal() से खुलने वाला native dialog element इसका बड़ा हिस्सा सँभालता है; custom dialogs को यह script में करना होता है।
यही नियम यूज़र के हर बदलाव पर लागू करें: row delete करने के बाद फ़ोकस पड़ोसी row या status message पर जाए, डॉक्यूमेंट के शुरू में नहीं; client-side route change के बाद फ़ोकस नए पेज की heading या main region पर जाए; कीबोर्ड से खुले menus और popovers Escape से बंद हों और फ़ोकस अपने trigger पर लौटाएँ। Hover पर दिखने वाला कंटेंट कीबोर्ड फ़ोकस पर भी दिखे और फ़ोकस हिलाए बिना बंद किया जा सके (1.4.13 Content on Hover or Focus)।
कीबोर्ड टेस्ट केस
Scope में हर पेज प्रकार और हर complete process के लिए इन्हें चलाएँ। हर लाइन अपने expected result के साथ एक टेस्ट केस है; failures को success criterion के साथ दर्ज करें।
- KB-01 — Address bar से पहला Tab ऐसे skip link पर जाता है जो फ़ोकस पर दिखने लगता है।
- KB-02 — Skip link चलाने पर फ़ोकस main पर जाता है; अगला Tab main के पहले कंट्रोल तक पहुँचता है।
- KB-03 — Tab हर interactive element तक पहुँचता है; कोई non-interactive element Tab stop नहीं है।
- KB-04 — Shift+Tab क्रम को ठीक उल्टा चलाता है।
- KB-05 — Focus order reading order से मेल खाता है (LTR और RTL दोनों लेआउट जाँचें)।
- KB-06 — हर stop पर और हर background पर focus indicator दिखता है।
- KB-07 — कोई फ़ोकस वाला element sticky header, footer, cookie banner या chat widget से पूरी तरह नहीं छिपता।
- KB-08 — Buttons Enter और Space से चलते हैं; links Enter से।
- KB-09 — Custom widgets APG keys का पालन करते हैं (tabs: arrows; menu: Enter/Space, Esc; slider: arrows, Home/End)।
- KB-10 — Modal: खुलने पर फ़ोकस अंदर जाता है, Tab अंदर ही घूमता है, Esc बंद करता है, और फ़ोकस trigger पर लौटता है।
- KB-11 — कोई trap नहीं: फ़ोकस हर widget, iframe, video player और editor से बाहर आ सकता है।
- KB-12 — Hover पर दिखने वाले tooltips और popovers फ़ोकस पर भी दिखते हैं और Esc से बंद होते हैं।
- KB-13 — सिर्फ़ फ़ोकस से कभी submit, navigation या context change नहीं होता।
- KB-14 — एक-key shortcuts बंद या remap किए जा सकते हैं, या सिर्फ़ तब चलते हैं जब कंपोनेंट पर फ़ोकस हो।
- KB-15 — Delete, add या route change के बाद फ़ोकस किसी समझदार element पर जाता है, document body पर नहीं।
- KB-16 — हर complete process (जैसे checkout) सिर्फ़ कीबोर्ड से पूरा हो सकता है।
KB-01 First Tab from the address bar lands on a skip link that becomes visible on focus
KB-02 Activating the skip link moves focus to main; next Tab reaches the first control in main
KB-03 Tab reaches every interactive element; nothing non-interactive is a Tab stop
KB-04 Shift+Tab reverses the order exactly
KB-05 Focus order matches the reading order (check LTR and RTL layouts)
KB-06 Focus indicator visible on every stop, on every background
KB-07 No focused element is fully hidden by sticky header, footer, cookie banner or chat widget
KB-08 Buttons activate with Enter and Space; links with Enter
KB-09 Custom widgets follow APG keys (tabs: arrows; menu: Enter/Space, Esc; slider: arrows, Home/End)
KB-10 Modal: focus moves in on open, Tab cycles inside, Esc closes, focus returns to the trigger
KB-11 No trap: focus can leave every widget, iframe, video player and editor
KB-12 Tooltips and popovers shown on hover also show on focus and close with Esc
KB-13 Focus alone never submits, navigates or changes context
KB-14 Single-key shortcuts can be turned off or remapped, or work only when the component has focus
KB-15 After delete, add or route change, focus lands on a sensible element, not the document body
KB-16 Each complete process (e.g. checkout) can be finished with the keyboard onlyडिफ़ेक्ट के उदाहरण
बग टाइटल के रूप में, हर एक किस criterion को फ़ेल करता है उसके साथ। रिपोर्ट में ब्राउज़र, सटीक key sequence और फ़ोकस कहाँ पहुँचा, यह लिखें।
- "Date picker arrow keys से नहीं चलता; तारीख़ सिर्फ़ माउस से चुनी जा सकती है" — 2.1.1 Keyboard।
- "Custom Accept terms checkbox (div) Space से टॉगल नहीं होता" — 2.1.1 Keyboard।
- "Branches पेज पर embedded map iframe में Tab फ़ोकस अटक जाता है" — 2.1.2 No Keyboard Trap।
- "न skip link, न landmarks; search results तक पहुँचने में 42 बार Tab" — 2.4.1 Bypass Blocks।
- "Newsletter फ़ील्ड पर positive tabindex से पहला Tab skip link और header से पहले सीधे footer पर जाता है" — 2.4.3 Focus Order।
- "Filters drawer बंद करने के बाद फ़ोकस डॉक्यूमेंट की शुरुआत पर चला जाता है" — 2.4.3 Focus Order।
- "सभी links से focus ring हटाया गया (outline: 0), कोई विकल्प नहीं" — 2.4.7 Focus Visible।
- "200% ज़ूम पर sticky cookie banner फ़ोकस वाले Pay now बटन को ढक देता है" — 2.4.11 Focus Not Obscured (Minimum)।
- "Language selector पर फ़ोकस होते ही पेज अरबी में reload हो जाता है" — 3.2.1 On Focus।
क्या automate किया जा सकता है
Rule engines कुछ कीबोर्ड समस्याएँ static रूप से पकड़ते हैं — positive tabindex, focusable न होने वाले interactive roles, कीबोर्ड access के बिना scrollable regions — लेकिन क्रम या visibility का फ़ैसला नहीं कर सकते। Browser automation इस कमी का हिस्सा भरता है: Playwright, Cypress या Selenium टेस्ट keys दबाकर assert कर सकता है कि फ़ोकस किस element पर है, जिससे dialogs और route changes में focus-management regressions पकड़ना सस्ता हो जाता है। क्रम, visibility और छिपे फ़ोकस के लिए मैनुअल पास रखें, इन्हें आँखें चाहिए।
test("edit address dialog returns focus to its trigger", async ({ page }) => {
await page.goto("/account/addresses");
const edit = page.getByRole("button", { name: "Edit address" });
await edit.focus();
await page.keyboard.press("Enter");
await expect(page.getByRole("dialog", { name: "Edit address" })).toBeVisible();
await expect(page.getByRole("textbox", { name: "Street" })).toBeFocused();
await page.keyboard.press("Escape");
await expect(page.getByRole("dialog")).toBeHidden();
await expect(edit).toBeFocused();
});अक्सर पूछे जाने वाले सवाल
macOS पर Safari में Tab links को क्यों छोड़ देता है?
डिफ़ॉल्ट रूप से Safari Tab को सिर्फ़ फ़ॉर्म कंट्रोल के बीच चलाता है। Safari की advanced settings में "Press Tab to highlight each item on a webpage" चालू करें, या Option+Tab इस्तेमाल करें। टेस्ट से पहले macOS की keyboard settings में keyboard navigation भी चालू करें।
क्या हर element focusable होना चाहिए?
नहीं। सिर्फ़ interactive elements Tab stops हों। Headings या paragraphs को focusable बनाना कीबोर्ड यूज़र्स के लिए शोर बढ़ाता है। जब script को फ़ोकस किसी non-interactive target पर ले जाना हो, जैसे route change के बाद heading, तब tabindex="-1" इस्तेमाल करें।
क्या WCAG skip link अनिवार्य करता है?
WCAG 2.4.1 Bypass Blocks दोहराए blocks को छोड़ने का तरीका माँगता है; skip link एक तरीका है, landmarks और headings दूसरे। देख सकने वाले कीबोर्ड यूज़र्स के लिए फ़ोकस पर दिखने वाला skip link सबसे सीधा तरीका है।
Focus Visible और Focus Appearance में क्या फ़र्क़ है?
2.4.7 Focus Visible (AA) माँगता है कि focus indicator दिखे। 2.4.13 Focus Appearance (AAA) indicator के आकार और कंट्रास्ट पर requirements जोड़ता है। ज़्यादातर targets के लिए AA अनिवार्य है; AAA criterion अच्छा डिज़ाइन लक्ष्य है।
क्या कीबोर्ड पास स्क्रीन रीडर टेस्टिंग की जगह ले सकता है?
नहीं। कीबोर्ड पास दिखाता है कि कंट्रोल तक पहुँचा और उन्हें चलाया जा सकता है या नहीं; यह नहीं दिखाता कि उनके name, role और state सही हैं या बदलाव announce होते हैं। दोनों करें, पहले कीबोर्ड।
मोबाइल ऐप में कीबोर्ड access कैसे टेस्ट करें?
डिवाइस से Bluetooth कीबोर्ड जोड़ें और Tab व arrow keys से नेविगेट करें, और प्लैटफ़ॉर्म का switch access आज़माएँ। वेब जैसी ही चीज़ें जाँचें: पहुँच, क्रम, visible focus और कोई trap नहीं।
संदर्भ
- Web Content Accessibility Guidelines (WCAG) 2.2W3C की Recommendation जो सुलभ वेब कंटेंट के लिए टेस्ट करने योग्य success criteria तय करती है — चार सिद्धांतों और तीन conformance स्तरों (A, AA, AAA) में व्यवस्थित।
- Understanding WCAG 2.2WCAG 2.2 की हर guideline और success criterion की व्याख्या: उद्देश्य, किसे लाभ, उदाहरण और तकनीकें (नॉर्मेटिव नहीं)।
- ARIA Authoring Practices Guide (APG)आम विजेट (tabs, menus, dialogs, comboboxes) के पैटर्न, अपेक्षित कीबोर्ड इंटरैक्शन और ARIA उपयोग के साथ — वह संदर्भ जिससे टेस्टर कस्टम कंपोनेंट की तुलना करते हैं।
- Easy Checks – A First Review of Web Accessibilityपूरे मूल्यांकन से पहले कोई भी कर सके ऐसी शुरुआती जाँचें — पेज टाइटल, टेक्स्ट विकल्प, हेडिंग, कंट्रास्ट, टेक्स्ट रीसाइज़, कीबोर्ड एक्सेस।
- Accessibility — MDNसुलभ वेब पेज बनाने और जाँचने की व्यावहारिक गाइड: सिमैंटिक HTML, ARIA, कीबोर्ड सपोर्ट और टेस्टिंग।
- Playwright DocumentationPlaywright का आधिकारिक दस्तावेज़ — Chromium, WebKit और Firefox चलाने वाला end-to-end टेस्ट फ़्रेमवर्क।
अभ्यास
कीबोर्ड सेशन के नोट्स से डिफ़ेक्ट तक
आप एक private hospital (काल्पनिक) की appointment साइट टेस्ट करते हैं, जिसमें English और Arabic इंटरफ़ेस हैं। Release 5.4 में "Book an appointment" पेज जुड़ रहा है, और एक्सेसिबिलिटी का लक्ष्य WCAG 2.2 level AA है। टेस्टिंग से पहले आपने पेज के markup का एक सरल अंश पढ़ा; फिर Chrome में सिर्फ़ कीबोर्ड से सेशन चलाया और N1–N11 नोट्स लिखे। दोनों नीचे हैं। Names, roles और announcements आज scope में नहीं हैं: वे स्क्रीन रीडर सेशन का हिस्सा हैं।
गाइड के कीबोर्ड टेस्ट केस KB-01 से KB-16 और success criteria की सूची के साथ काग़ज़ पर काम करें। हर नोट के लिए तय करें कि वह failure दर्ज करता है या expected व्यवहार, और failures को ऐसी डिफ़ेक्ट रिपोर्ट में बदलें जिन पर डेवलपर काम कर सके। इसके लिए 20–30 मिनट रखें।
एक private hospital की appointment साइट (काल्पनिक) - web, English और Arabic इंटरफ़ेस
Release 5.4 में पेज "Book an appointment" जुड़ता है। Accessibility लक्ष्य: WCAG 2.2 AA।
Markup का अंश (सरल, DOM क्रम में)
<a class="skip" href="#main">Skip to main content</a>
<header class="site-header">
<a href="/"><img src="logo.svg" alt="Hospital home"></a>
<nav> Home | Clinics | Doctors | Offers | My appointments | Help </nav>
<select aria-label="Language"> English | Arabic </select>
<div class="btn" role="button" tabindex="0" onclick="openSignIn()">Sign in</div>
</header>
<main id="main">
<h1>Book an appointment</h1>
<input type="search" aria-label="Search doctors" tabindex="1">
<div role="tablist"> Dermatology | Dentistry | Paediatrics </div>
<div role="tabpanel"> 6 x (<a href="...">View profile</a> <button>Choose</button>)</div>
<section class="promo"> Winter offers ... <a href="/offers">See offer</a> </section>
<fieldset> Time slot: 8 x <input type="radio" name="slot">, 09:00 ... 12:30 </fieldset>
<div contenteditable="true" aria-label="Notes for the doctor"></div>
<button type="button">Book</button>
</main>
<footer> 4 x <a href="...">...</a>, <a href="/privacy">Privacy</a> </footer>
<button class="chat-launcher">Need help?</button>
<div role="dialog" aria-modal="true" hidden> Confirm booking: Confirm | Cancel </div>
CSS का अंश
.site-header { position: sticky; top: 0; }
.chat-launcher { position: fixed; bottom: 16px; }
.promo a:focus { outline: none; } /* no other focus style inside .promo */
साथ ही: promo banner गहरा हरा है; पेज load होने पर कोई time slot चुना नहीं होता;
"Book" hidden attribute हटाकर dialog खोलता है; skip link पर एक smooth-scroll script
#main पर jump रद्द कर देती है और पेज को सिर्फ़ <main> तक scroll करती है।
कीबोर्ड सेशन - Windows पर Chrome, staging build 5.4.0-rc2, English इंटरफ़ेस,
जब तक अलग न लिखा हो, 100% ज़ूम। माउस दूर रखा; शुरुआत: फ़ोकस address bar में।
N1 पहला Tab: फ़ोकस main content में "Search doctors" पर। दूसरा Tab: "Skip to main
content" ऊपर बाईं ओर दिखता है। फिर: logo, 6 nav links, language, "Sign in"।
N2 Skip link पर Enter: पेज "Book an appointment" तक scroll होता है, लेकिन अगला
Tab header के logo link पर जाता है।
N3 "Sign in" पर focus ring दिखती है, लेकिन Enter और Space से कुछ नहीं होता। बाद में
माउस से जाँचा: click करने पर sign-in dialog खुलता है।
N4 Tabs: Tab active tab "Dermatology" पर जाता है; Right Arrow "Dentistry" पर ले
जाता है और उसके डॉक्टर दिखाता है; अगला Tab panel में जाता है। Arabic इंटरफ़ेस
(mirrored) में "Dermatology" दाईं ओर है, और Left Arrow "Dentistry" पर ले जाता है।
N5 Promo banner में "See offer" पर कोई focus indicator नहीं दिखता। पेज के बाकी links
नीला outline दिखाते हैं।
N6 Time slots: Tab "09:00" पर जाता है; बाकी 7 slots Tab stops नहीं हैं। Down Arrow
"09:30" पर ले जाकर उसे चुनता है; अगला Tab "Notes for the doctor" पर जाता है।
N7 "Notes for the doctor": Tab indent जोड़ता है, Shift+Tab उसे हटाता है, Esc कुछ
नहीं करता, और स्क्रीन पर कहीं नहीं लिखा कि बाहर कैसे निकलें। सेशन जारी रखने
के लिए आपने editor के नीचे एक बार click किया।
N8 "Book" पर Enter: "Confirm booking" dialog दिखता है, लेकिन फ़ोकस उसके पीछे
"Book" पर ही रहता है। "Confirm" तक पहुँचने से पहले Tab footer के 5 links और
"Need help?" से गुज़रता है। Esc dialog बंद करता है; फ़ोकस खो जाता है और अगला
Tab फिर से पहले stop, "Search doctors", पर जाता है।
N9 200% ज़ूम, doctor cards में Shift+Tab से ऊपर जाते हुए: दो बार फ़ोकस वाला
"Choose" button sticky header के नीचे रुकता है और बिल्कुल नहीं दिखता।
N10 Footer: "Need help?" launcher फ़ोकस वाले "Privacy" link का लगभग आधा हिस्सा
ढक देता है; link का बाकी हिस्सा और उसका outline दिखते रहते हैं।
N11 सिर्फ़ H दबाने पर (Ctrl या Alt के बिना) text fields को छोड़कर पेज पर कहीं से
भी Help panel खुल जाता है। Settings में इसे बंद करने या key बदलने का कोई
विकल्प नहीं।- नोट्स पढ़ने से पहले markup पढ़ें: address bar से शुरू करके पहले पाँच Tab stops का अनुमान लगाएँ, और लिखें कि markup में आपको क्या फ़ेल होने की उम्मीद है और क्यों।
- N1–N11 देखें। Failure के लिए फ़ेल होने वाला KB टेस्ट केस और WCAG 2.2 success criterion उसके level के साथ बताएँ; expected व्यवहार के लिए बताएँ कि वह किस नियम का पालन करता है।
- हर failure के लिए गाइड के डिफ़ेक्ट उदाहरणों की शैली में बग टाइटल लिखें, criterion के साथ, और जहाँ markup दिखाता हो वहाँ संभावित कारण भी।
- KB-16 का जवाब दें: क्या सिर्फ़ कीबोर्ड इस्तेमाल करने वाला यूज़र booking पूरी कर सकता है? फिर चिह्नित करें कि अगले runs में कौन-से failures कोई rule engine या Playwright टेस्ट पकड़ सकता है, और किनके लिए मैनुअल पास चाहिए।
मॉडल उत्तर दिखाएँ
Step 1, markup। पहले पाँच Tab stops हैं: "Search doctors" (उसका tabindex="1" उसे natural order में सबसे आगे कर देता है), skip link, logo link, Home और Clinics। "Sign in" के बाद अगला stop active tab है: "Search doctors" heading के बाद अपनी जगह पर कभी नहीं आता। कोई key दबाने से पहले ही आप ये risks बता सकते हैं: positive tabindex (2.4.3); skip link की script, जो jump रद्द करके सिर्फ़ scroll करती है, इसलिए फ़ोकस link पर ही रह सकता है (2.4.1); role="button" और tabindex="0" वाला div, जो focusable है और button के रूप में announce होता है, पर इनमें से कोई attribute उसे Enter या Space का व्यवहार नहीं देता (2.1.1); .promo में outline: none, जिसका कोई replacement नहीं (2.4.7); sticky header और fixed chat launcher, जो फ़ोकस वाले elements को ढक सकते हैं, ख़ासकर 200% ज़ूम पर (2.4.11); contenteditable editor, जो Tab पकड़ सकता है (2.1.2); और custom dialog, जहाँ aria-modal="true" assistive technologies को बताता है कि dialog modal है, पर न फ़ोकस अंदर ले जाता है, न Tab को अंदर रखता है (2.4.3)। <h1> का Tab stop न होना सही है, और name="slot" साझा करने वाले आठ radio buttons का एक ही Tab stop होना भी। Markup पढ़ना static testing है: यह बिना कुछ चलाए risks और कुछ defects पकड़ता है, और फिर सेशन दिखाता है कि उनमें से किनसे सच में failures होते हैं।
N1 — failure। KB-01 फ़ेल होता है (पहला Tab skip link तक नहीं पहुँचता), और KB-05 भी (क्रम reading order का पालन नहीं करता): 2.4.3 Focus Order (A)। कारण: search field पर tabindex="1"; field इसके बिना भी focusable है। Title: "पहला Tab skip link और header से पहले main content के Search doctors पर कूद जाता है (positive tabindex)"।
N2 — failure, KB-02। Skip link की script पेज को scroll करती है पर फ़ोकस नहीं हिलाती, इसलिए फ़ोकस link पर ही रहता है और main content से पहले यूज़र को फिर भी 9 stops (logo, 6 nav links, language, Sign in) पार करने पड़ते हैं। इसे 2.4.1 Bypass Blocks (A) के तहत दर्ज करें। WCAG landmarks और headings को भी bypass mechanism मानता है, और इस पेज में <header>, <main> और <h1> हैं, इसलिए कोई auditor तय कर सकता है कि 2.4.1 औपचारिक रूप से पूरा होता है; फिर भी यह defect है, क्योंकि देख सकने वाले कीबोर्ड यूज़र्स जिस link पर निर्भर हैं, वह अपना वादा किया हुआ काम नहीं करता। Expected: Enter फ़ोकस को <main> पर ले जाए, और अगला Tab उसके पहले कंट्रोल तक पहुँचे (N1 ठीक होने के बाद "Search doctors"); जो script पेज scroll करती है उसे फ़ोकस भी हिलाना चाहिए, जैसे tabindex="-1" देकर <main> पर। Title: "Skip to main content सिर्फ़ पेज scroll करता है; अगला Tab header के logo पर जाता है"।
N3 — failure, KB-08: 2.1.1 Keyboard (A)। role="button" और tabindex="0" div को focusable बनाते हैं और उसे button के रूप में announce कराते हैं, पर कोई भी कीबोर्ड व्यवहार नहीं जोड़ता, और div पर onclick handler Enter या Space पर नहीं चलता। संभावित fix: native <button>, जो दोनों keys पर वही handler चलाता है। Title: "Sign in (role button वाला div) Enter और Space को अनदेखा करता है; sign in सिर्फ़ माउस से होता है"।
N5 — failure, KB-06: 2.4.7 Focus Visible (AA)। CSS कारण दिखाता है: .promo a:focus { outline: none; } और कोई दूसरा focus style नहीं। Expected: ऐसा focus indicator जो गहरे हरे banner पर दिखे। Title: "Winter offers banner में See offer पर कोई focus indicator नहीं (outline हटाया गया)"।
N7 — failure, KB-11: 2.1.2 No Keyboard Trap (A)। Editor indent के लिए Tab तभी इस्तेमाल कर सकता है जब बाहर निकलने का कोई और तरीका हो और, अगर वह कोई standard key नहीं है, तो यूज़र को बताया जाए — जैसे field के hint में "Esc, फिर Tab"। यहाँ न कुछ काम करता है, न कुछ बताया जाता है। Title: "Notes for the doctor में फ़ोकस फँस जाता है: Tab और Shift+Tab indent बदलते हैं, Esc कुछ नहीं करता"।
N8 — failure, KB-10, तीन अधूरी अपेक्षाओं के साथ: dialog खुलने पर फ़ोकस उसके अंदर नहीं जाता, Tab पीछे के पेज तक पहुँचता है, और बंद होने पर फ़ोकस "Book" पर नहीं लौटता। इसे 2.4.3 Focus Order (A) के तहत दर्ज करें, गाइड के Filters drawer उदाहरण की तरह; Esc से dialog का बंद होना pass हुआ। एक रिपोर्ट ठीक है, क्योंकि तीनों की जड़ एक ही कमी है, dialog का focus management: showModal() से खुलने वाला native dialog element इसका बड़ा हिस्सा सँभालता है, जैसा गाइड कहती है; custom dialog को ऐसी script चाहिए जो फ़ोकस अंदर ले जाए, Tab को अंदर रखे और फ़ोकस "Book" पर लौटाए। Title: "Confirm booking dialog: फ़ोकस पीछे Book पर रहता है, Tab पेज तक पहुँचता है, बंद होने पर फ़ोकस खो जाता है"।
N9 — failure, KB-07: 2.4.11 Focus Not Obscured (Minimum) (AA), क्योंकि author का बनाया कंटेंट — sticky header — फ़ोकस वाले button को पूरी तरह छिपा देता है। रिपोर्ट में शर्तें लिखें: 200% ज़ूम, Shift+Tab, और किन cards पर ऐसा हुआ। एक आम fix यह है कि फ़ोकस वाले element तक scroll करते समय header की ऊँचाई जितनी जगह छोड़ी जाए, जैसे CSS property scroll-padding-top से। Title: "200% ज़ूम पर पीछे की ओर Tab करते समय sticky header फ़ोकस वाले Choose button को पूरी तरह छिपा देता है"।
N11 — failure, KB-14: 2.1.4 Character Key Shortcuts (A)। एक-character shortcut तभी मान्य है जब यूज़र उसे बंद कर सके, उसे Ctrl या Alt जैसी modifier key शामिल करने के लिए remap कर सके, या वह सिर्फ़ तब चले जब किसी ख़ास कंपोनेंट पर फ़ोकस हो; H पूरे पेज पर चलता है और तीनों में से कोई शर्त लागू नहीं होती। इसका सबसे ज़्यादा असर speech-input यूज़र्स पर पड़ता है, जिनके बोले गए शब्द key presses बनकर पहुँच सकते हैं, और उन सब पर जो गलती से कोई key दबा देते हैं। Title: "Single-key shortcut H पेज पर कहीं से भी Help खोल देता है और इसे बंद या बदला नहीं जा सकता"।
Expected व्यवहार, defects नहीं। N4, KB-09 में pass है: Tab active tab पर जाता है, arrows tabs के बीच चलते हैं और अगला Tab panel में जाता है, जैसा APG का tabs pattern बताता है; mirrored Arabic इंटरफ़ेस में Left Arrow का अगले tab पर जाना वही expected result है जो यह टॉपिक मानता है (horizontal arrows दृश्य दिशा का पालन करते हैं)। इसे pass दर्ज करें और जाँचें कि बाकी horizontal widgets भी यही नियम लागू करें। N6, KB-03 और radio group pattern को पूरा करता है: group एक Tab stop है, Tab चुने हुए विकल्प पर प्रवेश करता है (कुछ न चुना हो तो पहले पर), और arrows चलते और चुनते हैं; "Tab 7 slots छोड़ देता है" रिपोर्ट करना false positive होगा। N10 AA failure नहीं है: 2.4.11 और KB-07 तभी फ़ेल होते हैं जब फ़ोकस वाला element पूरी तरह छिपा हो, और यहाँ link का आधा हिस्सा और उसका outline दिखते रहते हैं। यह AAA criterion 2.4.12 Focus Not Obscured (Enhanced) में ज़रूर फ़ेल है, जो किसी भी हिस्से को छिपने नहीं देता; AA लक्ष्य के साथ इसे AA failure नहीं, सुधार (improvement) के रूप में दर्ज करें।
KB-16 फ़ेल होता है: सिर्फ़ कीबोर्ड इस्तेमाल करने वाला यूज़र booking पूरी नहीं कर सकता, क्योंकि "Book" button से पहले फ़ोकस "Notes for the doctor" में फँस जाता है (N7); आप माउस से ही आगे बढ़ पाए। इसलिए N7 सबसे पहले रिपोर्ट करें। N3 भी कीबोर्ड यूज़र्स को sign in से बाहर रखता है। कुल: 8 failures — level A पर 6 (N1, N2, N3, N7, N8, N11) और AA पर 2 (N5, N9) — expected व्यवहार के 2 नोट्स (N4, N6) और 1 AAA सुधार (N10)। ISTQB की भाषा में: नोट्स देखा गया व्यवहार दर्ज करते हैं; failure expected result से विचलन है, और defect कोड में उसका कारण है, जैसे tabindex="1" या हटाया गया outline।
अगले runs के लिए automation। Rule engine बिना कोई key दबाए positive tabindex (N1) पकड़ लेता है। Keys दबाकर यह assert करने वाले Playwright टेस्ट कि फ़ोकस किस element पर है, व्यवहार वाले fixes के लिए सही हैं: skip link फ़ोकस को <main> में ले जाए (N2), "Sign in" पर Enter और Space sign-in dialog खोलें (N3), Tab तय तरीके से notes editor से बाहर निकले (N7), dialog फ़ोकस ले, Tab को अंदर रखे और फ़ोकस "Book" पर लौटाए (N8, गाइड के उदाहरण की तरह), और H तय शर्तों के बाहर Help न खोले (N11)। जिन चीज़ों को आँखें चाहिए उनके लिए मैनुअल पास रखें: हर background पर दिखने वाला indicator (N5), sticky या fixed कंटेंट के पीछे छिपा फ़ोकस (N9, N10), और दोनों लेआउट में क्रम का अर्थ (N1, N4)। हर रिपोर्ट में ब्राउज़र, सटीक key sequence और फ़ोकस कहाँ पहुँचा, यह भी चाहिए, जैसा गाइड कहती है, और साथ में build; नोट्स में चारों मौजूद हैं।
अगर आपका जवाब अलग है, तो तीन बातें जाँचें: हर failure वह criterion बताए जिससे उसका expected result आता है; N4, N6 और N10 AA failures के रूप में दर्ज न हों; और हर title बताए कि क्या होता है, कहाँ और किस key से, ताकि डेवलपर उसे reproduce कर सके।
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।
QA रोडमैप का हिस्सा
इस topic से पहले
अगले topics
इस गाइड में बताए गए टूल्स
Mutqan AI से किसी भी फ़ीचर के लिए अनुकूलित QA चेकलिस्ट (functional, UI, API, security, performance, accessibility, release) बनाएँ।
फ़ीचर के विवरण और फ़ील्ड सूची से संरचित टेस्ट केस (id, शीर्षक, पूर्व-शर्तें, स्टेप, अपेक्षित परिणाम, प्राथमिकता) जनरेट करें।
Mutqan AI से बिखरे हुए विवरण से स्पष्ट और खोजने में आसान बग टाइटल बनाएँ।