Files
grafana/e2e/pa11yci.conf.js
Josh Hunt 8502e1f2ce CI: Fix pa11y check by running in docker-puppeteer image (#107084)
* Change pa11y dagger to run in docker-puppeteer image

* export json results

* re-enable pa11y ci check

* update gha workflow to new flags

* add no-threshold-fail, use single pa11y config

* fix codeowners

* readme

* fix drone config
2025-06-24 14:40:37 +01:00

141 lines
3.7 KiB
JavaScript

const config = {
defaults: {
concurrency: 1,
runners: ['axe'],
useIncognitoBrowserContext: false,
standard: 'WCAG2AA',
chromeLaunchConfig: {
executablePath: '/usr/bin/google-chrome',
args: ['--no-sandbox'],
},
// see https://github.com/grafana/grafana/pull/41693#issuecomment-979921463 for context
// on why we're ignoring singleValue/react-select-*-placeholder elements
hideElements: '#updateVersion, [class*="-singleValue"], [id^="react-select-"][id$="-placeholder"]',
reporters: ['cli', ['json', { fileName: './pa11y-ci-results.json' }]],
},
urls: [
{
url: '${HOST}/login',
threshold: 0,
},
{
url: '${HOST}/login',
actions: [
"wait for element input[name='user'] to be added",
"set field input[name='user'] to admin",
"set field input[name='password'] to admin",
"click element button[data-testid='data-testid Login button']",
"wait for element button[data-testid='data-testid Skip change password button'] to be visible",
],
threshold: 2,
},
{
url: '${HOST}/?orgId=1',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge',
threshold: 0,
},
// Dashboard settings
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=settings',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=annotations',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=variables',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=links',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=versions',
threshold: 0,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=permissions',
// TODO: improve the accessibility of the permission tab https://github.com/grafana/grafana/issues/77203
threshold: 5,
},
{
url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=dashboard_json',
threshold: 2,
},
// Misc
{
url: '${HOST}/?orgId=1&search=open',
threshold: 0,
},
{
url: '${HOST}/alerting/list',
// the unified alerting promotion alert's content contrast is too low
// see https://github.com/grafana/grafana/pull/41829
threshold: 7,
},
{
url: '${HOST}/datasources',
threshold: 0,
},
{
url: '${HOST}/org/users',
threshold: 2,
},
{
url: '${HOST}/org/teams',
threshold: 0,
},
{
url: '${HOST}/plugins',
threshold: 0,
},
{
url: '${HOST}/org',
threshold: 2,
},
{
url: '${HOST}/org/apikeys',
threshold: 4,
},
{
url: '${HOST}/dashboards',
threshold: 2,
},
],
};
function myPa11yCiConfiguration(urls, defaults) {
const HOST_SERVER = process.env.HOST || 'localhost';
const PORT_SERVER = process.env.PORT || '3001';
const noThresholds = process.env.NO_THRESHOLDS === 'true';
urls = urls.map((test, index) => {
return {
...test,
url: test.url.replace('${HOST}', `${HOST_SERVER}:${PORT_SERVER}`),
screenCapture: `./screenshots/screenshot-${index}.png`,
rootElement: '.main-view',
wait: 500,
// Depending on NO_THRESHOLDS (--no-threshold-fail in the dagger command), clear the thresholds
// to allow pa11y to fail the check and include error details in the results file
threshold: noThresholds ? undefined : test.threshold,
};
});
return {
defaults: defaults,
urls: urls,
};
}
module.exports = myPa11yCiConfiguration(config.urls, config.defaults);