Co oznacza to kryterium
Gdy użytkownik wprowadza lub wybiera dane, zapewnij etykiety lub instrukcje pozwalające rozpoznać oczekiwane dane. Przy szczególnym formacie pokaż regułę albo przykład w chwili użycia; wymagane pola rozpoznawalnie oznacz. Pole swobodnych uwag może potrzebować tylko informacji o przeznaczeniu.
| Potrzeba | Bariera i korzyść |
|---|---|
cognitive — Pamięć i koncentracja |
Cel, format i obowiązkowość podane przed wejściem ograniczają zgadywanie i kolejne próby. |
low-vision — Słabowidzenie |
Informacja przy polu ułatwia powiązanie w powiększonym widoku. |
blindness — Niewidzenie |
Cel i reguły mogą być udostępnione bez obrazu; samo 3.3.2 nie potwierdza relacji programowej ani mowy czytnika. |
Przykłady błędów i poprawek
Własna Pracownia zapisuje lokalnie kod odbioru syntetycznego P-104, bez kont, sieci lub backendu. Pole jest początkowo puste. Akceptuje dokładnie dwie wielkie litery ASCII A–Z i cztery cyfry, bez spacji, np. AB1042.
Problem: bad usuwa widoczny blok etykiety i instrukcji, choć zachowuje natywną nazwę, hint, walidację oraz zapis. Skutek: osoba bez odczytu drzewa widzi nieobjaśnione puste pole. Poprawka: pokazać ten sam cel, obowiązkowość i format przed wpisaniem, a następnie zachować informację podczas edycji.
| Wariant | Informacja przed wejściem | Wynik i granica |
|---|---|---|
| good | Kod odbioru (wymagane) i widoczna reguła z AB1042. | Tekst pozostaje po wpisaniu. |
| bad | Brak widocznej etykiety i instrukcji; semantyczna nazwa/hint jak w good. | Ten sam zapis może się udać, ale sukces nie usuwa bariery. |
| format | Widoczna etykieta, reguła tylko w AX hint. | Cel podany, szczególny format nieobjaśniony osobie bez AT. |
| control | Uwagi (opcjonalnie), swobodny lub pusty tekst. | Brak instrukcji formatu jest uzasadniony brakiem takiego ograniczenia. |

Ponowienie 2026-10-04, iPhone 17 Simulator / iOS 26.5, Flutter/Cupertino. Przed wpisaniem good podaje cel, obowiązkowość i przykład AB1042; tekst pozostaje po wpisaniu w odczytach.

Surowy kadr ponowienia pokazuje brak widocznego bloku. Natywna nazwa i hint pozostają takie jak w good; ich obecność nie zastępuje informacji dla osoby bez AT.

