@casoon/auditmysite
Version:
A comprehensive command-line tool for automated accessibility, security, performance, and SEO testing using Playwright and pa11y, based on sitemap URLs
93 lines • 4.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AriaLandmarksTest = void 0;
const base_test_1 = require("../base-test");
class AriaLandmarksTest extends base_test_1.BaseAccessibilityTest {
constructor() {
super(...arguments);
this.name = 'ARIA Landmarks';
this.description = 'Check for proper ARIA landmarks and roles';
this.category = 'aria';
this.priority = 'high';
this.standards = ['WCAG 2.1 AA', 'WCAG 2.2 AA', 'Section 508'];
}
async run(context) {
const { page } = context;
try {
const result = await this.evaluateOnPage(page, () => {
const issues = [];
const warnings = [];
let totalIssues = 0;
// Check for main landmark
const mainLandmarks = document.querySelectorAll('main, [role="main"]');
if (mainLandmarks.length === 0) {
totalIssues++;
issues.push('No main landmark found');
}
else if (mainLandmarks.length > 1) {
warnings.push('Multiple main landmarks found - should only have one');
}
// Check for navigation landmarks
const navLandmarks = document.querySelectorAll('nav, [role="navigation"]');
if (navLandmarks.length === 0) {
warnings.push('No navigation landmark found');
}
// Check for banner landmark
const bannerLandmarks = document.querySelectorAll('header, [role="banner"]');
if (bannerLandmarks.length === 0) {
warnings.push('No banner landmark found');
}
// Check for contentinfo landmark
const contentinfoLandmarks = document.querySelectorAll('footer, [role="contentinfo"]');
if (contentinfoLandmarks.length === 0) {
warnings.push('No contentinfo landmark found');
}
// Check for proper ARIA labels
const elementsWithRole = document.querySelectorAll('[role]');
elementsWithRole.forEach((element) => {
const el = element;
const role = el.getAttribute('role');
const hasAriaLabel = el.hasAttribute('aria-label');
const hasAriaLabelledBy = el.hasAttribute('aria-labelledby');
const hasVisibleText = el.textContent && el.textContent.trim().length > 0;
// Elements that should have labels
const rolesNeedingLabels = ['button', 'link', 'menuitem', 'tab', 'option', 'combobox'];
if (rolesNeedingLabels.includes(role || '') && !hasAriaLabel && !hasAriaLabelledBy && !hasVisibleText) {
totalIssues++;
issues.push(`Element with role="${role}" missing aria-label or aria-labelledby: ${el.outerHTML}`);
}
});
// Check for invalid ARIA attributes
const elementsWithInvalidAria = document.querySelectorAll('[aria-invalid="true"]');
elementsWithInvalidAria.forEach((element) => {
const el = element;
const hasAriaDescribedBy = el.hasAttribute('aria-describedby');
if (!hasAriaDescribedBy) {
totalIssues++;
issues.push(`Element with aria-invalid="true" missing aria-describedby: ${el.outerHTML}`);
}
});
return {
totalIssues,
issues,
warnings,
landmarks: {
main: mainLandmarks.length,
nav: navLandmarks.length,
banner: bannerLandmarks.length,
contentinfo: contentinfoLandmarks.length
}
};
});
return this.createResult(result.totalIssues === 0, result.totalIssues, result.issues, result.warnings, {
category: 'aria-landmarks',
landmarks: result.landmarks
});
}
catch (error) {
return this.createErrorResult(`ARIA landmarks test failed: ${error}`);
}
}
}
exports.AriaLandmarksTest = AriaLandmarksTest;
//# sourceMappingURL=aria-landmarks-test.js.map