Generaci贸n de informes a partir de resultados JSON de Axe DevTools
Usando el paquete @axe-devtools/reporter para generar informes
Utilice el generador de informes de Axe DevTools con su integraci贸n de Node.js para producir informes de accesibilidad de las p谩ginas escaneadas.
Generar informes ahora es tan f谩cil como ejecutar escaneos. Con el generador de informes de Axe DevTools, puedes generar informes en HTML visibles inmediatamente, informes en XML JUnit para ver en entornos de pruebas de CI y informes en CSV para importar en una multitud de otras herramientas. Esta gu铆a detalla c贸mo instalar, configurar y usar el generador de informes de Axe DevTools.
Requisitos previos
Para utilizar el generador de informes de Axe DevTools, necesitas un proyecto existente de Node.js para integrar tanto Axe DevTools como el generador de informes. Esta parte de la gu铆a solo cubre la configuraci贸n del generador de informes, as铆 que si a煤n no tienes Axe DevTools realizando an谩lisis, lee esta gu铆a sobre c贸mo ejecutar an谩lisis con Axe DevTools.
Instalaci贸n del Reporter
Si ya configuraste tu archivo ~/.npmrc para descargar los paquetes npm de Axe DevTools, todo lo que necesitas hacer es ejecutar el comando:
npm install @axe-devtools/reporterSi a煤n no has configurado la autenticaci贸n de tu instalaci贸n, lee Opciones de instalaci贸n de Axe DevTools para Web para Node.js.
A partir de la versi贸n 4.15.0, el generador de informes ya no incluye jsdom. Si generas informes HTML, lee Pre-renderizar informes HTML para averiguar si necesitas instalarlo o proporcionar un navegador.
Agregar el Reporter a tu Proyecto
Importa el generador de informes con la sintaxis que coincida con tu proyecto:
JavaScript con m贸dulos CommonJS
const { Reporter } = require('@axe-devtools/reporter');JavaScript con m贸dulos ES
import { Reporter } from '@axe-devtools/reporter';TypeScript
TypeScript utiliza la misma sintaxis import que los ES modules. @axe-devtools/reporter incluye sus propias declaraciones de tipos, por lo que no hay un paquete @types/ separado para instalar:
import { Reporter } from '@axe-devtools/reporter';Para usar el generador de informes, tu biblioteca de Axe DevTools y el controlador webdriver tambi茅n deber谩n estar importado e inicializado.
Opciones del Reporter
Hay tres decisiones principales que debes tomar al usar el generador de informes de Axe DevTools
- Qu茅 nombre dar a los informes
- D贸nde almacenar los informes
- En qu茅 formato generar los informes
Puedes nombrar los informes como prefieras. Cuando inicializas el reportero, le pasas un nombre de suite que todos los informes generados con esa instancia compartir谩n. Cada informe tambi茅n incluye un nombre asignado en cada escaneo. La ubicaci贸n, o directorio, donde se almacenar谩n los informes tambi茅n depende completamente del usuario. Esta ubicaci贸n de directorio tambi茅n se establece a nivel de instancia, por lo que todos los informes generados en una instancia del reportero compartir谩n un directorio. Los formatos opcionales de informe son HTML, que recomendamos para la visualizaci贸n inmediata por el usuario, JUnit XML, que recomendamos para su uso en entornos CI, CSV, que permite importar los resultados del escaneo en otras herramientas, y EARL (Lenguaje de Evaluaci贸n e Informe), que produce un documento W3C EARL JSON-LD para informes de accesibilidad legibles por m谩quina.
Usar el Reporter
Una vez que el reportero est谩 importado en tu proyecto, puedes inicializarlo. El constructor toma dos argumentos: el nombre de la suite de informes y el directorio de destino para los informes. Tu declaraci贸n de inicializaci贸n deber铆a verse algo as铆:
const reporter = new Reporter('<suite-name>', '<dir-name>');Hay dos pasos para ejecutar el generador de informes una vez que se ha ejecutado un escaneo de Axe DevTools. Primero, se deben registrar los resultados para que el generador de informes los acceda. Luego, el generador procesa estos resultados en el informe.
reporter.logTestResult('<scan-name>', <results-object>);
reporter.buildHTML('<scan-dir>');Pre-renderizar informes HTML
Un informe HTML es aut贸nomo y se renderiza cuando se abre en un navegador. Antes de escribir uno, el generador de informes tambi茅n intenta pre-renderizarlo en un marcado est谩tico, para que el contenido del informe est茅 presente en el archivo y se muestre tan pronto como se abra el archivo.
La pre-renderizaci贸n requiere un navegador o jsdom. A partir de la versi贸n 4.15.0, jsdom es una dependencia opcional necesaria y ya no se instala junto con el generador de informes, por lo que elige lo que se adapte a tu entorno:
-
Proporciona un navegador. Pasa
browserPathcomo argumento enrenderOptionsabuildHTML, o establece la variable de entornoAXE_DEVTOOLS_REPORTER_BROWSER_PATH, apuntando a un ejecutable basado en Chromium. No se necesita un controlador de navegador o biblioteca de automatizaci贸n. -
Instala
jsdomt煤 mismo. Esto mantiene el comportamiento de las versiones anteriores:npm install jsdom -
Conf铆a en un navegador ya instalado en la m谩quina. Si no proporcionas un navegador y no instalas
jsdom, el generador de informes busca un navegador basado en Chromium en las ubicaciones est谩ndar de instalaci贸n de esta m谩quina y luego en elPATH.
Cada vez que llamas a buildHTML, el generador de informes elige uno de estos en el siguiente orden:
- El navegador proporcionado por
browserPathoAXE_DEVTOOLS_REPORTER_BROWSER_PATH, si esa ruta existe. jsdom, si est谩 instalado.- Un navegador basado en Chromium encontrado en esta m谩quina, a menos que configures
autoDetectBrowsercomofalse. - Ninguno de los anteriores, en cuyo caso se omite la pre-renderizaci贸n. El informe todav铆a se escribe y todav铆a se renderiza cuando se abre en un navegador.
El Paso 3 inicia un proceso de navegador para cada informe. En una ejecuci贸n de gran volumen, o en una m谩quina de compilaci贸n donde no se desee ejecutar un navegador que el generador de informes localiz贸 por s铆 mismo, configura autoDetectBrowser como false (o configura AXE_DEVTOOLS_REPORTER_BROWSER_AUTO_DETECT a un valor falso) y proporciona browserPath o instala jsdom.
Cuando se utiliza un navegador, se ejecuta con su espacio aislado habilitado y sin acceso a la red. Los informes contienen contenido tomado de las p谩ginas que escaneaste, as铆 que deja el espacio aislado habilitado a menos que est茅s en un entorno confiable y restringido que no pueda soportarlo. Consulta RenderOptions para ver la lista completa de opciones.
Archivo de ejemplo
Este archivo de muestra utiliza la misma base que el ejemplo escribir pruebas, pero tambi茅n integra el generador de informes. El mismo archivo se muestra en JavaScript y en TypeScript.
JavaScript
const rimraf = require('rimraf');
const { AxeDevToolsBuilder } = require('@axe-devtools/playwright');
const playwright = require('playwright');
const { Reporter } = require('@axe-devtools/reporter');
(async () => {
rimraf.sync('./a11y_results/*');
const browser = await playwright.chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
const reporter = new Reporter('playwright', './a11y_results');
await page.goto('https://dequeuniversity.com/demo/mars/');
const results = await new AxeDevToolsBuilder({ page }).analyze();
reporter.logTestResult('tested-page', results);
reporter.buildHTML('./a11y_results');
await browser.close();
})();TypeScript
import rimraf from 'rimraf';
import { AxeDevToolsBuilder } from '@axe-devtools/playwright';
import * as playwright from 'playwright';
import { Reporter } from '@axe-devtools/reporter';
import type { AxeResults } from 'axe-core';
(async () => {
rimraf.sync('./a11y_results/*');
const browser = await playwright.chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
const reporter = new Reporter('playwright', './a11y_results');
await page.goto('https://dequeuniversity.com/demo/mars/');
const results: AxeResults = await new AxeDevToolsBuilder({ page }).analyze();
reporter.logTestResult('tested-page', results);
reporter.buildHTML('./a11y_results');
await browser.close();
})();Ejemplo de salida
Los ejemplos a continuaci贸n muestran lo que contiene cada informe legible por m谩quina para un solo chequeo fallido. Los valores como los nombres del conjunto y la prueba provienen de los argumentos que proporcionas al generador de informes; los campos restantes se rellenan con los resultados de axe-core. Un informe HTML est谩 destinado a ser abierto en un navegador en lugar de ser le铆do como c贸digo fuente, por lo que no se muestra aqu铆.
CSV
buildCSV escribe una fila por resultado, precedida por una fila de encabezado que describe cada columna. Los campos que contienen comas o saltos de l铆nea, como Remediation, est谩n entrecomillados.
Page URL,Page Title,Outcome,Impact,Code Snippet,Selector,Remediation,Manual,Rule ID,Help,Description,Help URL,Standard,WCAG 2 Success Criteria,Section 508 Paragraph,Tags,Date,axe-core,Needs Review,IGT,Found By,Test Title,Share URL
https://dequeuniversity.com/demo/mars/,My Test Suite,Failed,Serious,<h3>Be Bold...</h3>,"a[href=""mars2.html?a=be_bold""] > h3","Fix any of the following:
Element has insufficient color contrast of 4.31 (foreground color: #ff9999, background color: #344b6e, font size: 13.5pt (18px), font weight: normal). Expected contrast ratio of 4.5:1",false,color-contrast,Elements must meet minimum color contrast ratio thresholds,Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds,https://dequeuniversity.com/rules/axe/4.12/color-contrast,WCAG 2.0 Level AA,1.4.3 Contrast (Minimum),,"cat.color, wcag2aa, wcag143, TTv5, TT13.c, EN-301-549, EN-9.1.4.3, ACT, RGAAv4, RGAA-3.2.1",2026-07-10T18:11:41.859Z,4.12.1,No,,,My Test Suite,JUnit XML
buildJUnitXML agrupa los resultados en un testcase por regla, con un elemento failure para cada regla que no pas贸. Cuando una regla falla en m谩s de un elemento, las ocurrencias se enumeran dentro del mismo failure, separadas por un divisor --------.
<?xml version="1.0" encoding="utf-8"?>
<testsuites>
<testsuite name="My Test Suite" package="axe-result" timestamp="2026-07-10T11:11:42-0700">
<properties>
<property name="platform.userAgent" value="" />
<property name="platform.testMachine" value="" />
<property name="testSubject.fileName" value="https://dequeuniversity.com/demo/mars/" />
<property name="testSubject.lineNum" value="-1" />
</properties>
<testcase name="color-contrast">
<failure message="Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds
https://dequeuniversity.com/rules/axe/4.12/color-contrast" impact="serious">
<![CDATA[https://dequeuniversity.com/demo/mars/]]>
CSS Path: <![CDATA[a[href="mars2.html?a=be_bold"] > h3]]>
HTML: <![CDATA[<h3>Be Bold...</h3>]]>
</failure>
</testcase>
</testsuite>
</testsuites>EARL
buildEARL produce un documento JSON-LD W3C EARL (Evaluaci贸n y Lenguaje de Informe) para crear informes de accesibilidad legibles por m谩quina. El @context declara los vocabularios utilizados, y @graph contiene una afirmaci贸n por resultado.
{
"@context": {
"@vocab": "http://www.w3.org/ns/earl#",
"earl": "http://www.w3.org/ns/earl#",
"WCAG2": "http://www.w3.org/TR/WCAG21/#",
"dct": "http://purl.org/dc/terms/",
"sch": "https://schema.org/",
"source": "dct:source",
"title": "dct:title",
"assertedBy": { "@type": "@id" },
"outcome": { "@type": "@id" },
"mode": { "@type": "@id" },
"isPartOf": { "@id": "http://purl.org/dc/terms/isPartOf", "@type": "@id" }
},
"@graph": [
{
"@type": "Assertion",
"mode": "earl:automatic",
"subject": {
"@type": ["earl:TestSubject", "sch:WebPage"],
"source": "https://dequeuniversity.com/demo/mars/"
},
"assertedBy": "https://github.com/dequelabs/axe-core/releases/tag/v4.12.1",
"result": {
"@type": "TestResult",
"outcome": "earl:failed"
},
"test": {
"@type": "TestCase",
"title": "color-contrast",
"@id": "https://dequeuniversity.com/rules/axe/4.12/color-contrast",
"isPartOf": ["WCAG2:contrast-minimum"]
}
}
]
}Soluci贸n de problemas
Un mensaje indica que se omiti贸 el pre-renderizado de HTML est谩tico
Si una ejecuci贸n imprime un mensaje que comienza con axe-devtools-reporter: skipping static HTML pre-rendering, el generador de informes no encontr贸 ning煤n navegador ni jsdom instalado. El informe a煤n se escribe y a煤n se renderiza cuando lo abres en un navegador, por lo que esta es una advertencia en lugar de un error. Para pre-renderizar el informe nuevamente, proporciona un navegador o instala jsdom como se describe en Pre-renderizar informes HTML. El mensaje se imprime una vez por ejecuci贸n, no una vez por informe.
Se escribe un informe HTML sin su contenido
Un informe que se abre vac铆o cuando se pre-renderiz贸 generalmente significa que no se le dio al navegador suficiente tiempo para construirlo. Aumenta virtualTimeBudgetMs en el argumento renderOptions a buildHTML. Los informes grandes son la causa com煤n.
Un informe grande falla por un desbordamiento de b煤fer
Aumenta maxBufferBytes en el argumento renderOptions a buildHTML. Esto limita la cantidad de salida renderizada que el generador de informes acepta desde el navegador, y por defecto es de 64 MB.
Obtener m谩s ayuda
Si tienes problemas para obtener resultados de los escaneos, contacta directamente a tu representante de Deque, comun铆canos a trav茅s de nuestro centro de soporte, o env铆anos un correo electr贸nico. Estaremos encantados de ayudar.
Ver tambi茅n
- Cargando Resultados de Accesibilidad JSON a Axe Reports describe c贸mo cargar tus resultados en Axe Reports.
- Obteniendo una Clave API de Axe Reports explica c贸mo obtener una clave API para comenzar a usar Axe Reports.
- Crear y Filtrar Informes muestra c贸mo puedes crear informes de accesibilidad en CSV, XML o HTML a partir de tus resultados de accesibilidad JSON. Tambi茅n puedes filtrar tu salida por severidad utilizando esta herramienta.
- C贸mo se Almacenan los Resultados JSON en el Disco describe las convenciones de nomenclatura de archivos para resultados de accesibilidad JSON.
- Usando la CLI para Enviar Resultados de Accesibilidad al Centro de Desarrolladores de Axe muestra c贸mo puedes subir tus archivos de resultados
.jsona Centro de Desarrolladores de Axe.