Kontrola przyjmuje swobodny tekst albo pustą wartość. Nie ma szczególnego formatu; brak jego instrukcji nie jest samodzielnym błędem. To inne przeznaczenie pola, nie para o identycznym kontrakcie.
Wariant format ma odczyty, bez osobnego PNG. Komunikat dopiero po odrzuceniu jest pomocą po fakcie i nie naprawia początkowego braku szczególnej instrukcji. Good/bad mają ten sam kontrakt; control celowo zmienia przeznaczenie i regułę.
Kiedy obowiązuje i gdzie są wyjątki
Etykieta identyfikuje kontrolkę i jest przedstawiona użytkownikom; może być tekstem lub innym komponentem z alternatywą tekstową. Nie oznacza wyłącznie elementu HTML label. Dostępna nazwa jest identyfikatorem przedstawianym przez oprogramowanie i może istnieć tylko w drzewie dostępności. Sama aria-label, accessibilityLabel lub Semantics.label nie dostarcza widocznej informacji osobie bez technologii asystującej.
Wymaganie obejmuje pola wymagane i opcjonalne, pola tekstu, wybory, checkboxy i przyciski radiowe związane z danymi. Każda opcja musi pozwalać rozpoznać wybór. „Wymaga wprowadzenia” nie oznacza wyłącznie technicznego required. Przy grupach potrzebna może być informacja wspólna i opis poszczególnych części, np. daty; nie wystarczy dowolny napis gdziekolwiek na ekranie.
Nie ma tu listy wyjątków bezpieczeństwa czy niezbędności. Warunek zastosowania to wprowadzanie danych; sam link albo przycisk rozwijający panel nie jest takim wejściem. Konwencjonalny symbol wyszukiwania może być widoczną etykietą, jeśli jest zrozumiały w kontekście i ma właściwą alternatywę; brak osobnego napisu nie zawsze jest błędem. Ta demonstracja używa tekstu, bez testowania symbolu.
„Etykiety lub instrukcje” nie nakazuje obu przy każdym polu ani zawsze osobnej linii opisu. Szczególne ograniczenia formatu trzeba zakomunikować odpowiednią informacją; dłuższa instrukcja może być ujawniana przy fokusie, jeśli dostępna w chwili użycia. Zawsze widoczny opis jest przyjętą tu prostą implementacją, bez nakazu jednego układu. Placeholder znikający po wpisaniu jest słabym samodzielnym rozwiązaniem; jego ocena wymaga sprawdzenia innych wskazówek i stanów, nie mechanicznego zakazu każdego placeholdera.
Granice: 1.3.1 obejmuje programowe relacje, 4.1.2 nazwę/rolę/wartość, 2.4.6 jakość opisowości etykiet. Samo 3.3.2 nie nakazuje konkretnego znacznika ani powiązania AX. 3.3.1 opisuje automatycznie wykryty błąd, a 3.3.3 znaną sugestię poprawy. Komunikat dopiero po odrzuceniu nie zastępuje informacji przed wpisaniem szczególnego formatu. 2.5.3 obejmuje obecność widocznej etykiety w nazwie. Test tego formularza nie potwierdza tych innych kryteriów.
Techniki i udokumentowany błąd
Przejrzano G131 (opis etykiet), G89 (format lub przykład), G184 (instrukcje przed grupą pól), G162 (przewidywalne położenie) i H90 (wymagane pola, objaśnienie symbolu). H44 wiąże widoczną etykietę HTML z polem, ARIA1 opis z kontrolką, ARIA9 łączy istniejący tekst, ARIA17 opisuje grupę; techniki PDF5/PDF10 dotyczą oznaczeń obowiązkowości i etykiet formularza PDF. Te sposoby mogą wykraczać poza minimum 3.3.2; nie trzeba stosować wszystkich ani używać ARIA w natywnym Flutterze.
F82 jest udokumentowanym błędem zestawu pól telefonu rozpoznawalnego tylko po nawiasach, separatorach i długości, bez widocznej etykiety lub instrukcji grupy. Nie odtwarzamy tu F82 i nie rozciągamy go na każdy podział pól. Opisane warianty formularza są odtworzeniem zasad etykiet i instrukcji, nie oficjalnym katalogiem częstości błędów.
Platformy
Ocena zastosowania: AI, 2026-10-04; człowiek NOT-RUN. WCAG2ICT 2.2, Group Note 2025-12-11, stosuje 3.3.2 bez zmiany wymagania do dokumentów i oprogramowania poza środowiskiem webowym. Jest wskazówką interpretacyjną, bez własnych normatywnych wymagań zgodności. Nie mapujemy tu EN 301 549 ani prawa.
| ID / środowisko | Podstawa / kryterium | Stan | Warunek, adaptacja i uzasadnienie | Wykonanie |
|---|---|---|---|---|
| web / WWW | WCAG 2.2 / 3.3.2 | dotyczy warunkowo | Gdy treść przyjmuje dane, także opcjonalne; bez adaptacji. Przeglądarka telefonu należy do treści webowej. | NOT-RUN |
| mobile / Aplikacje mobilne | WCAG2ICT 2.2 / 3.3.2 | dotyczy warunkowo | Natywne pola, wybory i formularze; bez zmiany wymagania. W hybrydzie część WWW ocenić osobno. | Flutter/Cupertino, iOS Simulator; wynik niżej |
| desktop / Aplikacje desktopowe | WCAG2ICT 2.2 / 3.3.2 | dotyczy warunkowo | Gdy program przyjmuje dane; bez zmiany wymagania. | NOT-RUN |
| document / Dokumenty cyfrowe | WCAG2ICT 2.2 / 3.3.2 | dotyczy warunkowo | Interaktywny formularz dokumentu potrzebuje etykiet/instrukcji. Dokument wyłącznie do czytania nie spełnia warunku wejścia. | NOT-RUN |
| other / Inne urządzenia — formularz kiosku | WCAG2ICT 2.2 / 3.3.2 dla oprogramowania | dotyczy warunkowo | Gdy interfejs kiosku oczekuje danych; bez zmiany tego wymagania. Sprzęt i zamknięta funkcjonalność wymagają osobnej oceny, bez wyłączenia etykiet. | NOT-RUN |
Nie dotyczy badanego elementu: przycisk otwierający pomoc lub link nawigacyjny, gdy nie uczestniczy we wprowadzaniu danych. Brak testu platformy nie jest wyłączeniem wymagania.
Rozwiązania w technologiach
Każdy przykład dodaje informację widoczną dla użytkownika; nazwa AX i hint uzupełniają ją. Fragmenty pokazują warstwę wejścia, bez całego zapisu/walidacji. W produkcie instrukcja musi zgadzać się z faktycznymi regułami serwera. Wersje podano tylko dla wykonanego Fluttera.
Flutter / Dart
import 'package:flutter/cupertino.dart';
Widget pickupInput(TextEditingController controller) {
const label = 'Kod odbioru (wymagane)';
const hint = 'Dwie wielkie litery A–Z i cztery cyfry, bez spacji. Przykład: AB1042.';
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
const Text(label),
const Text(hint),
Semantics(label: label, hint: hint,
child: CupertinoTextField(controller: controller)),
]);
}Kontroler utrzymuje wartość; właściciel wywołuje dispose. Osobne Text nie znikają podczas edycji. CupertinoTextField nie otrzymuje etykiety przez sam placeholder. Dodano równoważną implementację w ekranie, we wspólnym CupertinoApp. Sam skrócony fragment nie był osobnym celem kompilacji.
iOS / SwiftUI
import SwiftUI
struct PickupInput: View {
@State private var code = ""
private let label = "Kod odbioru (wymagane)"
private let hint = "Dwie wielkie litery A–Z i cztery cyfry, bez spacji. Przykład: AB1042."
var body: some View {
VStack(alignment: .leading) {
Text(label)
Text(hint)
TextField(label, text: $code)
.textFieldStyle(.roundedBorder)
.accessibilityLabel(label)
.accessibilityHint(hint)
}
}
}Styl TextField może używać tytułu jako placeholdera na iOS. Zewnętrzne Text zapewniają stałą informację; accessibilityLabel jej nie zastępuje. Nie grupuj całego formularza jako jednego niedającego się edytować elementu AX.
Android / Jetpack Compose
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@Composable
fun PickupInput() {
var code by remember { mutableStateOf("") }
OutlinedTextField(
value = code,
onValueChange = { code = it },
label = { Text("Kod odbioru (wymagane)") },
supportingText = {
Text("Dwie wielkie litery A–Z i cztery cyfry, bez spacji. Przykład: AB1042.")
},
singleLine = true
)
}Slot label i supportingText dostarczają widoczny tekst. Wariant z wartością i callbackiem jest fragmentem edukacyjnym; można użyć także API pól opartych na stanie. Typ klawiatury nie zastępuje instrukcji, zwłaszcza przy wklejaniu.
React Native
import React, { useState } from 'react';
import { Text, TextInput, View } from 'react-native';
export function PickupInput() {
const [code, setCode] = useState('');
const label = 'Kod odbioru (wymagane)';
const hint =
'Dwie wielkie litery A–Z i cztery cyfry, bez spacji. Przykład: AB1042.';
return (
<View>
<Text>{label}</Text>
<Text>{hint}</Text>
<TextInput
value={code}
onChangeText={setCode}
accessibilityLabel={label}
accessibilityHint={hint}
/>
</View>
);
}Text pozostaje widoczny po edycji; TextInput jest kontrolowany przez stan. Sam accessibilityLabel nie naprawia braku widocznego opisu. accessibilityLabelledBy jest opcją Androida, więc nie użyto go jako wspólnego API obu platform. Hint czytnika może zależeć od ustawień; nie przenoś do niego jedynej informacji.
| Technologia | Oficjalne API: przegląd AI 2026-10-04 | Kompilacja | Działanie |
|---|---|---|---|
| Flutter 3.44.9 / Dart 3.12.2 | CupertinoTextField, Semantics, controller: sprawdzone | Demonstracja iOS: wynik niżej | Demonstracja iOS: wynik niżej |
| SwiftUI | TextField, stałe Text, accessibilityLabel/Hint: sprawdzone | NOT-RUN | NOT-RUN |
| Jetpack Compose | OutlinedTextField, label, supportingText, stan: sprawdzone | NOT-RUN | NOT-RUN |
| React Native | TextInput value/onChangeText, Text, etykieta/hint: sprawdzone | NOT-RUN | NOT-RUN |
Brak buildów pozostałych frameworków jest jawnym zakresem edukacyjnym zgodnym z procesem, bez zlecania dodatkowych demonstracji. Przegląd dokumentacji nie potwierdza działania ani odczytu AT.
Jak sprawdzić
- Ustal przyjmowane dane, opcje i rzeczywiste ograniczenia, także opcjonalnych pól i grup.
- Przed wejściem oceń widoczną etykietę lub instrukcję, obowiązkowość i szczególny format. Sama nazwa z drzewa nie wystarcza.
- Wpisz wartość i sprawdź dostęp do informacji podczas oraz po edycji. Instrukcję ujawnianą przy fokusie rzeczywiście otwórz w odpowiednim momencie.
- W good i bad wpisz AB1042, zapisz i zresetuj. Oba mogą zapisać dane; tylko good pokazuje widoczny blok. Tożsamy sukces nie naprawia bad.
- Sprawdź format i control: brak widocznej reguły ograniczonego kodu różni się od swobodnych uwag bez reguły. Powiązania programowe i opisowość sprawdź pod właściwymi kryteriami.
Historia wykonania 2026-10-04
Pierwsza próba nie dostarczyła odczytów formularza ani obrazów: runner zgłosił start, lecz XCTest nie rozpoczął testu; screenshot i zwykły restart urządzenia utknęły. Przerwane wykonanie nie jest FAIL 3.3.2. Opóźnione zakończenie urządzenia oraz boot czekający na System App pozostają obserwacjami, bez ustalonej przyczyny awarii lub przypisania jej sandboxowi.
| Historyczna kontrola | Wynik |
|---|---|
| Analiza Fluttera | PASS, bez problemów. |
| Dwie początkowe próby hostowe | FAIL, po cztery błędy sprzątania SemanticsHandle; asercje formularza nie wykazały wtedy usterki, ale całe testy były nieudane. |
| Poprawiony lifecycle testu | dispose przed końcową weryfikacją, następnie try/finally; końcowe 39 testów i pięć testów cleanup PASS. |
| Flutter iOS build | PASS, Runner.app powstał; instalacja bez zgłoszonego błędu, bez osobno zapisanego kodu zakończenia. Driver: TEST BUILD SUCCEEDED, bez potwierdzenia runtime. |
| Pierwsza próba formularza iOS / screenshoty | NOT-RUN, bez próbek i obrazów; własną diagnostykę i retry przerwano. |
| Człowiek i zaślepiona próba | NOT-RUN. |
Ponowienie: rzeczywisty formularz
Po potwierdzeniu gotowości urządzenia 2026-10-04 zbudowano świeży Runner i własny driver z bieżących źródeł. Nie użyto starszego buildu. Nie zmieniano kodu formularza ani drivera i nie powtarzano wcześniejszych analiz/testów hostowych. Nie naprawiano wspólnych usług ani nie restartowano hosta; historyczna przeszkoda została zamknięta jako nieaktualna, bez przyjęcia zgody na takie działania.
| Sprawdzenie | Wynik i zakres |
|---|---|
| Świeży build/install Flutter | PASS, kody 0, build Xcode 13,8 s. |
| Driver XCTest | PASS, kod 0, 10,394 s. |
| XCTest formularza i tras | PASS, 1 test / 0 błędów, 50,270 s; pełna komenda 79,551 s. |
| Wejścia | AB1042 w good/bad/format oraz Odbior po 16 w control; zwykłe tap i typeText, zapis, cykl i reset każdego wariantu. |
| Informacja widoczna | Good: etykieta/instrukcja przed i po wejściu; bad: brak obu; format: etykieta bez instrukcji; control: etykieta uwag bez formatu. |
| Odczyt natywny | Ta sama nazwa kodu i wpisana wartość w good/bad/format, inna nazwa uwag w control; bez odczytu hint przez VoiceOver. |
| Fallback i wcześniejsza trasa | Nieznana konfiguracja wraca do good; krótki odczyt 3.2.6 potwierdził Pomoc przy odbiorze, bez ponowienia pełnego kryterium. |
| Materiały | 21 odczytów i drzew, 20 wejść, trzy PNG obejrzane przez AI. |
| Checker zachowanych dowodów | Kontrola próbek, hashów i linków, bez nowego UI. Dawny checker zawiera historyczny status Potrzebna decyzja i nie służy odbiorowi aktualnego stanu. |
Flutter 3.44.9 / Dart 3.12.2, Xcode 27.0 (27A266a), iPhone 17 / iOS 26.5 Simulator, jasny wygląd, systemowy tekst large; widok 402×874 pt, PNG 1206×2622 px. Stan z wartością zarejestrowano po Return zamykającym klawiaturę; brak kadru podczas otwartej klawiatury. StaticText i hittability uzupełniają kadr, lecz AX nie jest uniwersalnym dowodem widoczności. PASS testu oznacza odtworzenie znanej demonstracji, w której bad nadal pokazuje barierę.
Weryfikacja i ograniczenia
Reguła deterministyczna może sprawdzić obecność widocznego tekstu, deklarowane ograniczenie wejścia i eksport relacji, lecz samo znalezienie napisu albo label nie ustala, czy wyjaśnia właściwe dane. Drzewo jest przybliżeniem: może zawierać tekst ukryty wizualnie, tak jak bad; z kolei widoczna instrukcja poza nazwą pola nie musi być błędem. OCR nie identyfikuje pewnie relacji, obowiązkowości ani reguł walidacji. Brak instrukcji przy dowolnym polu nie daje automatycznie FAIL, zwłaszcza przy swobodnym tekście.
AI może zestawić widoczną treść ze schematem wejścia i wskazać hipotezę braku informacji, ale nie wolno uznać jej za test człowieka. Weryfikacja człowieka obejmuje rozpoznawalność wskazówek, spójność reguł i moment ich podania. Usterki opisowości i relacji należy klasyfikować pod właściwym kryterium, bez mieszania z 3.3.2.
Obecna próba jest kontrolą własnej znanej fixture, bez uruchomionego walidatora i bez zaślepionej oceny skuteczności. Trasy, stopka wariantu, identyfikatory, nazwy plików i oczekiwania ujawniają wariant; trzeba wyłączyć je z wejścia badanego walidatora. Nie wyciągaj wniosku o zgodności z samego sukcesu zapisu albo braku alarmu.
Jak sprawdza Clearship
Clearship ma deterministyczny labels-input-change-1 w P0. Porównuje nazwę/podpowiedź pustego pola ze stanem po wpisaniu, szuka trwałej widocznej etykiety nad polem, po lewej albo pozostającej w polu. Druga reguła odczytuje znaki szczególnego formatu z komunikatu odrzucenia niepustej wartości i porównuje je z tekstem dostępnym przed wpisaniem.
Pomiary kontrolne Androida z 8 października i iOS z 9 października 2026 r. dały 8/10 usterek i 0/22 fałszywych alarmów na każdej platformie: oba poniżej progu, wynik wymaga człowieka. Ogólna ocena obrazu AI może wskazać kandydata braku etykiety, lecz nie jest pełnym testem instrukcji ani wynikiem progu tego kryterium.
Nazwa tylko programowa bez widocznej etykiety i podpowiedzi, brak stanu po wpisaniu oraz odrzucenie bez rozpoznanych znaków formatu idą do człowieka. Reguła formatu wymaga obecności co najmniej połowy znaków we wcześniejszym tekście; podobna liczba w niezwiązanym akapicie może ukryć brak instrukcji. Grupy opcji, instrukcje odsłaniane przy fokusie, ograniczenia niewywołane trzema rundami P0, relacje programowe, opisowość etykiet i treść webowa nie są ocenione.
Brak obserwacji i pusta lista znalezisk nie dają wyniku „nie znaleźliśmy problemów”. Człowiek ocenia znaczenie wskazówki i rzeczywiste reguły; pojedynczy placeholder wymaga kontekstu, a swobodny tekst nie potrzebuje zbędnej instrukcji. Wynik edukacyjnej fixture nie jest pomiarem metody produktu.