Analizzare le Pagine Utilizzando i File Spec
Come utilizzare i sottocomandi spec e bulk-spec per analizzare le pagine usando i file spec
Un file spec è un file JSON o YAML che definisce un elenco di pagine web e le azioni del browser da eseguire su ogni pagina prima di analizzarle per problemi di accessibilità. Usa axe spec per eseguire un singolo file spec, oppure axe bulk-spec per elaborare una directory di file spec.
Il axe spec
axe spec <spec-file> <output-dir> [options]Il <output-dir> Esempio di utilizzo:
Struttura del File Spec
axe spec ./axe-workflow.yaml ./axe-results --format htmlUn file spec definisce uno o più progetti, ciascuno con un elenco di pagine da analizzare e azioni opzionali da eseguire su ogni pagina.
Esempio YAML
Progetto
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/Proprietà
| Tipo | Descrizione | stringa |
|---|---|---|
name |
URL della pagina. | stringa |
id |
URL della pagina. | oggetto |
metadata |
Opzionale. Metadati arbitrari per il tuo caso d'uso (ad esempio, nome del prodotto, ambiente). | array |
globalActions |
Opzionale. Azioni da eseguire sulla pagina prima o dopo l'analisi. Vedi | Azioni Globali Azioni Globali. |
screenshot |
Opzionale. Metadati arbitrari per il tuo caso d'uso (ad esempio, nome del prodotto, ambiente). | Opzionale. Acquisisce uno screenshot di ogni pagina dopo l'analisi. Vedi Acquisizione di screenshot. |
pageList |
Opzionale. Azioni da eseguire sulla pagina prima o dopo l'analisi. Vedi | Pagina Proprietà. |
Proprietà
| Tipo | Descrizione | stringa |
|---|---|---|
name |
URL della pagina. | stringa |
url |
URL della pagina. | array |
actions |
Opzionale. Azioni da eseguire sulla pagina prima o dopo l'analisi. Vedi | Azioni Le azioni sono stringhe nel. |
I file spec possono essere scritti in YAML o JSON. La seguente tabella mostra gli stessi valori in ciascun formato. Nota che in JSON, le stringhe di azione che contengono virgolette doppie devono essere precedute da un backslash.
YAML
| JSON | Azioni |
|---|---|
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\"" |
Le azioni sono stringhe nel
(o actions (o globalActions) array di un file di specifiche. Eseguono attività come cliccare pulsanti, compilare moduli, chiudere dialoghi, attendere stati di pagina ed eseguire analisi di accessibilità. Le azioni vengono eseguite nell'ordine elencato.
Ci sono due tipi di azioni:
- Azioni di pagina vengono eseguite in sequenza su una pagina specifica. L'
analyzeazione deve essere chiamata almeno una volta per pagina. - Azioni globali vengono eseguite su ogni pagina del progetto in risposta ai cambiamenti di stato. Vedi Azioni Globali.
Esempio completo di azione
Il seguente esempio accede a Deque University e analizza il 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 pageSelettori
Molte azioni richiedono un argomento selettore che identifica un elemento sulla pagina. Un selettore può essere un selettore CSS o un selettore XPath, specificato come una singola stringa o una lista di stringhe.
Per indirizzare elementi all'interno di iframe, è necessario usare una lista. Tutti i selettori nella lista tranne l'ultimo identificano successivi <iframe> elementi in cui navigare e devono essere selettori CSS. L'ultimo selettore nella lista identifica l'elemento di destinazione e può essere CSS o XPath. Ogni selettore nella lista è valutato rispetto al contesto del documento stabilito dalla voce precedente: il primo selettore è relativo al documento radice, e ciascun selettore successivo degli iframe è relativo al documento all'interno dell'iframe precedente.
Usare una singola stringa (non una lista) non può navigare all'interno di iframe.
Esempio di selettore di iframe
Considera questa struttura 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>Per cliccare sull'input del numero della carta, usa una lista di selettori. Ogni selettore CSS è valutato all'interno del contesto del documento stabilito dalla voce precedente:
# "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" ]Per usare XPath per l'elemento di destinazione finale (i selettori degli iframe devono comunque essere CSS):
click element [ "iframe.payment-widget", "#card-fields", "//input[@name='card-number']" ]In JSON:
"click element [\"iframe.payment-widget\", \"#card-fields\", \".card-input\"]"Azioni di pagina
Il CLI supporta nove azioni di pagina:
analyze: eseguire un'analisi di accessibilitàchange: cambiare il valore di un<input>,<textarea>, o<select>tramite JavaScriptclick: cliccare su un elementodismiss: chiudere un popup o modaleeval: valutare JavaScript arbitrariopress: premere un tasto (con o senza modificatori)select: selezionare un'opzione in un<select>type: digitare in un<input>wait: attendere uno stato specifico o dormire
analyze
Il analyze azione esegue un'analisi di accessibilità. Deve essere chiamata almeno una volta per pagina. Può essere chiamata più volte per analizzare una pagina in diversi punti di un flusso di lavoro (usa la with title variante per distinguere i risultati).
Il parametro opzionale ruleset specifica quale set di regole utilizzare. Il predefinito è WCAG 2.1 AA. Set di regole disponibili:
| ID Set di regole | Standard |
|---|---|
wcag2 |
WCAG 2.0 AA |
wcag2.1 |
WCAG 2.1 AA (predefinito) |
wcag2.2 |
WCAG 2.2 AA |
wcag2aaa |
WCAG 2.0 AAA |
wcag2.1aaa |
WCAG 2.1 AAA |
wcag2.2aaa |
WCAG 2.2 AAA |
508 |
Sezione 508 |
ttv5 |
Trusted Tester v5 |
en301549 |
EN 301 549 |
rgaav4 |
RGAA v4 |
Per informazioni su come includere o escludere elementi, consultare la documentazione dell'API axe-core sul parametro Contesto.
# 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 rulesetEsempio di combinazione di più opzioni: Analizza solo le immagini all'interno degli elementi con la classe third-party e dei moduli che non vengono validati all'invio, escludendo gli elementi con la classe old-api, utilizzando il 508 set di regole, con un titolo personalizzato e una posizione di salvataggio personalizzata.
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
Il change modifica il valore di un <input>, <textarea>, o <select> elemento tramite JavaScript. Usare change quando gli eventi DOM normali non sono disponibili.
# Change the value of an input
change the value of "input[name=song]" to "too many puppies"click
Il click fa clic sul primo elemento che corrisponde al selettore dato.
# Click a button by class selector
click element ".myButton"
# Click the body element
click "body"dismiss
Il dismiss chiude un popup o una finestra modale facendo clic sul suo pulsante di chiusura. Fornire un selettore CSS per il contenitore modale e un altro per il pulsante di chiusura. L'azione fallisce in modo indolore se uno degli elementi non è presente.
Questa azione non chiude le finestre di dialogo native alert() o confirm() .
# Dismiss a modal using separate selectors for the container and close button
dismiss modal ".myModal" with close button ".myModal .close"eval
Il eval esegue JavaScript arbitrario sulla pagina. Usarla per manipolare il DOM o eseguire azioni personalizzate.
# 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
Il press invia una pressione di tasto a un elemento (eventualmente con tasti modificatori). Per i nomi dei tasti supportati, consultare la documentazione dei tasti di 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
Il select seleziona un <option> di un <select> elemento tramite il suo testo visibile (non il suo value attributo).
Dato questo 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
Il type digita una stringa in un <input> o <textarea> elemento. Usarla per compilare moduli e riempire campi di ricerca.
# 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
Il wait attende che un elemento raggiunga uno stato specifico o sospende l'esecuzione per una durata data.
Stati supportati degli elementi: visible, hidden, selected, enabled, disabled, found.
Per la durata del sonno, i valori numerici sono interpretati come millisecondi. Le stringhe sono convertite utilizzando il pacchetto ms — per esempio, 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 30Azioni Globali
Le azioni globali vengono eseguite su ogni pagina di un progetto in risposta ai cambiamenti di stato, piuttosto che procedere in modo sequenziale come le azioni di pagina. Attualmente è supportata solo un'azione globale: dismiss modal.
- Le azioni globali funzionano sia in
specmodalità che in modalità URI senza testa. - Le azioni globali non sono procedurali — si attivano in risposta agli eventi di pagina, non in una sequenza fissa.
- Il
dismiss modalattende che un determinato modale appaia e lo chiude prima che le azioni di pagina continuino.
Aggiungi le azioni globali a un progetto dopo name/id e prima di 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"Acquisizione di screenshot
Per acquisire uno screenshot di ogni pagina dopo l'analisi, aggiungi un screenshot oggetto a un progetto nel tuo file di specifiche. Ogni pagina produce un file PNG denominato <page-id>-screenshot.png (qualsiasi / o \ nella pagina id è sostituito con _). Se una pagina non ha id, uno è derivato dal suo name rimuovendo tutti gli spazi vuoti.
| Tipo | Descrizione | Predefinito | stringa |
|---|---|---|---|
enabled |
booleano | — | Obbligatorio. Imposta su true per abilitare l'acquisizione di screenshot. Funziona con tutti i browser supportati. |
fullPage |
booleano | false |
Acquisisce l'intera pagina scorrevole utilizzando il Chrome DevTools Protocol. Richiede Chrome o Chromium; altri browser passano a uno screenshot del viewport con un avviso. |
boundingBoxes |
booleano | false |
Aggiunge le coordinate del riquadro di delimitazione (x, y, width, e height) a ogni nodo di violazione nei risultati axe, registrando dove l'elemento appare nello screenshot. |
dir |
URL della pagina. | <output-dir>/<project-id>/ |
Directory dove vengono scritti i file PNG degli screenshot. |
Quando esegui axe spec con --verbose, ogni risultato include anche un screenshotPath campo con il percorso completo al file di screenshot di quella pagina.
projects:
- name: My App
id: my-app
screenshot:
enabled: true
fullPage: true
boundingBoxes: true
dir: ./screenshots
pageList:
- name: Home
url: https://example.com/Elaborazione Batch con axe bulk-spec
Per elaborare più file di specifiche in un'unica esecuzione, utilizza axe bulk-spec con una directory contenente file di specifiche. Il CLI cerca ricorsivamente nella directory e nelle sue sottodirectory i file di specifiche.
axe bulk-spec <spec-files-directory> <output-directory>Il <output-directory> è opzionale — se omesso, i risultati vengono salvati nella directory di lavoro corrente.
Gli aggiornamenti sui progressi vengono stampati su stdout durante l'esecuzione.
I risultati vengono scritti nella directory di output: un file JSON per ogni analyze azione, più un file di log che elenca i file di specifiche non riusciti e il motivo del fallimento.
Opzioni
Le seguenti opzioni sono disponibili per axe spec:
--axe-devhub-api-key <api-key>
Specifica la chiave API dell'Axe Developer Hub. Necessaria (insieme a --axe-devhub-project-id) per inviare i risultati all'Axe Developer Hub. Vedi Invia Risultati all'Axe Developer Hub.
--axe-devhub-project-id <project-id>
Specifica l'ID progetto dell'Axe Developer Hub. Necessario (insieme a --axe-devhub-api-key) per inviare i risultati all'Axe Developer Hub. Vedi Invia Risultati all'Axe Developer Hub.
--axe-devhub-server-url <url>
Specifica l'URL del server Axe Developer Hub. Impostazione predefinita: https://axe.deque.com. È equivalente alla variabile d'ambiente AXE_DEVHUB_SERVER_URL . Vedi Invia Risultati all'Axe Developer Hub.
-a, --axe-source <path>
Percorso verso un file alternativo axe.js . La maggior parte degli utenti non ne ha bisogno. È destinato a casi d'uso avanzati come i test su una versione specifica o patchata di axe-core.
--chrome-options [options]
Passa un elenco separato da virgole di opzioni a riga di comando di Chrome a ChromeDriver. Usalo per abilitare le funzionalità del browser o aggirare le restrizioni in ambienti specifici, ad esempio negli ambienti CI containerizzati dove il sandbox deve essere disabilitato.
axe spec workflow.yml --chrome-options="no-sandbox,disable-gpu"-c, --custom <path>
Specifica un file di set di regole personalizzato, sovrascrivendo il set di regole predefinito.
--descendant-links
Raccoglie i link su ogni pagina e li aggiunge ai risultati. Richiede --verbose.
--dismiss-alerts
Chiude automaticamente i browser alert(), confirm(), e prompt() le finestre di dialogo prima della scansione.
--enable-tracking <state>
Consente di inviare dati alla libreria delle metriche.
--filter <type(s)>
Filtra i tipi di risultati dall'output: passes, violations, incomplete, inapplicable. Richiede --format csv.
-f, --format <type(s)>
Formato/i del report: html, junit, csv, o una combinazione separata da virgole. Predefinito: html.
--no-analyze
Rimuove il requisito di un analyze action nell'elenco delle azioni di ogni pagina. Per impostazione predefinita, ogni pagina in un file di specifiche deve includere almeno una analyze action; questo flag disabilita quel controllo, il che è utile quando si esegue un workflow che esegue solo azioni senza eseguire una scansione di accessibilità.
--no-exit
Forza la CLI a uscire con il codice 0 anche quando vengono rilevate violazioni. Per impostazione predefinita, axe spec esce con il codice 1 se vengono rilevate violazioni. Usa questo quando vuoi raccogliere i risultati senza interrompere una build CI.
--no-git-data
Esclude le informazioni sul ramo Git e sul commit quando si inviano i risultati all'Axe Developer Hub. Vedi Invia Risultati all'Axe Developer Hub.
--no-html
Impedisce alla CLI di generare un report HTML. Usalo insieme a --format per controllare quali formati di report vengono scritti, o quando vuoi solo risultati JSON senza un riepilogo HTML.
--no-reports
Impedisce alla CLI di generare qualsiasi file di report. I risultati sono comunque raccolti e visualizzati nel terminale, ma nulla viene scritto su disco. Utile per verifiche rapide in cui non sono necessari file di output.
--no-wait
Disabilita la pausa automatica tra le azioni del workflow. Per impostazione predefinita, le pause configurate con --post-get-pause, --post-script-pause, e --post-analyze-pause si applicano tra le azioni (vedi Configura); questo flag le ignora tutte.
--page-name <name>
Esegue solo la pagina con il nome specificato dal file di specifiche pageList.
--page-source
Aggiunge il codice sorgente HTML scansionato ai risultati. Richiede --verbose.
--page-title
Aggiunge il titolo della pagina ai risultati. Richiede --verbose.
--remote-proxy <proxy-server>
Instrada il traffico attraverso il server proxy remoto specificato.
--resume-from <name>
Salta tutte le pagine prima della pagina nominata nel file di specifiche pageList.
--scanned-url
Aggiunge l'URL di base e l'URL della scansione corrente ai risultati dettagliati. Solo Chrome. Richiede --verbose.
--set-distinct-id <id>
Sovrascrive il valore ID distinto.
--set-legacy-mode
Abilita la modalità di scansione deprecata legacy, che verrà rimossa nella versione 5.0.
Questa è un'opzione di ultima istanza. È stato segnalato che consente di completare le scansioni su pagine che sovrascrivono window.open(), una pratica sconsigliata.
--set-tracking-url <url>
Sovrascrive l'URL a cui vengono inviate le metriche.
--silent-mode
Sopprime tutto il testo decorativo dall'output della CLI. I risultati vengono mostrati solo quando --verbose è anch'esso attivo. Usalo in script o pipeline CI dove vuoi un output pulito senza banner di progresso o messaggi di stato.
-t, --tags
Filtra il set di regole standard per tag.
--user-agent
Imposta una stringa agente utente personalizzata per il browser.
--validate
Convalida il file di specifiche senza eseguirlo.
-v, --verbose
Include output aggiuntivo: risultati Axe e metadati come nome dello strumento, versione e ambiente.
--wait-network-idle-new-connections [number]
Il numero di nuove connessioni di rete che possono essere stabilite prima che la rete sia considerata inattiva. Una volta che le nuove connessioni scendono a questo valore o al di sotto, la CLI procede con la scansione. Usa insieme a --wait-network-idle-timeout per regolare quando la CLI si esegue su pagine con attività di rete in background in corso.
--wait-network-idle-open-connections [number]
Il numero di connessioni di rete aperte che possono rimanere prima che la rete sia considerata inattiva. Una volta che le connessioni aperte scendono a questo valore o al di sotto, la CLI procede con la scansione.
--wait-network-idle-polling-every [ms]
L'intervallo in millisecondi con cui la CLI verifica se la rete è diventata inattiva. Riduci questo valore per rilevamenti più rapidi a costo di un maggiore utilizzo della CPU.
--wait-network-idle-timeout [ms]
Il tempo massimo in millisecondi di attesa affinché l'attività di rete si stabilizzi prima di avviare la scansione. Dopo il caricamento della pagina, la CLI monitora le connessioni di rete attive e attende finché il conteggio delle connessioni non raggiunge la soglia configurata. Se il timeout scade prima che la rete diventi inattiva, la CLI procede comunque con la scansione.
Per ulteriori opzioni di configurazione, vedi Configura.
