Ce que signifie vraiment le niveau AA
WCAG s’organise en trois niveaux. A est le plancher, AA est le niveau sur lequel s’appuient les marchés publics européens et EN 301 549, et AAA est un objectif que personne n’est tenu d’atteindre sur tout un site. Quand un appel d’offres demande « WCAG 2.2 AA », cela signifie chaque critère de succès A et AA, sur chaque page dans le périmètre, dans chaque état qu’un utilisateur peut atteindre.
Les critères de succès sont des énoncés vérifiables, pas des techniques. « Contraste (minimum) » ne vous dit pas quel token changer ; il vous dit le rapport mesuré qu’un texte doit atteindre. Cette distinction compte dans un audit : une anomalie est défendable quand elle nomme le critère, l’élément et la mesure, pas quand elle nomme un outil.
Un site ne réussit ni n’échoue dans son ensemble. La conformité est revendiquée par page, et un seul élément non conforme sur une page retire la revendication pour cette page. C’est pourquoi la surveillance continue l’emporte sur un audit ponctuel : une mise à jour de thème peut annuler la revendication de cent pages d’un coup.
Les neuf critères ajoutés par WCAG 2.2
Six d’entre eux se situent en A ou AA et entrent donc dans le périmètre d’une évaluation EN 301 549. La dernière colonne indique si un scanner peut en juger ou si une personne le doit.
| CS | Nom | Niveau | Comment c’est testé |
|---|---|---|---|
| 2.4.11 | Focus non masqué (minimum) | AA | manuel |
| 2.4.12 | Focus non masqué (amélioré) | AAA | manuel |
| 2.4.13 | Apparence du focus | AAA | manuel |
| 2.5.7 | Mouvements de glissement | AA | manuel |
| 2.5.8 | Taille de cible (minimum) | AA | automatisé |
| 3.2.6 | Aide cohérente | A | manuel |
| 3.3.7 | Saisie redondante | A | manuel |
| 3.3.8 | Authentification accessible (minimum) | AA | partiellement automatisé |
| 3.3.9 | Authentification accessible (améliorée) | AAA | manuel |
Ce que le scanner contrôle, règle par règle
Chaque règle automatisée porte les deux références : une anomalie se lit comme un critère de succès WCAG pour le développeur et comme une clause d’EN 301 549 pour l’évaluateur. Voici les règles préchargées dans la table de correspondance publique ; le catalogue dans le produit est plus vaste et maintenu de façon centralisée.74 rules seeded
| Règle | What it detects | WCAG | EN 301 549 | Impact typique |
|---|---|---|---|---|
| accesskeys | Two elements claim the same access key | 2.1.1 | 9.2.1.1 | serious |
| area-alt | Image map region without alternative text | 1.1.1, 2.4.4, 4.1.2 | 9.1.1.1, 9.2.4.4, 9.4.1.2 | critical |
| aria-allowed-attr | ARIA attribute not allowed on this role | 4.1.2 | 9.4.1.2 | critical |
| aria-command-name | Custom button, link or menu item without a name | 4.1.2 | 9.4.1.2 | serious |
| aria-hidden-body | Whole document hidden from assistive technology | 4.1.2 | 9.4.1.2 | critical |
| aria-hidden-focus | Focusable element hidden from assistive technology | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | serious |
| aria-input-field-name | Custom input field without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-meter-name | Meter without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-progressbar-name | Progress indicator without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-required-attr | ARIA role missing a required attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-required-children | Composite role without its required child roles | 1.3.1 | 9.1.3.1 | critical |
| aria-required-parent | ARIA role placed outside its required container | 1.3.1 | 9.1.3.1 | critical |
| aria-roles | Role value is not a recognised ARIA role | 4.1.2 | 9.4.1.2 | critical |
| aria-toggle-field-name | Checkbox, radio or switch without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-tooltip-name | Tooltip role without any text | 4.1.2 | 9.4.1.2 | serious |
| aria-valid-attr | Attribute name is not a valid ARIA attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-valid-attr-value | ARIA attribute points at a value that does not resolve | 4.1.2 | 9.4.1.2 | critical |
| audio-caption | Audio without a captions or transcript track | 1.2.1 | 9.1.2.1 | critical |
| autocomplete-valid | autocomplete value not recognised | 1.3.5 | 9.1.3.5 | serious |
| avoid-inline-spacing | Text spacing locked by an inline style | 1.4.12 | 9.1.4.12 | serious |
| blink | Blinking content that cannot be stopped | 2.2.2 | 9.2.2.2 | serious |
| button-name | Button without an accessible name | 4.1.2 | 9.4.1.2 | critical |
| bypass | No way to skip the repeated navigation | 2.4.1 | 9.2.4.1 | serious |
| color-contrast | Text contrast below the required ratio | 1.4.3 | 9.1.4.3 | serious |
| css-orientation-lock | Content locked to one screen orientation | 1.3.4 | 9.1.3.4 | serious |
| definition-list | Definition list built from the wrong children | 1.3.1 | 9.1.3.1 | serious |
| dlitem | Definition term or description outside a list | 1.3.1 | 9.1.3.1 | serious |
| document-title | Page has no title | 2.4.2 | 9.2.4.2 | serious |
| duplicate-id-active | Duplicate id on an interactive element | 4.1.1 | 9.4.1.1 | serious |
| empty-heading | Heading with no text | 1.3.1 | 9.1.3.1 | minor |
| empty-table-header | Table header cell with no text | 1.3.1 | 9.1.3.1 | minor |
| focus-order-semantics | Focusable element with no interactive role | 2.4.3 | 9.2.4.3 | minor |
| form-field-multiple-labels | Field bound to more than one label | 3.3.2 | 9.3.3.2 | moderate |
| frame-title | Frame without a title | 2.4.1, 4.1.2 | 9.2.4.1, 9.4.1.2 | serious |
| heading-order | Heading level skipped | 1.3.1 | 9.1.3.1 | moderate |
| html-has-lang | Page language not declared | 3.1.1 | 9.3.1.1 | serious |
| html-lang-valid | Page language code is not valid | 3.1.1 | 9.3.1.1 | serious |
| html-xml-lang-mismatch | lang and xml:lang disagree | 3.1.1 | 9.3.1.1 | moderate |
| identical-links-same-purpose | Links with the same text lead somewhere different | 2.4.9 | 9.2.4.9 | minor |
| image-alt | Image without a text alternative | 1.1.1 | 9.1.1.1 | critical |
| input-button-name | Input button with no value or label | 4.1.2 | 9.4.1.2 | critical |
| input-image-alt | Image button without alternative text | 1.1.1, 4.1.2 | 9.1.1.1, 9.4.1.2 | critical |
| label | Form field without a programmatic label | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| landmark-banner-is-top-level | Banner landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-complementary-is-top-level | Complementary landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-no-duplicate-main | More than one main landmark on the page | 1.3.1 | 9.1.3.1 | moderate |
| landmark-one-main | Page has no single main landmark | 1.3.1, 2.4.1 | 9.1.3.1, 9.2.4.1 | moderate |
| landmark-unique | Two landmarks share a role and a name | 1.3.1 | 9.1.3.1 | moderate |
| link-name | Link without discernible text | 2.4.4, 4.1.2 | 9.2.4.4, 9.4.1.2 | serious |
| list | List contains elements that are not list items | 1.3.1 | 9.1.3.1 | moderate |
| listitem | List item outside a list | 1.3.1 | 9.1.3.1 | serious |
| marquee | Scrolling marquee content | 2.2.2 | 9.2.2.2 | serious |
| meta-viewport | Zoom disabled by the viewport meta tag | 1.4.4 | 9.1.4.4 | serious |
| nested-interactive | Interactive control nested inside another | 4.1.2 | 9.4.1.2 | serious |
| no-autoplay-audio | Audio starts on its own for more than three seconds | 1.4.2 | 9.1.4.2 | moderate |
| object-alt | Embedded object without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| p-as-heading | Paragraph styled to look like a heading | 1.3.1 | 9.1.3.1 | serious |
| page-has-heading-one | Page has no level one heading | 1.3.1 | 9.1.3.1 | moderate |
| presentation-role-conflict | Presentation role cancelled by other markup | 4.1.2 | 9.4.1.2 | minor |
| region | Content sits outside any landmark | 1.3.1 | 9.1.3.1 | moderate |
| role-img-alt | Element with role img has no alternative text | 1.1.1 | 9.1.1.1 | serious |
| scrollable-region-focusable | Scrollable area cannot be reached by keyboard | 2.1.1 | 9.2.1.1 | serious |
| select-name | Select element without an accessible name | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| server-side-image-map | Server-side image map in use | 2.1.1 | 9.2.1.1 | minor |
| summary-name | Disclosure summary without a name | 4.1.2 | 9.4.1.2 | serious |
| svg-img-alt | Meaningful SVG without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| tabindex | Positive tabindex overrides the natural focus order | 2.4.3 | 9.2.4.3 | serious |
| table-fake-caption | Table title styled as a caption instead of marked as one | 1.3.1 | 9.1.3.1 | serious |
| target-size | Touch target smaller than 24 by 24 pixels | 2.5.8 | 9.2.5.8 | moderate |
| td-has-header | Data cell in a large table has no header | 1.3.1 | 9.1.3.1 | serious |
| td-headers-attr | Data cell not associated with a header | 1.3.1 | 9.1.3.1 | serious |
| th-has-data-cells | Table header with no data cells attached | 1.3.1 | 9.1.3.1 | serious |
| valid-lang | Language of a passage is not a valid code | 3.1.2 | 9.3.1.2 | serious |
| video-caption | Video without a captions track | 1.2.2 | 9.1.2.2 | critical |
Ce que l’automatisation voit et ne voit pas
Chaque score dans Conforma porte la même phrase, car le nombre n’est qu’une partie du tableau. Les règles automatisées excellent sur les propriétés mesurables et sont aveugles à l’intention.
Les tests automatisés ne couvrent qu’une partie des obstacles à l’accessibilité. Une vérification manuelle est nécessaire pour une évaluation complète.
Comment Conforma teste WCAG 2.2 AA
- Les règles automatisées s’exécutent sur chaque page d’une analyse, et chaque violation est consignée comme une anomalie avec la règle, le sélecteur, l’extrait HTML et une capture d’écran de l’élément en place.
- Chaque anomalie porte les deux références : le critère de succès WCAG et la clause d’EN 301 549, de sorte qu’un rapport se lit de la même façon pour un développeur et pour un évaluateur des achats.
- Les anomalies reçoivent une empreinte à partir de la règle, du sélecteur et du chemin. Une correction qui revient après un déploiement est signalée comme une régression au lieu d’être discrètement comptée comme un nouveau travail.
- La liste de contrôle manuelle couvre ce que les règles ne peuvent pas juger, avec preuve vidéo, la technologie d’assistance utilisée et un testeur nommé, et elle est scellée dans le même dossier de preuves que l’exécution automatisée.
Les questions que l’on nous pose à ce sujet
WCAG 2.2 AA revient-il à satisfaire la loi sur l’accessibilité ?
Non. L’European Accessibility Act est la loi, EN 301 549 est la norme harmonisée servant à la démontrer, et EN 301 549 renvoie à WCAG 2.2 niveau AA pour le contenu web. Atteindre AA est la base technique d’une déclaration, pas un certificat.
Devons-nous passer de 2.1 à 2.2 dès maintenant ?
Pour tout ce qui est nouveau, la réponse prudente est oui. WCAG 2.2 est rétrocompatible : un contenu qui satisfait 2.2 satisfait aussi 2.1, donc tester par rapport à la version la plus récente ne coûte rien et couvre les deux.
Un score automatisé parfait signifie-t-il que le site est conforme ?
Cela signifie qu’aucune violation automatisée n’a été détectée sur les pages analysées. L’utilisation au clavier, l’ordre de focus et le flux du lecteur d’écran nécessitent encore une personne avant toute revendication.