Seiten mit Spec-Dateien analysieren
Wie man die Befehle spec und bulk-spec verwendet, um Seiten mit Spec-Dateien zu analysieren
Eine Spec-Datei ist eine JSON- oder YAML-Datei, die eine Liste von Webseiten und die Browseraktionen definiert, die auf jeder Seite vor der Analyse auf Barrierefreiheitsprobleme ausgeführt werden sollen. Verwenden Sie axe spec , um eine einzelne Spec-Datei auszuführen, oder axe bulk-spec , um ein Verzeichnis von Spec-Dateien zu verarbeiten.
- Der
axe specBefehle - Struktur der Spec-Datei
- Aktionen
- Selektoren
- Globale Aktionen
- Stapelverarbeitung mit
axe bulk-spec - Optionen
Der axe spec Befehl
axe spec <spec-file> <output-dir> [options]Der Speicherort <output-dir> ist, wo JSON-Ergebnisse gespeichert werden. Wenn ausgelassen, werden die Ergebnisse im aktuellen Arbeitsverzeichnis gespeichert.
Beispielverwendung:
axe spec ./axe-workflow.yaml ./axe-results --format htmlStruktur der Spec-Datei
Eine Spec-Datei definiert ein oder mehrere Projekte, jedes mit einer Liste von Seiten, die analysiert werden sollen, und optionalen Aktionen, die auf jeder Seite ausgeführt werden sollen.
YAML-Beispiel
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/Projekt
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
name |
Zeichenkette | Eindeutiger Anzeigename des Projekts. |
id |
Zeichenkette | Eindeutige Kennung des Projekts. |
metadata |
Objekt | Optional. Beliebige Metadaten für Ihren Anwendungsfall (z.B. Produktname, Umgebung). |
globalActions |
Array | Optional. Aktionen, die auf Zustandsänderungen auf jeder Seite im Projekt reagieren, wie z.B. das Schließen eines Cookie-Banners oder eines Umfrage-Pop-ups. Siehe Globale Aktionen. |
pageList |
Array | Liste der zu analysierenden Seiten. Siehe Seite. |
Seite
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
name |
Zeichenkette | Anzeigename der Seite. |
url |
Zeichenkette | URL der Seite. |
actions |
Array | Optional. Aktionen, die vor oder nach der Analyse auf der Seite ausgeführt werden sollen. Siehe Aktionen. |
JSON/YAML-Format
Spezifikationsdateien können in YAML oder JSON geschrieben werden. Die folgende Tabelle zeigt die gleichen Werte in jedem Format. Beachten Sie, dass in JSON Aktionsstrings, die doppelte Anführungszeichen enthalten, sie mit einem Backslash maskieren müssen.
| 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\"" |
Aktionen
Aktionen sind Strings im actions (oder globalActions) Array einer Spezifikationsdatei. Sie führen Aufgaben aus wie das Klicken auf Schaltflächen, das Ausfüllen von Formularen, das Schließen von Dialogen, das Warten auf Seitenzustände und das Durchführen von Barrierefreiheitsanalysen. Aktionen werden in der aufgelisteten Reihenfolge ausgeführt.
Es gibt zwei Arten von Aktionen:
- Seitenaktionen werden in einer bestimmten Reihenfolge auf einer bestimmten Seite ausgeführt. Die
analyzeAktion muss mindestens einmal pro Seite aufgerufen werden. - Globale Aktionen werden auf jeder Seite des Projekts als Reaktion auf Zustandsänderungen ausgeführt. Siehe Globale Aktionen.
Komplettes Aktionsbeispiel
Das folgende Beispiel loggt sich in die Deque University ein und analysiert das Dashboard:
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 pageSelektoren
Viele Aktionen erfordern ein Selektor-Argument, das ein Element auf der Seite identifiziert. Ein Selektor kann ein CSS-Selektor oder ein XPath-Selektor sein, angegeben als einzelner String oder als Liste von Strings.
Um Elemente innerhalb von iframes anzusprechen, müssen Sie eine Liste verwenden. Alle Selektoren in der Liste, außer dem letzten, identifizieren aufeinanderfolgende <iframe> Elemente, in die navigiert werden muss, und müssen CSS-Selektoren sein. Der letzte Selektor in der Liste identifiziert das Zielelement und kann ein CSS- oder XPath-Selektor sein. Jeder Selektor in der Liste wird relativ zum Dokumentkontext ausgewertet, der durch den vorherigen Eintrag festgelegt wird: Der erste Selektor ist relativ zum Root-Dokument, und jeder nachfolgende iframe-Selektor ist relativ zum Dokument innerhalb des vorhergehenden iframes.
Die Verwendung eines einzelnen Strings (keiner Liste) kann nicht in iframes navigieren.
Iframe-Selektor-Beispiel
Betrachten Sie diese HTML-Struktur:
<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>Um das Kartennummer-Eingabefeld zu klicken, verwenden Sie eine Selektorliste. Jeder CSS-Selektor wird innerhalb des Dokumentkontexts ausgewertet, der durch den vorherigen Eintrag festgelegt wird:
# "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" ]Um XPath für das endgültige Zielelement zu verwenden (die iframe-Selektoren müssen weiterhin CSS sein):
click element [ "iframe.payment-widget", "#card-fields", "//input[@name='card-number']" ]In JSON:
"click element [\"iframe.payment-widget\", \"#card-fields\", \".card-input\"]"Seitenaktionen
Die CLI unterstützt neun Seitenaktionen:
analyze: eine Barrierefreiheitsanalyse durchführenchange: den Wert eines<input>,<textarea>oder<select>über JavaScript ändernclick: ein Element klickendismiss: ein Popup oder Modal schließeneval: beliebigen JavaScript-Code ausführenpress: eine Taste drücken (mit oder ohne Modifikatoren)select: eine Option in einem<select>type: in ein<input>wait: auf einen bestimmten Zustand warten oder schlafen
analyze
Die analyze Aktion führt eine Barrierefreiheitsanalyse durch. Sie muss mindestens einmal pro Seite aufgerufen werden. Sie können sie mehrfach aufrufen, um eine Seite an verschiedenen Punkten in einem Workflow zu analysieren (verwenden Sie die with title Variante, um die Ergebnisse zu unterscheiden).
Der optionale ruleset Parameter gibt an, welches Regelwerk verwendet werden soll. Der Standard ist WCAG 2.1 AA. Verfügbare Regelsätze:
| Regelsatz-ID | Standard |
|---|---|
wcag2 |
WCAG 2.0 AA |
wcag2.1 |
WCAG 2.1 AA (Standard) |
wcag2.2 |
WCAG 2.2 AA |
wcag2aaa |
WCAG 2.0 AAA |
wcag2.1aaa |
WCAG 2.1 AAA |
wcag2.2aaa |
WCAG 2.2 AAA |
508 |
Abschnitt 508 |
ttv5 |
Trusted Tester v5 |
en301549 |
EN 301 549 |
rgaav4 |
RGAA v4 |
Für Informationen über das Ein- oder Ausschließen von Elementen siehe die Axe-Core-API-Dokumentation zum Kontext-Parameter.
# 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 rulesetBeispiel zur Kombination mehrerer Optionen: Analysiere nur Bilder innerhalb von Elementen mit der Klasse third-party und Formulare, die bei der Übermittlung nicht validiert werden, unter Ausschluss von Elementen mit der Klasse old-api, unter Verwendung des 508 Regelsatzes, mit einem benutzerdefinierten Titel und einem benutzerdefinierten Speicherort.
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"In 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
Die change Aktion ändert den Wert eines <input>, <textarea>oder <select> Elements über JavaScript. Verwende change , wenn normale DOM-Ereignisse nicht verfügbar sind.
# Change the value of an input
change the value of "input[name=song]" to "too many puppies"click
Die click Aktion klickt auf das erste Element, das mit dem angegebenen Selektor übereinstimmt.
# Click a button by class selector
click element ".myButton"
# Click the body element
click "body"dismiss
Die dismiss Aktion schließt ein Pop-up oder Modal, indem sie auf dessen Schaltfläche „Schließen“ klickt. Gib einen CSS-Selektor für das Modal-Container und einen weiteren für die Schaltfläche „Schließen“ an. Die Aktion schlägt fehl, ohne dass ein Fehler angezeigt wird, wenn eines der Elemente nicht vorhanden ist.
Diese Aktion schließt keine nativen alert() oder confirm() Dialoge.
# Dismiss a modal using separate selectors for the container and close button
dismiss modal ".myModal" with close button ".myModal .close"eval
Die eval Aktion führt beliebiges JavaScript auf der Seite aus. Verwende sie, um das DOM zu manipulieren oder benutzerdefinierte Aktionen durchzuführen.
# 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
Die press Aktion sendet einen Tastendruck an ein Element (optional mit Modifikatortasten). Für unterstützte Tastenbezeichnungen siehe die Selenium-Dokumentation für Tasten.
# 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
Die select Aktion wählt ein <option> eines <select> Elements anhand seines sichtbaren Textes (nicht anhand seines value Attributes).
Angenommen folgendes 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
Die type Aktion tippt eine Zeichenkette in ein ",
"context": "paragraph <input> oder ",
"context": "paragraph <textarea> Element. Verwenden Sie es, um Formulare auszufüllen und Suchfelder zu befüllen.",
"context": "paragraph
# 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
Die ",
"context": "paragraph wait Aktion wartet entweder darauf, dass ein Element einen bestimmten Zustand erreicht, oder pausiert für eine angegebene Dauer.",
"context": "paragraph
Unterstützte Elementzustände: ",
"context": "paragraph visible, ",
"context": "paragraph hidden, ",
"context": "paragraph selected, ",
"context": "paragraph enabled, ",
"context": "paragraph disabled, ",
"context": "paragraph found.",
"context": "paragraph
Für Pausendauern werden numerische Werte als Millisekunden interpretiert. Zeichenketten werden mithilfe des ",
"context": "paragraph **ms**",
"context": "strong text Pakets konvertiert — zum Beispiel, ",
"context": "paragraph 1m = 60.000 ms, ",
"context": "paragraph 1s = 1.000 ms.",
"context": "paragraph
# 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
# Sleep for 1 minute
wait for 1m
# Sleep for 1 second
wait for 1s
# Sleep for 30 milliseconds
wait for 30Globale Aktionen", "context": "heading level 2
Globale Aktionen laufen auf jeder Seite eines Projekts als Reaktion auf Zustandsänderungen, anstatt prozedural wie Seitenaktionen zu laufen. Derzeit wird nur eine globale Aktion unterstützt: ",
"context": "paragraph dismiss modal.",
"context": "paragraph
- Globale Aktionen funktionieren sowohl im ",
"context": "paragraph
specModus als auch im Headless-URI-Modus.", "context": "paragraph - Globale Aktionen sind nicht prozedural — sie werden durch Ereignisse auf der Seite ausgelöst, nicht in einer festen Reihenfolge.", "context": "paragraph
- Die ",
"context": "paragraph
dismiss modalglobale Aktion wartet darauf, dass ein bestimmtes Modal erscheint und schließt es, bevor Seitenaktionen fortgesetzt werden.", "context": "paragraph
Fügen Sie globale Aktionen zu einem Projekt hinzu nach ",
"context": "paragraph name/",
"context": "paragraphid und vor ",
"context": "paragraph pageList:",
"context": "paragraph
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"Stapelverarbeitung mit ",
"context": "heading level 2 axe bulk-spec
Um mehrere Spezifikationsdateien in einem einzigen Durchlauf zu verarbeiten, verwenden Sie ",
"context": "paragraph axe bulk-spec mit einem Verzeichnis, das Spezifikationsdateien enthält. Die CLI durchsucht rekursiv das Verzeichnis und seine Unterverzeichnisse nach Spezifikationsdateien.",
"context": "paragraph
axe bulk-spec <spec-files-directory> <output-directory>Die ",
"context": "paragraph <output-directory> ist optional — falls weggelassen, werden die Ergebnisse im aktuellen Arbeitsverzeichnis gespeichert.",
"context": "paragraph
Fortschrittsaktualisierungen werden während des Ablaufs an ",
"context": "paragraph stdout ausgegeben.",
"context": "paragraph
Ergebnisse werden im Ausgabeverzeichnis gespeichert: eine JSON-Datei pro ",
"context": "paragraph analyze Aktion, plus eine Protokolldatei, die alle fehlgeschlagenen Spezifikationsdateien und den Grund für das Scheitern auflistet.",
"context": "paragraph
Optionen", "context": "heading level 2
Die folgenden Optionen sind verfügbar für ",
"context": "paragraph axe spec:",
"context": "paragraph
--axe-devhub-api-key <api-key>
Gibt den API-Schlüssel des Axe Developer Hub an. Erforderlich (zusammen mit ",
"context": "paragraph --axe-devhub-project-id), um Ergebnisse an Axe Developer Hub zu senden. Siehe ",
"context": "paragraph Ergebnisse an Axe Developer Hub senden",
"context": "link text.",
"context": "paragraph
--axe-devhub-project-id <project-id>
Gibt die Projekt-ID des Axe Developer Hub an. Erforderlich (zusammen mit ",
"context": "paragraph --axe-devhub-api-key), um Ergebnisse an Axe Developer Hub zu senden. Siehe ",
"context": "paragraph Ergebnisse an Axe Developer Hub senden",
"context": "link text.",
"context": "paragraph
--axe-devhub-server-url <url>
Gibt die URL des Axe Developer Hub Servers an. Standardmäßig ",
"context": "paragraph https://axe.deque.com. Entspricht der AXE_DEVHUB_SERVER_URL Umgebungsvariable. Siehe Ergebnisse an Axe Developer Hub senden.
-c, --custom <path>
Gibt eine benutzerdefinierte Regeldatei an, die die Standardregeldatei überschreibt.
--descendant-links
Sammelt die Links auf jeder Seite und fügt sie den Ergebnissen hinzu. Erfordert --verbose.
--dismiss-alerts
Blendet automatisch Browser- alert(), confirm()und prompt() Dialogfelder, bevor gescannt wird.
--enable-tracking <state>
Ermöglicht das Senden von Daten an die Metrikbibliothek.
--filter <type(s)>
Filtert Ergebnistypen aus dem Output: passes, violations, incomplete, inapplicable. Erfordert --format csv.
-f, --format <type(s)>
Berichtsformate: html, junit, csv, oder eine kommagetrennte Kombination. Standard: html.
--no-git-data
Schließt git-Branch- und Commit-Informationen aus, wenn Ergebnisse an Axe Developer Hub gesendet werden. Siehe Ergebnisse an Axe Developer Hub senden.
--page-name <name>
Führt nur die Seite mit dem angegebenen Namen aus der Spezifikationsdatei aus pageList.
--page-source
Fügt den gescannten HTML-Quellcode den Ergebnissen hinzu. Erfordert --verbose.
--page-title
Fügt den Seitentitel den Ergebnissen hinzu. Erfordert --verbose.
--remote-proxy <proxy-server>
Leitet den Datenverkehr über den angegebenen Remote-Proxyserver.
--resume-from <name>
Überspringt alle Seiten vor der benannten Seite in der Spezifikationsdatei pageList.
--scanned-url
Fügt die Basis-URL und die aktuelle Scan-URL den ausführlichen Ergebnissen hinzu. Nur Chrome. Erfordert --verbose.
--set-distinct-id <id>
Überschreibt den Wert der eindeutigen ID.
--set-legacy-mode
Aktiviert den veralteten Legacy-Scanmodus, der in Version 5.0 entfernt wird.
Dies ist eine Notlösung. Es wurde berichtet, dass damit Scans auf Seiten abgeschlossen werden können, die window.open()abschaffen, eine nicht empfohlene Praxis.
--set-tracking-url <url>
Überschreibt die URL, an die Metrikdaten gesendet werden.
-t, --tags
Filtert das Standardregelset nach Tag.
--user-agent
Setzt einen benutzerdefinierten User-Agent-String für den Browser.
--validate
Überprüft Ihre Spezifikationsdatei, ohne sie auszuführen.
-v, --verbose
Beinhaltet zusätzliche Ausgaben: Axe-Ergebnisse und Metadaten wie Toolname, Version und Umgebung.
Für zusätzliche Konfigurationsoptionen siehe Konfigurieren.
