Pagina's analyseren met behulp van specificatiebestanden
Hoe de subcommando's spec en bulk-spec te gebruiken om pagina's te analyseren met behulp van specificatiebestanden
Een specificatiebestand is een JSON- of YAML-bestand dat een lijst met webpagina's en de browseracties definieert die op elke pagina moeten worden uitgevoerd voordat er op toegankelijkheidsproblemen wordt geanalyseerd. Gebruik axe spec om een enkel specificatiebestand uit te voeren, of axe bulk-spec om een map met specificatiebestanden te verwerken.
Het axe spec commando
axe spec <spec-file> <output-dir> [options]De <output-dir> is waar de JSON-resultaten worden opgeslagen. Als deze wordt weggelaten, worden de resultaten opgeslagen in de huidige werkmap.
Voorbeeldgebruik:
axe spec ./axe-workflow.yaml ./axe-results --format htmlStructuur van het specificatiebestand
Een specificatiebestand definieert een of meer projecten, elk met een lijst van te analyseren pagina's en optionele acties die op elke pagina moeten worden uitgevoerd.
YAML Voorbeeld
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/Project
| Eigenschap | Type | Beschrijving |
|---|---|---|
name |
string | Unieke weergavenaam van het project. |
id |
string | Unieke identificatie van het project. |
metadata |
object | Optioneel. Willekeurige metadata voor uw gebruiksdoel (bijv. productnaam, omgeving). |
globalActions |
array | Optioneel. Acties die reageren op toestandsveranderingen op elke pagina in het project, bijvoorbeeld het wegklikken van een cookiebanner of enquête-pop-up. Zie Globale Acties. |
pageList |
array | Lijst van te analyseren pagina's. Zie Pagina. |
Pagina
| Eigenschap | Type | Beschrijving |
|---|---|---|
name |
string | Weergavenaam van de pagina. |
url |
string | URL van de pagina. |
actions |
array | Optioneel. Acties om uit te voeren op de pagina voor of na de analyse. Zie Acties. |
JSON/YAML-formaat
Specificatiebestanden kunnen worden geschreven in YAML of JSON. De volgende tabel toont dezelfde waarden in elk formaat. Let op dat in JSON actiestrings met dubbele aanhalingstekens moeten worden geëscaped met een backslash.
| 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\"" |
Acties
Acties zijn strings in de actions (of globalActions) array van een specificatiebestand. Ze voeren taken uit zoals het klikken op knoppen, het invullen van formulieren, het sluiten van vensters, het wachten op paginastatussen en het uitvoeren van toegankelijkheidsanalyses. Acties worden uitgevoerd in de volgorde waarin ze worden vermeld.
Er zijn twee soorten acties:
- Pagina-acties worden opeenvolgend uitgevoerd op een specifieke pagina. De
analyzeactie moet minstens één keer per pagina worden aangeroepen. - Globale acties worden uitgevoerd op elke pagina in het project als reactie op statuswijzigingen. Zie Globale Acties.
Volledig Actievoorbeeld
Het volgende voorbeeld logt in bij Deque University en analyseert het 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 pageSelectoren
Veel acties nemen een selectorargument dat een element op de pagina identificeert. Een selector kan een CSS-selector of een XPath-selector zijn, gespecificeerd als een enkele string of een lijst van strings.
Om elementen binnen iframes te richten, moet u een lijst gebruiken. Alle selectors in de lijst, behalve de laatste, identificeren opeenvolgende <iframe> elementen waarnaar genavigeerd moet worden, en moeten CSS-selectors zijn. De laatste selector in de lijst identificeert het doel-element en kan een CSS- of XPath-selector zijn. Elke selector in de lijst wordt geëvalueerd binnen de documentcontext die is vastgesteld door de vorige vermelding: de eerste selector is relatief aan het hoofddocument, en elke volgende iframe-selector is relatief aan het document binnen het voorafgaande iframe.
Met een enkele string (geen lijst) kan niet in iframes worden genavigeerd.
Voorbeeld van Iframe-selector
Beschouw deze HTML-structuur:
<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>Om het kaartnummerinvoerveld aan te klikken, gebruikt u een selectorlijst. Elke CSS-selector wordt geëvalueerd binnen de documentcontext die is vastgesteld door de vorige vermelding:
# "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" ]Om XPath te gebruiken voor het uiteindelijke doel-element (de iframe-selectors moeten nog steeds CSS zijn):
click element [ "iframe.payment-widget", "#card-fields", "//input[@name='card-number']" ]In JSON:
"click element [\"iframe.payment-widget\", \"#card-fields\", \".card-input\"]"Pagina-acties
De CLI ondersteunt negen pagina-acties:
analyze: voer een toegankelijkheidsanalyse uitchange: verander de waarde van een<input>,<textarea>, of<select>via JavaScriptclick: klik een element aandismiss: sluit een popup of modaaleval: voer willekeurige JavaScript uitpress: druk op een toets (met of zonder modificatoren)select: selecteer een optie in een<select>type: typ in een<input>wait: wacht op een specifieke status of slaap
analyze
De analyze actie voert een toegankelijkheidsanalyse uit. Deze moet minstens één keer per pagina worden aangeroepen. U mag deze meerdere keren aanroepen om een pagina te analyseren op verschillende momenten in een workflow (gebruik de with title variant om resultaten te onderscheiden).
De optionele ruleset parameter specificeert welke regels set gebruikt moet worden. De standaard is WCAG 2.1 AA. Beschikbare regelsets:
| Regelset ID | Standaard |
|---|---|
wcag2 |
WCAG 2.0 AA |
wcag2.1 |
WCAG 2.1 AA (standaard) |
wcag2.2 |
WCAG 2.2 AA |
wcag2aaa |
WCAG 2.0 AAA |
wcag2.1aaa |
WCAG 2.1 AAA |
wcag2.2aaa |
WCAG 2.2 AAA |
508 |
Sectie 508 |
ttv5 |
Trusted Tester v5 |
en301549 |
EN 301 549 |
rgaav4 |
RGAA v4 |
Voor informatie over het opnemen of uitsluiten van elementen, zie de axe-core API-documentatie over de 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 rulesetVoorbeeld van het combineren van meerdere opties: Analyseer alleen afbeeldingen binnen elementen met de klasse third-party en formulieren die niet worden gevalideerd bij verzending, waarbij elementen met de klasse old-apiworden uitgesloten, gebruikmakend van de 508 regels, met een aangepaste titel en een aangepaste opslaglocatie.
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
De change actie wijzigt de waarde van een <input>, <textarea>, of <select> element via JavaScript. Gebruik change wanneer normale DOM-evenementen niet beschikbaar zijn.
# Change the value of an input
change the value of "input[name=song]" to "too many puppies"click
De click actie klikt op het eerste element dat overeenkomt met de gegeven selector.
# Click a button by class selector
click element ".myButton"
# Click the body element
click "body"dismiss
De dismiss actie sluit een popup of dialoogvenster door op de sluitknop te klikken. Geef een CSS-selector op voor de modale container en een andere voor de sluitknop. De actie faalt op een elegante manier als een van de elementen niet aanwezig is.
Deze actie sluit geen native alert() of confirm() dialoogvensters.
# Dismiss a modal using separate selectors for the container and close button
dismiss modal ".myModal" with close button ".myModal .close"eval
De eval actie voert willekeurige JavaScript uit op de pagina. Gebruik het om de DOM te manipuleren of aangepaste acties uit te voeren.
# 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
De press actie stuurt een toetsdruk naar een element (eventueel met modifier-toetsen). Voor ondersteunde toetsenamen, zie de Selenium-toetsdocumentatie.
# 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
De select actie selecteert een <option> van een <select> element op basis van de zichtbare tekst (niet op basis van het value attribuut).
Gegeven deze 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
De type actie typt een string in een <input> of <textarea> element. Gebruik het om formulieren in te vullen en zoekvelden te populeren.
# 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
De wait actie wacht ofwel op een element om een gespecificeerde status te bereiken, of pauzeert voor een gegeven duur.
Ondersteunde elementstatussen: visible, hidden, selected, enabled, disabled, found.
Voor slaapduur worden numerieke waarden geïnterpreteerd als milliseconden. Strings worden omgezet met behulp van het ms pakket — bijvoorbeeld, 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 Acties
Globale acties worden op elke pagina in een project uitgevoerd als reactie op toestandsveranderingen, in plaats van procedureel zoals pagina-acties. Momenteel wordt slechts één globale actie ondersteund: dismiss modal.
- Globale acties werken zowel in
specmodus als in headless URI-modus. - Globale acties zijn niet procedureel — ze worden geactiveerd als reactie op pagina-evenementen, niet in een vaste volgorde.
- De
dismiss modalglobale actie wacht tot een gespecificeerde modal verschijnt en sluit deze voordat de pagina-acties doorgaan.
Voeg globale acties toe aan een project na name/id en voor 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"Batchverwerking met axe bulk-spec
Om meerdere specs-bestanden in één keer te verwerken, gebruik axe bulk-spec met een directory die specs-bestanden bevat. De CLI zoekt recursief in de directory en submappen naar specs-bestanden.
axe bulk-spec <spec-files-directory> <output-directory>De <output-directory> is optioneel — als deze wordt weggelaten, worden de resultaten opgeslagen in de huidige werkdirectory.
Voortgangsupdates worden naar stdout geprint tijdens de uitvoering.
Resultaten worden geschreven naar de uitvoermap: één JSON-bestand per analyze actie, plus een logbestand met een lijst van eventueel mislukte specs-bestanden en de reden van falen.
Opties
De volgende opties zijn beschikbaar voor axe spec:
--axe-devhub-api-key <api-key>
Specificeert de Axe Developer Hub API-sleutel. Vereist (samen met --axe-devhub-project-id) om resultaten naar de Axe Developer Hub te verzenden. Zie Resultaten naar Axe Developer Hub verzenden.
--axe-devhub-project-id <project-id>
Specificeert het project-ID van de Axe Developer Hub. Vereist (samen met --axe-devhub-api-key) om resultaten naar de Axe Developer Hub te verzenden. Zie Resultaten naar Axe Developer Hub verzenden.
--axe-devhub-server-url <url>
Specificeert de URL van de Axe Developer Hub-server. Standaard is https://axe.deque.com. Equivalent aan de AXE_DEVHUB_SERVER_URL omgevingsvariabele. Zie Resultaten naar Axe Developer Hub verzenden.
-c, --custom <path>
Specificeert een aangepast regelsbestand, waarmee het standaardregelsbestand wordt overschreven.
--descendant-links
Verzamelt de links op elke pagina en voegt deze toe aan de resultaten. Vereist --verbose.
--dismiss-alerts
Sluit automatisch browser alert(), confirm(), en prompt() dialogen voordat u scant.
--enable-tracking <state>
Stelt het verzenden van gegevens naar de metrics-bibliotheek in.
--filter <type(s)>
Filtert resultaattypen uit de uitvoer: passes, violations, incomplete, inapplicable. Vereist --format csv.
-f, --format <type(s)>
Rapportformaat(en): html, junit, csv, of een door komma's gescheiden combinatie. Standaard: html.
--no-git-data
Sluit Git-branch- en commitinformatie uit bij het verzenden van resultaten naar Axe Developer Hub. Zie Resultaten verzenden naar Axe Developer Hub.
--page-name <name>
Voert alleen de pagina met de opgegeven naam uit van het spec-bestand pageList.
--page-source
Voegt de gescande HTML-bron toe aan resultaten. Vereist --verbose.
--page-title
Voegt de paginatitel toe aan resultaten. Vereist --verbose.
--remote-proxy <proxy-server>
Leidt verkeer om via de opgegeven externe proxyserver.
--resume-from <name>
Slaat alle pagina's over vóór de benoemde pagina in het spec-bestand pageList.
--scanned-url
Voegt de basis-URL en huidige scan-URL toe aan gedetailleerde resultaten. Alleen voor Chrome. Vereist --verbose.
--set-distinct-id <id>
Overschrijft de waarde van de unieke ID.
--set-legacy-mode
Schakelt de verouderde legacy-scanmodusin, die in versie 5.0 wordt verwijderd.
Dit is een laatste redmiddel. Er is gerapporteerd dat het mogelijk scans op pagina's kan voltooien die overschrijven window.open(), een niet-aangeraden methode.
--set-tracking-url <url>
Overschrijft de URL waar metrische gegevens heen worden gestuurd.
-t, --tags
Filtert het standaard regelsysteem op tag.
--user-agent
Stelt een aangepaste user-agentstring voor de browser in.
--validate
Valideert uw spec-bestand zonder het uit te voeren.
-v, --verbose
Bevat extra output: Axe-resultaten en metadata zoals toolnaam, versie en omgeving.
Voor aanvullende configuratieopties, zie Configureren.
