Co oznacza to kryterium
Jeśli przycisk pokazuje „Pokaż adres”, osoba sterująca głosem powinna móc posłużyć się tym napisem. Dostępna nazwa przycisku zawiera całą widoczną etykietę w tej samej kolejności. Można dodać kontekst przed nią lub po niej; zaczynanie od etykiety jest dobrą praktyką, a nie dodatkowym warunkiem tego kryterium. Nazwa i widoczny napis to dwie różne informacje, które trzeba porównać.
| ID / potrzeba | Bariera i korzyść |
|---|---|
motor / Ograniczenia ruchowe |
Osoba korzystająca ze sterowania głosowego zamiast precyzyjnego dotyku może wskazać kontrolkę widocznym napisem. Nie zakładamy, że każda osoba z ograniczeniami ruchowymi używa mowy. |
low-vision / Słabowidzenie |
Przy łączeniu wzroku z odczytem głosowym nazwa zgodna z napisem ogranicza niepewność, której kontrolki dotyczy odczyt. |
cognitive / Pamięć i koncentracja |
Nie trzeba pamiętać odmiennej, ukrytej nazwy do wypowiedzenia ani uzgadniać dwóch wersji etykiety. |
Przykłady błędów i poprawek
Wszystkie trzy warianty pokazują punkt Pracownia, zamówienie #1042, te same kontrolki i wyniki. Jedyną istotną różnicą jest nazwa dwóch przycisków; dane, raster tekstu, układ i callbacki są wspólne. Wariant nie jest podpisany oceną zgodności w UI.
| Kontrolka / etykieta | good — poprawka |
bad — celowy błąd |
control — granica zalecenia |
|---|---|---|---|
| Tekst „Pokaż adres” | „Pokaż adres — punkt Pracownia” | „punkt Pracownia” | „punkt Pracownia — Pokaż adres” |
| Obraz tekstu „Pokaż godziny” | „Pokaż godziny — godziny punktu Pracownia” | „godziny punktu Pracownia” | „godziny punktu Pracownia — Pokaż godziny” |
| Sama ikona znaku zapytania, bez etykiety tekstowej | „Pomoc”, brak warunku 2.5.3 | Tak samo | Tak samo |
Bariera w bad: użytkownik widzi napisy akcji, lecz otrzymane nazwy nie zawierają tych napisów. Poprawka w good: nazwy zachowują etykiety i dodają kontekst po nich. Kontrola: nazwy zawierają pełne etykiety po kontekście, więc spełniają badany warunek, choć nie stosują zalecenia początku. Ikona jest dodatkową kontrolą warunku zastosowania, a nie „poprawną wersją bez nazwy”.
Raster „Pokaż godziny” powstał przez AppKit z systemowym fontem. Jest własnym wejściowym obrazem tekstu, bez generacji AI. Zwykły tekst byłby prostszym rozwiązaniem produkcyjnym; ten przykład nie zatwierdza użycia rastra względem 1.4.5.

Good, iPhone 17 Simulator / iOS 26.5, 2026-10-03. Oba napisy są widoczne, a wyniki ukryte. Początkowe kadry good, bad i control są identyczne bajtowo; różnicę nazw pokazuje tabela i odczyt XCTest, a nie obraz.

