Seiten mit Spec-Dateien analysieren
Wie man die Unterbefehle spec und bulk-spec verwendet, um Seiten mithilfe von Spec-Dateien zu analysieren
Eine Spec-Datei ist eine JSON- oder YAML-Datei, die eine Liste von Webseiten und die Browserverhalten angibt, die auf jeder Seite ausgeführt werden sollen, bevor sie auf Barrierefreiheitsprobleme analysiert werden. Verwenden Sie axe spec zum Ausführen einer einzelnen Spec-Datei oder axe bulk-spec zum Verarbeiten eines Verzeichnisses mit Spec-Dateien.
Der axe spec Befehl
axe spec <spec-file> <output-dir> [options]Der <output-dir> ist, wo JSON-Ergebnisse gespeichert werden. Wenn ausgelassen, werden die Ergebnisse im aktuellen Arbeitsverzeichnis gespeichert.
Beispielnutzung:
axe spec ./axe-workflow.yaml ./axe-results --format htmlSpec-Datei-Struktur
Eine Spec-Datei definiert ein oder mehrere Projekte, jedes mit einer Liste von Seiten zur Analyse und optionalen Aktionen, die auf jeder Seite ausgeführt werden.
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 | Eindeutiger Bezeichner 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, zum Beispiel das Schließen eines Cookie-Banners oder einer Umfrage-Popup. 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 auf der Seite vor oder nach der Analyse ausgeführt werden. Siehe Aktionen. |
JSON/YAML-Format
Spec-Dateien können in YAML oder JSON geschrieben werden. Die folgende Tabelle zeigt die gleichen Werte in jedem Format. Beachten Sie, dass in JSON Aktionszeichenfolgen, die Anführungszeichen enthalten, mit einem Backslash versehen werden 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 Zeichenfolgen im actions (oder globalActions) Array einer Spezifikationsdatei. Sie führen Aufgaben wie das Klicken von Buttons, das Ausfüllen von Formularen, das Schließen von Dialogen, das Warten auf Seitenzustände und das Durchführen von Barrierefreiheitsanalysen aus. Aktionen werden in der aufgelisteten Reihenfolge ausgeführt.
Es gibt zwei Arten von Aktionen:
- Seitenaktionen werden in Sequenz auf einer bestimmten Seite ausgeführt. Die
analyzeAktion muss mindestens einmal pro Seite aufgerufen werden. - Globale Aktionen werden auf jeder Seite im Projekt als Reaktion auf Zustandsänderungen ausgeführt. Siehe Globale Aktionen.
Vollständiges Aktionsbeispiel
Das folgende Beispiel meldet sich bei Deque University an 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 benötigen 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 eine Liste von Strings.
Um Elemente innerhalb von iframes zu zielen, muss eine Liste verwendet werden. Alle Selektoren in der Liste außer dem letzten identifizieren aufeinander folgende <iframe> Elemente, in die navigiert werden muss, und müssen CSS-Selektoren sein. Der letzte Selektor in der Liste identifiziert das Ziel-Element und kann CSS oder XPath sein. Jeder Selektor in der Liste wird relativ zum Dokumentkontext bewertet, der durch den vorherigen Eintrag festgelegt wurde: Der erste Selektor ist relativ zum Wurzeldokument, 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.
Beispiel für Iframe-Selektoren
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-Feld anzuklicken, verwenden Sie eine Selektorliste. Jeder CSS-Selektor wird innerhalb des durch den vorherigen Eintrag festgelegten Dokumentkontexts bewertet:
# "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 letzte Ziel-Element 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
Das CLI unterstützt neun Seitenaktionen:
analyze: eine Barrierefreiheit-Analyse durchführenchange: den Wert eines<input>,<textarea>, oder<select>über JavaScript ändernclick: ein Element klickendismiss: ein Popup oder Modalfenster schließeneval: beliebiges JavaScript 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 pausieren
analyze
Die analyze Aktion führt eine Barrierefreiheit-Analyse durch. Sie muss mindestens einmal pro Seite aufgerufen werden. Sie können sie mehrmals aufrufen, um eine Seite zu verschiedenen Punkten in einem Ablauf zu analysieren (verwenden Sie die with title Variante, um Ergebnisse zu unterscheiden).
Der optionale ruleset Parameter gibt an, welches Regelset verwendet werden soll. Der Standard ist WCAG 2.1 AA. Verfügbare Regelsets:
| Regelset-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 zum Ein- oder Ausschließen von Elementen siehe die axe-core-API-Dokumentation zum Context-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 für die Kombination mehrerer Optionen: Analysiere nur Bilder innerhalb von Elementen mit der Klasse third-party und Formulare, die bei der Übermittlung nicht validiert werden, ausschließend Elemente mit der Klasse old-api, unter Verwendung des 508 Regelwerks, 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 eines <select> -Elements über JavaScript. Verwenden Sie 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 dem angegebenen Selektor entspricht.
# Click a button by class selector
click element ".myButton"
# Click the body element
click "body"dismiss
Die dismiss -Aktion schließt ein Popup oder Modal, indem sie auf dessen Schließen-Button klickt. Geben Sie einen CSS-Selektor für den Modal-Container und einen weiteren für den Schließen-Button an. Die Aktion schlägt fehl, ohne kritische Fehler zu erzeugen, 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 beliebigen JavaScript-Code auf der Seite aus. Verwenden Sie sie, um den DOM zu manipulieren oder benutzerdefinierte Aktionen auszufü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-Schlüsseldokumentation.
# 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 -Attributs).
Gegeben ist dieses 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 Zeichenfolge in ein <input> oder <textarea> -Element. Verwenden Sie sie, um Formulare auszufüllen und Suchfelder zu füllen.
# 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 wait -Aktion wartet entweder darauf, dass ein Element einen bestimmten Zustand erreicht, oder pausiert für eine bestimmte Dauer.
Unterstützte Elementzustände: visible, hidden, selected, enabled, disabled, found.
Für die Schlafdauer werden numerische Werte als Millisekunden interpretiert. Zeichenfolgen werden mit dem ms -Paket konvertiert — zum Beispiel, 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
# Sleep for 1 minute
wait for 1m
# Sleep for 1 second
wait for 1s
# Sleep for 30 milliseconds
wait for 30Globale Aktionen
Globale Aktionen werden auf jeder Seite eines Projekts als Reaktion auf Statusänderungen ausgeführt, anstatt prozedural wie Seitenaktionen abzulaufen. Derzeit wird nur eine globale Aktion unterstützt: dismiss modal.
- Globale Aktionen funktionieren sowohl im
spec-Modus als auch im Headless-URI-Modus. - Globale Aktionen sind nicht prozedural — sie werden als Reaktion auf Seitenereignisse ausgelöst, nicht in einer festen Reihenfolge.
- Die
dismiss modalglobale Aktion wartet darauf, dass ein bestimmtes Modal erscheint und schließt es, bevor die Seitenaktionen fortgesetzt werden.
Fügen Sie globale Aktionen einem Projekt nach name/id und vor 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"Stapelverarbeitung mit axe bulk-spec
Um mehrere Spezifikationsdateien in einem Durchgang zu verarbeiten, verwenden Sie axe bulk-spec mit einem Verzeichnis, das Spezifikationsdateien enthält. Die CLI durchsucht das Verzeichnis und seine Unterverzeichnisse rekursiv nach Spezifikationsdateien.
axe bulk-spec <spec-files-directory> <output-directory>Das <output-directory> ist optional — wenn es weggelassen wird, werden die Ergebnisse im aktuellen Arbeitsverzeichnis gespeichert.
Fortschrittsaktualisierungen werden während des Laufs an stdout gedruckt.
Die Ergebnisse werden im Ausgabeverzeichnis gespeichert: eine JSON-Datei pro analyze -Aktion, plus eine Protokolldatei, die alle fehlgeschlagenen Spezifikationsdateien und den Grund für das Scheitern auflistet.
Optionen
Die folgenden Optionen stehen für axe spec:
--axe-devhub-api-key <api-key>
Gibt den API-Schlüssel des Axe Developer Hub an. Erforderlich (zusammen mit --axe-devhub-project-id), um Ergebnisse an Axe Developer Hub zu senden. Siehe Ergebnisse an Axe Developer Hub senden.
--axe-devhub-project-id <project-id>
Gibt die Projekt-ID des Axe Developer Hub an. Erforderlich (zusammen mit --axe-devhub-api-key), um Ergebnisse an Axe Developer Hub zu senden. Siehe Ergebnisse an Axe Developer Hub senden.
--axe-devhub-server-url <url>
Gibt die URL des Servers des Axe Developer Hub an. Standardmäßig auf 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
Schließt automatisch Browser- alert(), confirm(), und prompt() Dialogfenster, bevor gescannt wird.
--enable-tracking <state>
Ermöglicht das Senden von Daten an die Metrikbibliothek.
--filter <type(s)>
Filtert Ergebnisarten aus dem Output: passes, violations, incomplete, inapplicable. Erfordert --format csv.
-f, --format <type(s)>
Berichtsformate: html, junit, csvoder eine durch Komma getrennte 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 Spec-Datei aus pageList.
--page-source
Hängt den gescannten HTML-Quelltext an die Ergebnisse an. Erfordert --verbose.
--page-title
Hängt den Seitentitel an die Ergebnisse an. Erfordert --verbose.
--remote-proxy <proxy-server>
Leitet den Datenverkehr über den angegebenen Remote-Proxy-Server.
--resume-from <name>
Überspringt alle Seiten vor der benannten Seite in der Spec-Datei pageList.
--scanned-url
Fügt die Basis-URL und die aktuelle Scan-URL zu den ausführlichen Ergebnissen hinzu. Nur Chrome. Erfordert --verbose.
--set-distinct-id <id>
Überschreibt den eindeutigen ID-Wert.
--set-legacy-mode
Aktiviert den veralteten Legacy-Scan-Modus, der in Version 5.0 entfernt wird.
Dies ist eine Option des letzten Auswegs. Es wurde berichtet, dass sie Scans auf Seiten ermöglicht, die window.open()überschreiben, eine nicht empfohlene Praxis.
--set-tracking-url <url>
Überschreibt die URL, an die Metrikdaten gesendet werden.
-t, --tags
Filtert das Standardregelwerk nach Tag.
--user-agent
Setzt einen benutzerdefinierten User-Agent-String für den Browser.
--validate
Validiert Ihre Spec-Datei, ohne sie auszuführen.
-v, --verbose
Enthält zusätzlichen Output: Axe-Ergebnisse und Metadaten wie Tool-Name, Version und Umgebung.
Für zusätzliche Konfigurationsoptionen siehe Konfigurieren.
