Analyser des pages à l'aide de fichiers spec
Comment utiliser les sous-commandes spec et bulk-spec pour analyser les pages à l'aide de fichiers spec
Un fichier de spécifications est un fichier JSON ou YAML qui définit une liste de pages web et les actions du navigateur à exécuter sur chaque page avant d'analyser les problèmes d'accessibilité. Utilisez axe spec pour exécuter un seul fichier de spécifications, ou axe bulk-spec pour traiter un répertoire de fichiers de spécifications.
La commande axe spec
axe spec <spec-file> <output-dir> [options]<output-dir> est l'endroit où les résultats JSON sont enregistrés. S'il est omis, les résultats sont enregistrés dans le répertoire de travail actuel.
Utilisation d'exemple :
axe spec ./axe-workflow.yaml ./axe-results --format htmlStructure du fichier spec
Un fichier spec définit un ou plusieurs projets, chacun avec une liste de pages à analyser et des actions optionnelles à effectuer sur chaque page.
Exemple YAML
projects:
- name: deque.com
id: deque.com
metadata:
products:
- CLI
environment:
- Prod
globalActions:
- dismiss modal "#CybotCookiebotDialog" with close button "#CybotCookiebotDialogBodyButtonAccept"
pageList:
- name: Deque search
url: https://www.deque.com/
actions:
- type "axe" into element "#searchform input"
- click element "#searchform button"
- wait for element ".m-search-page" to be found
- analyze
- name: Axe Dashboard
url: https://axe.deque.com/Projet
| Propriété | Type | Description |
|---|---|---|
name |
chaîne | Nom d'affichage unique du projet. |
id |
chaîne | Identifiant unique du projet. |
metadata |
objet | Optionnel. Métadonnées arbitraires pour votre cas d'utilisation (par exemple, nom du produit, environnement). |
globalActions |
tableau | Optionnel. Actions qui répondent aux changements d'état sur chaque page du projet, par exemple, fermer une bannière de cookies ou une fenêtre contextuelle d'enquête. Voir Actions globales. |
screenshot |
objet | Optionnel. Capture une capture d'écran de chaque page après l'analyse. Voir Capture de captures d'écran. |
pageList |
tableau | Liste des pages à analyser. Voir Page. |
Page
| Propriété | Type | Description |
|---|---|---|
name |
chaîne | Nom d'affichage de la page. |
url |
chaîne | URL de la page. |
actions |
tableau | Optionnel. Actions à exécuter sur la page avant ou après l'analyse. Voir Actions. |
Format JSON/YAML
Les fichiers spec peuvent être écrits en YAML ou JSON. Le tableau suivant montre les mêmes valeurs dans chaque format. Notez que dans JSON, les chaînes d'action contenant des guillemets doivent les échapper avec un antislash.
| YAML | JSON |
|---|---|
type "axe" into element "#searchform input" |
"type \"axe\" into element \"#searchform input\"" |
dismiss modal "#CybotCookiebotDialog" with close button "#CybotCookiebotDialogBodyButtonAccept" |
"dismiss modal \"#CybotCookiebotDialog\" with close button \"#CybotCookiebotDialogBodyButtonAccept\"" |
Actions
Les actions sont des chaînes de caractères dans le tableau actions (ou globalActions) d'un fichier de spécifications. Elles effectuent des tâches comme cliquer sur des boutons, remplir des formulaires, fermer des boîtes de dialogue, attendre des états de page, et réaliser des analyses d'accessibilité. Les actions s'exécutent dans l'ordre indiqué.
Il existe deux types d'actions :
- Les Actions de page s'exécutent en séquence sur une page spécifique. L'action
analyzedoit être appelée au moins une fois par page. - Les Actions globales s'exécutent sur chaque page du projet en réponse aux changements d'état. Voir Actions globales.
Exemple d'action complète
L'exemple suivant se connecte à Deque University et analyse le tableau de bord :
projects:
- name: Deque University login flow
id: deque-university-login-flow
pageList:
- name: homepage
url: https://dequeuniversity.com/
actions:
- click element ".loginLink"
- wait for element ".loginUsername" to be found
- type "user@example.com" into element ".loginUsername"
- type "secretpassword" into element "#loginPassword"
- click element "input[type=submit]"
- wait for element ".logoutLink" to be found
- analyze pageSélecteurs
De nombreuses actions prennent un argument sélecteur qui identifie un élément sur la page. Un sélecteur peut être un sélecteur CSS ou XPath, spécifié comme une seule chaîne ou une liste de chaînes.
Pour cibler des éléments à l'intérieur des iframes, vous devez utiliser une liste. Tous les sélecteurs de la liste, sauf le dernier, identifient successivement les éléments <iframe> dans lesquels naviguer, et doivent être des sélecteurs CSS. Le dernier sélecteur de la liste identifie l'élément cible et peut être un sélecteur CSS ou XPath. Chaque sélecteur de la liste est évalué par rapport au contexte du document établi par l'entrée précédente : le premier sélecteur est relatif au document racine, et chaque sélecteur iframe suivant est relatif au document à l'intérieur du cadre précédent.
Utiliser une seule chaîne (pas une liste) ne permet pas de naviguer à l'intérieur des iframes.
Exemple de sélecteur d'iframe
Considérons cette structure HTML :
<body>
<!-- root document -->
<iframe class="payment-widget">
<!-- document inside the payment-widget iframe -->
<div class="form-wrapper">
<iframe id="card-fields">
<!-- document inside the card-fields iframe -->
<form>
<input type="text" name="card-number" class="card-input">
</form>
</iframe>
</div>
</iframe>
</body>Pour cliquer sur le champ de saisie de numéro de carte, utilisez une liste de sélecteurs. Chaque sélecteur CSS est évalué dans le contexte du document établi par l'entrée précédente :
# "iframe.payment-widget" is evaluated in the root document
# "#card-fields" is evaluated in the document inside iframe.payment-widget
# ".card-input" is evaluated in the document inside #card-fields
click element [ "iframe.payment-widget", "#card-fields", ".card-input" ]Pour utiliser XPath pour l'élément cible final (les sélecteurs d'iframe doivent toujours être CSS) :
click element [ "iframe.payment-widget", "#card-fields", "//input[@name='card-number']" ]En JSON :
"click element [\"iframe.payment-widget\", \"#card-fields\", \".card-input\"]"Actions de page
Le CLI prend en charge neuf actions de page :
analyze: réaliser une analyse d'accessibilitéchange: changer la valeur d'un(e)<input>,<textarea>ou<select>via JavaScriptclick: cliquer sur un élémentdismiss: fermer une fenêtre contextuelle ou modaleeval: exécuter du JavaScript arbitrairepress: appuyer sur une touche (avec ou sans modificateurs)select: sélectionner une option dans un(e)<select>type: taper dans un(e)<input>wait: attendre un état spécifique ou faire une pause
analyze
L'action analyze exécute une analyse d'accessibilité. Elle doit être appelée au moins une fois par page. Vous pouvez l'appeler plusieurs fois pour analyser une page à différents moments d'un flux de travail (utilisez la variante with title pour distinguer les résultats).
Le paramètre optionnel ruleset spécifie quel jeu de règles utiliser. Le défaut est WCAG 2.1 AA. Jeux de règles disponibles :
| ID de l'ensemble de règles | Norme |
|---|---|
wcag2 |
WCAG 2.0 AA |
wcag2.1 |
WCAG 2.1 AA (par défaut) |
wcag2.2 |
WCAG 2.2 AA |
wcag2aaa |
WCAG 2.0 AAA |
wcag2.1aaa |
WCAG 2.1 AAA |
wcag2.2aaa |
WCAG 2.2 AAA |
508 |
Section 508 |
ttv5 |
Trusted Tester v5 |
en301549 |
EN 301 549 |
rgaav4 |
RGAA v4 |
Pour des informations sur l'inclusion ou l'exclusion d'éléments, voir documentation de l'API axe-core sur le paramètre Context.
# Analyze using the WCAG 2.1 AA ruleset (default) — all three forms are equivalent
analyze
analyze the page
analyze page
# Analyze using the Section 508 ruleset
analyze page with ruleset "508"
# Analyze with a custom title (useful when analyzing a page multiple times)
analyze the page with title "after login"
# Analyze only a specific element
analyze only element "#main-content"
# Analyze only specific elements
analyze only element "#idOfElement" and element ".classToAnalyze"
# Analyze everything except images that are immediate children of paragraphs
analyze the page excluding element "p > img"
# Analyze everything except elements inside a frame with a specific class
analyze the page excluding element [ ".classOfFrameToExclude", "#idOfElement" ]
# Save results to a specific directory
analyze the page and save in "./homepage-team/"
# Save a copy to an additional directory while also saving to the default location
analyze the page and save a copy in "./homepage-team/"
# Use the axe-core library's built-in default ruleset
analyze the page with the source default rulesetExemple combinant plusieurs options : Analyser uniquement les images à l'intérieur des éléments avec la classe third-party et les formulaires qui ne sont pas validés lors de la soumission, en excluant les éléments avec la classe old-api, en utilisant le jeu de règles 508, avec un titre personnalisé et un emplacement d'enregistrement personnalisé.
analyze only element [ ".third-party", "img"] and element "form[novalidate]" excluding element ".old-api" with ruleset "508" with title "What is this testing" and save in "Results for Some test"En JSON :
"analyze only element [\".third-party\", \"img\"] and element \"form[novalidate]\" excluding element \".old-api\" with ruleset \"508\" with title \"What is this testing\" and save in \"Results for Some test\""change
L'action change change la valeur d'un élément <input>, <textarea> ou <select> via JavaScript. Utilisez change lorsque les événements DOM normaux ne sont pas disponibles.
# Change the value of an input
change the value of "input[name=song]" to "too many puppies"click
L'action click clique sur le premier élément qui correspond au sélecteur donné.
# Click a button by class selector
click element ".myButton"
# Click the body element
click "body"dismiss
L'action dismiss ferme une fenêtre contextuelle ou modale en cliquant sur son bouton de fermeture. Fournissez un sélecteur CSS pour le conteneur modal et un autre pour le bouton de fermeture. L'action échoue gracieusement si l'un des éléments est manquant.
Cette action ne ferme pas les boîtes de dialogue natives alert() ou confirm().
# Dismiss a modal using separate selectors for the container and close button
dismiss modal ".myModal" with close button ".myModal .close"eval
L'action eval exécute du JavaScript arbitraire sur la page. Utilisez-la pour manipuler le DOM ou réaliser des actions personnalisées.
# Change the page title
eval "document.title = 'hello world'"
# Scroll an element into view
eval "document.querySelector('.someElement').scrollIntoView()"
# Scroll to the bottom of the page
eval "window.scrollTo(0, document.body.scrollHeight)"press
L'action press envoie une pression de touche à un élément (éventuellement avec des touches modificateurs). Pour les noms de touches pris en charge, voir le documentation des touches Selenium.
# Press H on the body element
press "H" on "body"
# Press Shift+Tab on the navigation element
press "shift+tab" on element ".navigation"
# Press Shift+Control+7 on an element
press "shift+control+7" on element ".foo"select
L'action select sélectionne une <option> d'un élément <select> par son texte visible (pas son attribut value).
Étant donné cet HTML :
<select class="mySelect">
<option></option>
<option value="1">dog</option>
<option value="2">cat</option>
<option value="3">fish</option>
</select># Select by visible option text
select the "dog" option in ".mySelect"
select the "cat" option in element ".mySelect"type
L'action type tape une chaîne de caractères dans un élément <input> ou <textarea>. Utilisez-la pour remplir des formulaires et des champs de recherche.
# Type into an email input
type "user@example.com" into element "input[type=email]"
# Type into a textarea
type "hello world" into "textarea.Message"
# Type with a delay between keystrokes to simulate human typing
type "sloth" into "input[type=search]" with a 150ms key delaywait
L'action wait attend qu'un élément atteigne un état spécifié, ou fait une pause pendant une durée donnée.
États des éléments pris en charge : visible, hidden, selected, enabled, disabled, found.
Pour les attentes d'état d'élément, l'action réessaie jusqu'à 3 fois par défaut (4 tentatives au total) avant d'échouer. Pour attendre plus longtemps un élément qui charge lentement, ajoutez with <n> retries pour augmenter le nombre de tentatives.
Pour la durée des pauses, les valeurs numériques sont interprétées en millisecondes. Les chaînes sont converties en utilisant le package ms, par exemple: 1m = 60 000 ms, 1s = 1 000 ms.
# Wait for an element to appear
wait for element ".myElement" to be found
# Wait for an element to become hidden
wait for element ".myElement" to be hidden
# Allow more retries for a slow-loading element
wait for element ".myElement" to be found with 9 retries
# Sleep for 1 minute
wait for 1m
# Sleep for 1 second
wait for 1s
# Sleep for 30 milliseconds
wait for 30Actions globales
Les actions globales s'exécutent sur chaque page d'un projet en réponse aux changements d'état, plutôt que de s'exécuter de manière procédurale comme les actions de page. Une seule action globale est actuellement prise en charge : dismiss modal.
- Les actions globales fonctionnent à la fois en mode
specet en mode URI sans tête. - Les actions globales ne sont pas procédurales : elles se déclenchent en réponse aux événements de la page, et non dans une séquence fixe.
- L'action globale
dismiss modalattend qu'une fenêtre modale spécifiée apparaisse et la ferme avant que les actions de page ne continuent.
Ajoutez des actions globales à un projet après name/id et avant pageList :
projects:
- id: demo
name: CLI demo
globalActions:
- dismiss modal "#__next .survey" with close button ".survey button.close"
pageList:
- name: homepage
url: https://dequelabs.github.io/aget-demo-site
- name: popup
url: https://dequelabs.github.io/aget-demo-site
actions:
- wait for element "#__next header nav" to be visible
- click element "#__next header nav a[href*=popup]"
- wait for element ".content button" to be found
- analyze with title "before popup"
- click element ".content button"
- analyze with title "with popup"
- dismiss modal ".ReactModal__Content" with close button ".ReactModal__Content .close"
- analyze with title "after popup"
- name: contact
url: https://dequelabs.github.io/aget-demo-site/contact
actions:
- analyze with title "form disabled"
- wait for element "#__next .toggle" to be found
- click element ".toggle button"
- wait for element "input[name=name]" to be enabled
- analyze with title "form enabled"
- type "stephen" into element "input[name=name]"
- type "555-555-5555" into element "input[name=phone]"
- type "stephen@deque.com" into element "input[name=email]"
- type "hello world" into element "textarea[name=message]"
- click element "button[type=submit]"
- wait for element ".thanks" to be found
- analyze with title "thanks message"Capture de captures d'écran
Pour capturer une capture d'écran de chaque page après l'analyse, ajoutez un objet screenshot à un projet dans votre fichier de spécifications. Chaque page produit un fichier PNG nommé <page-id>-screenshot.png (toute / ou \ dans id de la page est remplacée par _). Si une page n'a pas de id, une est dérivée de son name en supprimant tous les espaces.
| Propriété | Type | Défaut | Description |
|---|---|---|---|
enabled |
booléen | — | Obligatoire. Réglez sur true pour activer la capture d'écran. Fonctionne avec tous les navigateurs pris en charge. |
fullPage |
booléen | false |
Capture la page complète défilable en utilisant le protocole Chrome DevTools. Nécessite Chrome ou Chromium ; les autres navigateurs reviennent à une capture d’écran du viewport avec un avertissement. |
boundingBoxes |
booléen | false |
Ajoute les coordonnées de la boîte englobante (x, y, width et height) à chaque nœud de violation dans les résultats d'Axe, enregistrant où l'élément apparaît dans la capture d'écran. |
dir |
chaîne | <output-dir>/<project-id>/ |
Répertoire où les fichiers PNG des captures d’écran sont écrits. |
Lorsque vous exécutez axe spec avec --verbose, chaque résultat inclut également un champ screenshotPath avec le chemin complet vers le fichier de capture d'écran de cette page.
projects:
- name: My App
id: my-app
screenshot:
enabled: true
fullPage: true
boundingBoxes: true
dir: ./screenshots
pageList:
- name: Home
url: https://example.com/Traitement par lot avec axe bulk-spec
Pour traiter plusieurs fichiers de spécifications en une seule fois, utilisez axe bulk-spec avec un répertoire contenant des fichiers de spécifications. L'interface de ligne de commande recherche récursivement dans le répertoire et ses sous-répertoires des fichiers de spécifications.
axe bulk-spec <spec-files-directory> <output-directory>Le <output-directory> est optionnel — s'il est omis, les résultats sont enregistrés dans le répertoire de travail actuel.
Les mises à jour de progression sont imprimées sur stdout pendant l'exécution.
Les résultats sont écrits dans le répertoire de sortie : un fichier JSON par action analyze, plus un fichier journal répertoriant les fichiers de spécifications qui ont échoué et la raison de l'échec.
Options
Les options suivantes sont disponibles pour axe spec :
--axe-devhub-api-key <api-key>
Spécifie la clé API du Axe Developer Hub. Requis (avec --axe-devhub-project-id) pour envoyer les résultats à Axe Developer Hub. Voir Envoyer les résultats à Axe Developer Hub.
--axe-devhub-project-id <project-id>
Spécifie l'ID de projet du Axe Developer Hub. Requis (avec --axe-devhub-api-key) pour envoyer les résultats à Axe Developer Hub. Voir Envoyer les résultats à Axe Developer Hub.
--axe-devhub-server-url <url>
Spécifie l'URL du serveur Axe Developer Hub. Par défaut, https://axe.deque.com. Équivalent à la variable d'environnement AXE_DEVHUB_SERVER_URL. Voir Envoyer les résultats à Axe Developer Hub.
-a, --axe-source <path>
Chemin vers un fichier alternatif axe.js. La plupart des utilisateurs n'ont pas besoin de cette option. Elle est destinée aux cas d'utilisation avancés comme les tests contre une version spécifique ou corrigée de axe-core.
--chrome-options [options]
Passe une liste de commutateurs en ligne de commande de Chrome séparés par des virgules à ChromeDriver. Utilisez cela pour activer des fonctionnalités du navigateur ou contourner des restrictions dans des environnements spécifiques, par exemple dans des environnements CI conteneurisés où le sandbox doit être désactivé.
axe spec workflow.yml --chrome-options="no-sandbox,disable-gpu"-c, --custom <path>
Spécifie un fichier de règles personnalisé, remplaçant le jeu de règles par défaut.
--descendant-links
Récupère les liens de chaque page et les ajoute aux résultats. Nécessite --verbose.
--dismiss-alerts
Ferme automatiquement les dialogues de navigateur alert(), confirm() et prompt() avant l'analyse.
--enable-tracking <state>
Active l'envoi de données à la bibliothèque de métriques.
--filter <type(s)>
Filtre les types de résultats de la sortie : passes, violations, incomplete, inapplicable. Nécessite --format csv.
-f, --format <type(s)>
Format(s) de rapport : html, junit, csv, universal ou une combinaison séparée par des virgules. Par défaut : html. Voir --universal-ruleset et --universal-best-practices pour les options applicables lors de l'utilisation de universal.
--no-analyze
Supprime l'exigence d'une action analyze dans la liste d'actions de chaque page. Par défaut, chaque page dans un fichier de spécifications doit inclure au moins une action analyze ; ce drapeau désactive cette vérification, ce qui est utile lors de l'exécution d'un workflow qui effectue uniquement des actions sans exécuter une analyse d'accessibilité.
--no-exit
Force le CLI à quitter avec le code 0 même lorsque des violations sont trouvées. Par défaut, axe spec quitte avec le code 1 si des violations sont détectées. Utilisez cela lorsque vous souhaitez collecter des résultats sans échouer à une construction CI.
--no-git-data
Exclut les informations de branche et de commit Git lors de l'envoi des résultats à Axe Developer Hub. Voir Envoyer les résultats à Axe Developer Hub.
--no-html
Empêche le CLI de générer un rapport HTML. Utilisez ceci avec --format pour contrôler les formats de rapport écrits, ou lorsque vous souhaitez uniquement des résultats JSON sans un résumé HTML.
--no-reports
Empêche le CLI de générer tout fichier de rapport. Les résultats sont toujours collectés et affichés dans le terminal, mais rien n'est écrit sur le disque. Utile pour des vérifications rapides où les fichiers de sortie ne sont pas nécessaires.
--no-wait
Désactive la pause automatique entre les actions de workflow. Par défaut, les pauses configurées avec --post-get-pause, --post-script-pause et --post-analyze-pause s'appliquent entre les actions (voir Configurer) ; ce drapeau les contourne toutes.
--page-name <name>
Exécute uniquement la page avec le nom spécifié dans le pageList du fichier de spécifications.
--page-source
Ajoute le code source HTML analysé aux résultats. Nécessite --verbose.
--page-title
Ajoute le titre de la page aux résultats. Nécessite --verbose.
--remote-proxy <proxy-server>
Route le trafic via le serveur proxy distant spécifié.
--resume-from <name>
Ignore toutes les pages avant la page nommée dans le pageList du fichier de spécifications.
--scanned-url
Ajoute l'URL de base et l'URL d'analyse actuelle aux résultats détaillés. Uniquement pour Chrome. Nécessite --verbose.
--set-distinct-id <id>
Remplace la valeur de l'ID distinct.
--set-legacy-mode
Active le legacy obsolète, qui sera supprimé dans la version v5.0.
Ceci est une option de dernier recours. Il a été signalé qu'il permet de compléter les analyses sur des pages qui surchargent window.open(), une pratique déconseillée.
--set-tracking-url <url>
Remplace l'URL où les données de métriques sont envoyées.
--silent-mode
Supprime tout texte décoratif de la sortie CLI. Les résultats ne sont affichés que lorsque --verbose est également actif. Utilisez ceci dans les scripts ou les pipelines CI où vous souhaitez une sortie propre sans bannières de progression ou messages de statut.
-t, --tags
Filtre le jeu de règles standard par balise.
--universal-best-practices
Enregistre bestPracticesEnabled=true dans les métadonnées de la sortie au format universel. Nécessite --format universal.
--universal-ruleset <id>
Spécifie l'ID du jeu de règles à enregistrer dans les métadonnées de la sortie au format universel. Par défaut, wcag2.1. Nécessite --format universal. Voir le tableau des jeux de règles pour les valeurs valides.
--user-agent
Définit une chaîne d'agent utilisateur personnalisée pour le navigateur.
--validate
Valide votre fichier de spécifications sans l'exécuter.
-v, --verbose
Inclut des sorties supplémentaires : résultats Axe et métadonnées telles que le nom de l'outil, la version et l'environnement.
--wait-network-idle-new-connections [number]
Le nombre de nouvelles connexions réseau pouvant être établies avant que le réseau soit considéré comme inactif. Une fois que les nouvelles connexions tombent à ou en dessous de ce seuil, le CLI procède à l'analyse. Utilisez ceci avec --wait-network-idle-timeout pour ajuster le moment où le CLI s'exécute sur les pages avec une activité réseau en arrière-plan en cours.
--wait-network-idle-open-connections [number]
Le nombre de connexions réseau ouvertes pouvant rester avant que le réseau ne soit considéré comme inactif. Une fois que les connexions ouvertes tombent à ce seuil ou en dessous, le CLI procède à l'analyse.
--wait-network-idle-polling-every [ms]
L'intervalle en millisecondes auquel le CLI vérifie si le réseau est devenu inactif. Réduisez cette valeur pour une détection plus rapide au prix d'une utilisation accrue du CPU.
--wait-network-idle-timeout [ms]
Le temps maximum en millisecondes à attendre pour que l'activité réseau se stabilise avant de commencer l'analyse. Après le chargement de la page, le CLI surveille les connexions réseau actives et attend jusqu'à ce que le nombre de connexions atteigne le seuil configuré. Si le délai expire avant que le réseau ne devienne inactif, le CLI procède quand même à l'analyse.
Pour des options de configuration supplémentaires, voir Configurer.