Good po trzech tap XCTest z 2026-10-03 ujawnia adres, godziny i pomoc. Kadr pokazuje wynik zwykłych wejść; nie jest dowodem rozpoznania komendy głosowej.
Kiedy obowiązuje i gdzie są wyjątki
- Wymaganie: porównujemy tekst etykiety komponentu z jego faktyczną dostępną nazwą. Zgodność znaczenia, synonim albo tłumaczenie etykiety na inny język nie zastępują zawarcia jej tekstu. „Pokaż adres” → „Adres punktu” narusza tę relację, choć opisuje podobną funkcję.
- Tekst ma wyrażać treść w ludzkim języku. Raster z napisem w przycisku także podlega wymaganiu; nie wystarczy, że obraz ma nazwę pliku. Fotografia z istotną treścią wizualną nie staje się w całości obrazem tekstu tylko dlatego, że zawiera napis.
- Etykieta to tekst identyfikujący kontrolkę, zwykle wewnątrz przycisku lub obok pola. Nie utożsamiaj jej automatycznie z całym nagłówkiem, instrukcją albo legendą grupy. Sam placeholder może być kandydatem, gdy brak innej widocznej etykiety; nie czyni to placeholdera dobrym zamiennikiem trwałej etykiety.
- Nazwa różni się od opisu, podpowiedzi, roli i wartości. Dopisanie etykiety tylko do hint/description nie naprawia nazwy. Identyfikator do testów, HTML
namei nazwa zasobu graficznego nie są dostępną nazwą. - Zachowaj cały ciąg i kolejność słów; nie wstawiaj dodatkowych słów pomiędzy słowa etykiety. Dodatkowy kontekst przed lub po pełnej etykiecie jest dopuszczalny. Równość nie jest konieczna. Techniki G208 i G211 pokazują odpowiednio zawarcie oraz dopasowanie nazwy; są pomocnicze, nie obowiązkowym sposobem implementacji. F96 opisuje niedopasowanie, F111 brak nazwy przy widocznym napisie; oba są sprawdzonymi opisami błędów, bez twierdzenia o ich częstości.
- Understanding pozwala pomijać różnice wielkości liter i zwykłej interpunkcji, np. „Dalej…” i „Dalej”. Nie usuwaj mechanicznie symboli z formuł: etykieta
11×3=33przekazuje znaczenie i nie powinna być zastępowana dowolnym opisem słownym. Symboliczne „B” oznaczające pogrubienie lub strzałka „>” nie są tekstowymi etykietami w tym sensie. - Dodatkowa informacja w nawiasie może stanowić opis, np. format daty lub wymagane pole; jeśli nie wchodzi do nazwy, jej istotną treść trzeba nadal udostępnić programowo. To nie jest zezwolenie na pominięcie dowolnej części etykiety.
- W samym 2.5.3 nie ma ogólnego wyjątku „to niezbędne”. Brak etykiety tekstowej jest brakiem warunku zastosowania. Przycisk z samą ikoną nadal wymaga poprawnej nazwy/roli z innych kryteriów; nie dodawaj mu na siłę nazw kształtów. Brak nazwy przy widocznym napisie może naruszać zarazem 4.1.2 i 2.5.3.
- Zalecenie: najlepiej używać tej samej etykiety jako nazwy, a konieczny kontekst dodawać po niej lub do opisu. Zawierająca napis nazwa nie dowodzi, że konkretny silnik mowy rozpozna komendę; działanie Voice Control oceniamy osobno.
Platformy
Warunek wspólny: komponent interfejsu ma widoczną etykietę zawierającą tekst lub obraz tekstu. Brak testu na platformie nie jest jej wyłączeniem. Dla pozycji poza WWW podstawą jest interpretacyjna Group Note WCAG2ICT dla WCAG 2.2 z 2025-12-11, a nie osobna norma zgodności. WCAG2ICT stosuje 2.5.3 bez zmiany brzmienia; nie zamienia etykiety tekstowej w dowolną ikonę.
| ID / środowisko | Podstawa / kryterium | Stan | Warunek, zakres i adaptacja | Uzasadnienie | Weryfikacja |
|---|---|---|---|---|---|
web / WWW |
WCAG 2.2 / 2.5.3 | dotyczy warunkowo | Tekst etykiety linku, przycisku, pola lub innej kontrolki; bez adaptacji, także w przeglądarce telefonu. | Użytkownik może wskazywać widoczny napis głosem. | AI 2026-10-03; wykonanie WWW NOT-RUN |
mobile / aplikacje mobilne |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 2.5.3 | dotyczy warunkowo | Natywne kontrolki z tekstem/obrazem tekstu; bez zmiany wymagania. W hybrydzie web i native osobno. | Nazwa w platformowym API musi zachować etykietę. | AI 2026-10-03; Flutter iOS wykonany, Android NOT-RUN |
desktop / aplikacje desktopowe |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 2.5.3 | dotyczy warunkowo | Kontrolki programów z widoczną etykietą; bez zmiany wymagania. | Ten sam problem identyfikacji po tekście w interfejsie. | AI 2026-10-03; wykonanie NOT-RUN |
document / dokumenty cyfrowe poza WWW |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 2.5.3 | dotyczy warunkowo | Np. pole formularza PDF lub link z etykietą; bez zmiany. Zwykły nieinteraktywny akapit nie uruchamia warunku. | Dokument może zawierać komponenty obsługiwane przez użytkownika. | AI 2026-10-03; wykonanie NOT-RUN |
other / oprogramowanie kiosku lub TV z wizualnym UI |
WCAG 2.2 + WCAG2ICT 2025-12-11 / 2.5.3 | dotyczy warunkowo | Web jak WWW, oprogramowanie poza WWW bez zmiany; kontrolki z tekstowymi etykietami. | Rodzaj ekranu nie usuwa relacji etykiety i nazwy. Zamknięta funkcjonalność wymaga osobnej oceny dostępnych mechanizmów i ograniczeń; nie jest automatycznym wyjątkiem. | AI 2026-10-03; wykonanie i konkretna konfiguracja zamknięta NOT-RUN |
Ikona pomocy w demonstracji nie uruchamia warunku 2.5.3, bo nie ma widocznego tekstu; to granica scenariusza, nie wyłączenie aplikacji mobilnych.
Rozwiązania w technologiach
Najprostsza poprawka produkcyjna: standardowy przycisk z tekstem bez nadpisywania nazwy. Jeden lokalizowany ciąg dla widocznej etykiety i jawnej nazwy ogranicza rozbieżności; po zmianie języka, napisu lub stanu ponownie sprawdź rzeczywisty odbiornik. Dodatkowy hint nie może być jedynym miejscem etykiety.
Flutter / Dart
Fragment w metodzie build, callback showAddress dostarcza właściciel widoku:
import 'package:flutter/cupertino.dart';
CupertinoButton(
onPressed: showAddress,
child: const Text('Pokaż adres'),
)Standardowa kontrolka zachowuje tekst jako nazwę. W demonstracji świadomie nadpisano semantykę treści przycisku, aby porównać trzy nazwy bez zmiany wyglądu; excludeSemantics nie usuwa tam roli ani akcji z samego CupertinoButton. Obraz wymaga jawnej etykiety zawierającej jego napis, a dekoracyjna semantyka obrazu jest wyłączona. Zastąpienie całej semantyki przycisku bez zachowania akcji/roli byłoby inną usterką.
Android / Jetpack Compose
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@Composable
fun AddressButton(showAddress: () -> Unit) {
Button(onClick = showAddress) { Text("Pokaż adres") }
}Przycisk scala tekst dziecka. Nie zastępuj go samym „punkt Pracownia” przez contentDescription lub czyszczenie semantyki. Dla obrazu zawierającego napis przekaż ten napis jako contentDescription obrazu w przycisku i sprawdź wynik scalania, a nie tylko właściwości w kodzie. clearAndSetSemantics może usunąć nazwę, stan lub akcję i wymaga ostrożności.
iOS / SwiftUI
import SwiftUI
struct AddressButton: View {
let showAddress: () -> Void
var body: some View {
Button("Pokaż adres", action: showAddress)
}
}Tekst standardowego przycisku stanowi etykietę dostępności. Jeśli przycisk pokazuje własny obraz tekstu, ustaw accessibilityLabel przycisku na tekst widoczny w obrazie, ewentualnie z kontekstem po nim. accessibilityIdentifier służy identyfikacji, a accessibilityHint nie zastępuje nazwy. Samo poprawne odczytanie label przez XCTest nie potwierdza rozpoznawania mowy.
React Native
import { Button } from 'react-native';
type Props = { showAddress: () => void };
export function AddressButton({ showAddress }: Props) {
const label = 'Pokaż adres';
return (
<Button title={label} accessibilityLabel={label} onPress={showAddress} />
);
}Jeden ciąg zasila oba pola; accessibilityLabel nie może zastąpić etykiety synonimem. Dla Pressable z obrazem tekstu nadaj nazwę na komponencie interakcyjnym, zachowując rolę przycisku, i unikaj osobnego, dublującego celu obrazka. accessibilityHint, testID oraz wartość stanu nie są zamiennikami nazwy. Automatyczna zmiana title na wielkie litery na Androidzie nie jest sama w sobie naruszeniem 2.5.3.
| Technologia | Przegląd dokumentacji / data | Kompilacja | Działanie |
|---|---|---|---|
| Flutter | PASS, oficjalne Semantics/CupertinoButton i lokalny SDK, 2026-10-03 | Właściwa demonstracja: analiza/build iOS; wyniki poniżej. Sam krótki fragment nie był osobną aplikacją. | Host + rzeczywisty Runner na iOS Simulator; zakres poniżej. Android NOT-RUN. |
| Jetpack Compose | PASS, Button, scalanie/czyszczenie semantyki, 2026-10-03 | NOT-RUN | NOT-RUN; fragment edukacyjny, bez deklarowania użytej wersji SDK |
| SwiftUI | PASS, accessibilityLabel i API przycisku, 2026-10-03 | NOT-RUN | NOT-RUN; build Fluttera/XCTest nie jest testem SwiftUI |
| React Native | PASS, Button, accessibilityLabel/accessibilityHint, 2026-10-03 | NOT-RUN | NOT-RUN; fragment edukacyjny, bez deklarowania użytej wersji pakietu |
Jak sprawdzić
- Uruchom
/2-5-3/pickup/good,/badi/controlwe wspólnej aplikacji. Rozpoznaj widoczny napis każdego celu; raster „Pokaż godziny” trzeba obejrzeć, bo nie pochodzi z węzła Text. Ikona nie ma widocznego napisu. - Odczytaj finalną nazwę i rolę z właściwego odbiornika platformy. Ta próba czyta
XCUIElement.label,elementType,identifier,isEnabled,isHittablei ramkę oraz zapisujeXCUIApplication.debugDescription. Nie czyta nazwy z prywatnego JSON aplikacji ani z oczekiwań testu. Identyfikator jedynie wiąże cel z obserwacją. - Porównaj pełną etykietę z nazwą: good i control zawierają ją, bad nie. Nie wymagaj prefiksu w kryterium i nie sprawdzaj jedynie zbioru słów. Dla tej prostej pary nie jest potrzebna normalizacja interpunkcji ani heurystyka językowa.
- Aktywuj każdy przycisk i sprawdź wynik; wybierz następny wariant, zresetuj i sprawdź przywrócenie nazwy oraz usunięcie wyników. Nieznana trasa ma wrócić do good. Testy utrzymują te same dane we wszystkich wariantach.
- Plan — NOT-RUN: na środowisku obsługującym sterowanie głosowe, we właściwym języku, wypowiedz komendę zawierającą widoczny napis. Zapisz konfigurację, wypowiedź, reakcję, ewentualne dopasowanie przez OCR/numerowanie i wynik. Działanie przez OCR albo numer ekranu nie zastępuje poprawnej nazwy. Nie traktuj tap XCTest lub ręcznego callbacku jako tej próby.
Wyniki rzeczywistego wykonania
Próba natywna 2026-10-03, iPhone 17 Simulator / iOS 26.5, Flutter 3.44.9 (6b182d2c75), Dart 3.12.2, Xcode 27.0 (27A266a), SDK iOS Simulator 27.0. Jasny wygląd, content size large, pionowo, 402 × 874 pt / 1206 × 2622 px / skala 3; pasek 09:41 jest ustawieniem demonstracji, nie czasem próby. Obrazy i wejściowy raster obejrzano przez AI: aktualny ekran, kompletne etykiety, brak splash/pustki i retuszu. Wszystkie trzy początkowe PNG są identyczne bajtowo; różnicę nazw dokumentuje odbiornik. Metadane zawierają UTC, czasy lokalne, trasy, konfigurację, statusy, hashe źródeł/buildów i plików.
| Sprawdzenie | Rzeczywisty wynik / zakres |
|---|---|
| Flutter analyze | PASS, bez problemów, 1,3 s |
| Testy hostowe Flutter | 21 PASS, w tym nowy test semantyki i wszystkich aktywacji, cyklu/resetu/fallback; dotychczasowe adaptery iOS. Wirtualne wejście widgetu, bez Androida. |
| Build Flutter iOS / driver XCTest | PASS / PASS; build Runner 8,7 s, bez podpisu produkcyjnego |
| XCTest na uruchomionym Runner | 1 PASS, 0 failures, 182,173 s; 13 odczytów, 15 tap; smoke 2.5.2 PASS |
| Tekst i obraz tekstu | Natywne nazwy good i control zawierają całą etykietę obu przycisków; bad w obu przypadkach odtwarza FAIL badanego warunku. PASS testu oznacza potwierdzenie oczekiwanej różnicy między wariantami, nie zgodność bad. |
| Aktywacja/reset | Każdy z trzech przycisków ujawnił właściwą treść we wszystkich wariantach. Nazwy zachowane po działaniu; cykl zmienia nazwy i usuwa wyniki, reset wraca do trasy, nieznana trasa good. |
| Ikona bez tekstu | Nazwa „Pomoc”, natywna rola Button; brak widocznej etykiety tekstowej oznacza brak warunku 2.5.3 tego celu. Nie jest to pełny test 4.1.2. |
| Materiały / powtarzalna kontrola | 4 surowe screenshoty, 1 raster wejściowy, 4 drzewa, 13 odczytów i 15 żądań; check dowodów i linków PASS. Zachowano 296 wcześniejszych plików assetów/testów bez zmian hashy. |
| Głos / czytnik / człowiek | Voice Control, rozpoznawanie mowy, VoiceOver, fizyczny iPhone oraz przegląd człowieka NOT-RUN. Bez audio, filmu lub transkrypcji AT; nie są potrzebne do samej statycznej relacji nazwy–etykiety, a tor głosowy pozostaje niewykonany. |
Wyniki testów, zachowana kontrola, natywne odczyty oraz drzewa są dowodami tej próby. Snapshoty atrybutów, drzewa i PNG powstają sekwencyjnie, nie atomowo; UTC zapisano przed odczytem. Stan kontrolki i jej nazwę pobrano przez odbiornik systemowy, a nie przez deklarację w kodzie. Zakres wynika z testów hostowych, XCTest i kontroli zapisanych dowodów.
Weryfikacja i ograniczenia
Reguła deterministyczna dla znanej pary etykieta–nazwa sprawdza zawarcie całego ciągu; oczekiwania wariantów pozostają w teście/checku, poza odczytem odbiornika. To nie walidator dowolnej aplikacji ani dowód uogólnienia. Przybliżenie z drzewa pomaga uzyskać nazwę i rolę, ale nie gwarantuje znajomości widocznej etykiety: przy nadpisaniu nazwy węzeł Text może zniknąć, a raster wymaga obrazu/OCR. Brak etykiety w drzewie nie oznacza braku widocznej etykiety.
Ocena AI może wskazać prawdopodobny napis i przypisać go do celu, ale myli instrukcję, wartość pola, legendę lub etykietę. OCR i mapowanie geometrii nie są deterministycznym dowodem. Człowiek rozstrzyga przypadki symboli, formuł, nawiasów i etykiet złożonych. Nie stosuj globalnego usuwania interpunkcji ani tłumaczenia/synonimów jako warunku PASS; potrzebny jest kontekst. Brak danych daje „nie ustalono”, a nie wynik pozytywny.
Nazwa z prefiksem nie gwarantuje unikalności, dobrego opisu celu, poprawnej roli ani działania mowy. Rzeczywisty test Voice Control i czytnika ma własny zakres; sama nazwa przycisku z XCTest nie jest transkrypcją VoiceOver. Screenshot pokazuje napis i stan, bez dowodu semantyki lub ruchu/czasu. Nie przeprowadzono testu doświadczenia użytkownika ani pomiaru skuteczności walidatora.
Jak sprawdza Clearship
Clearship porównuje widoczny napis kontrolki z jej nazwą dostępną w zapisanych stanach ekranu. Napis pobiera z drzewa, a gdy go tam nie ma — z obrazu przez OCR. Porównuje ciąg słów w tej samej kolejności; opis, podpowiedź i wartość nie zastępują nazwy.
Metoda deterministyczna label-in-name-1 spełniła próg Androida w pomiarze 7 października 2026 r. Pomiar kontrolny iOS pozostaje niewykonany w bieżącym katalogu. Pełny odczyt obrazu wymaga Tesseracta: hosty skanowania nie mają tego programu, więc dla obrazu tekstu lub zastąpionej semantyki wynik może być niepełny; ponowna analiza na stacji z OCR ma odrębny zakres.
Pola z etykietą obok, przycięte kontrolki, dynamiczne stany poza zebranym przebiegiem, symbole, formuły, nawiasy oraz kwalifikacja nagłówka lub legendy wymagają człowieka. Angielski model OCR z tolerancją pomyłek może przeoczyć różnice polskich znaków i krótkie napisy; powiadomienie nad kontrolką może dać fałszywy alarm. Nazwa Androida jest przybliżeniem z dostępnych pól, a odczyt iOS pochodzi z XCTest. Metoda nie potwierdza Voice Control, VoiceOver ani osobnej treści webowej.