Accessibility Testing: Garantindo Inclusão e Conformidade WCAG

Testes Automatizados · 6 de julho de 2026

📖 4 min de leitura

O Que é Acessibilidade?

Acessibilidade web garante que pessoas com deficiências podem usar websites. No Brasil, a Lei Brasileira de Inclusão (Lei 13.146/2015) exige acessibilidade em sites públicos e de empresas.

Por Que Importa?

  • Inclusão: 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} da população tem algum tipo de deficiência
    1. Legal: Conformidade com LGPD e leis
    2. SEO: Sites acessíveis rankeiam melhor
    3. UX: Boas práticas beneficiam todos

    WCAG 2.1 – 4 Princípios

    1. Perceivable (Perceptível)

    
    Empresa X - Página inicial
    
    




    .text {
    color: #1a1a1a; / Pior: #767676 = 4.5:1 em fundo branco /
    background: #ffffff; / Melhor: #1a1a1a = 21:1 em fundo branco /
    }

    2. Operable (Operável)

    
    
    
    


    .skip-link {
    position: absolute;
    top: -40px;
    left: 0;
    background: #000;
    color: #fff;
    padding: 8px;
    z-index: 100;
    }
    .skip-link:focus {
    top: 0;
    }


    :focus {
    outline: 3px solid #005fcc;
    outline-offset: 2px;
    }

    3. Understandable (Compreensível)

    
    
    
    Formato: usuario@dominio.com
    
    



    4. Robust (Robusto)

    
    

    ARIA – Accessible Rich Internet Applications

    Roles

    
    

    Estados e Propriedades

    
    


    Testes Automatizados

    axe-core

    // Playwright + axe
    const { test, expect } = require('@playwright/test');
    const AxeBuilder = require('@axe-core/playwright').default;
    
    

    test('accessibility on login page', async ({ page }) => {
    await page.goto('/login');

    const accessibilityScanResults = await new AxeBuilder({ page })
    .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'])
    .analyze();

    // Log violations
    if (accessibilityScanResults.violations.length > 0) {
    console.log('Violations found:');
    accessibilityScanResults.violations.forEach(v => {
    console.log( - ${v.id}: ${v.description});
    });
    }

    // Fail if critical violations
    const critical = accessibilityScanResults.violations.filter(
    v => v.impact === 'critical'
    );
    expect(critical.length, ${critical.length} critical violations).toBe(0);
    });

    # pytest + axe
    import pytest
    from playwright.sync_api import Page
    
    

    def test_accessibility(page: Page):
    page.goto('/login')

    results = page.run_axe()

    critical_violations = [
    v for v in results['violations']
    if v['impact'] in ['critical', 'serious']
    ]

    assert len(critical_violations) == 0, (
    f"Found {len(critical_violations)} critical accessibility violations"
    )

    Lighthouse CI

    # .github/workflows/a11y.yml
    name: Accessibility Tests
    
    

    on: [push, pull_request]

    jobs:
    accessibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Run Lighthouse CI
    uses: treosh/lighthouse-ci-action@v10
    with:
    urls: |
    https://example.com/
    https://example.com/login
    budgetPath: ./lighthouse-budget.json
    uploadArtifacts: true
    temporaryPublicStorage: true

    # lighthouse-budget.json
    {
    "ci": {
    "collect": {
    "startServerCommand": "npm run start",
    "url": [
    "http://localhost:8080/"
    ]
    },
    "assert": {
    "assertions": {
    "categories:accessibility": ["error", {"minScore": 0.9}]
    }
    }
    }
    }


    Testes Manuais

    Checklist de Testes Manuais

    # Accessibility Testing Checklist
    
    

    Navegação por Teclado

    1. [ ] Tab percorre todos os elementos interativos
    2. [ ] ordem de foco faz sentido
    3. [ ] Focus é sempre visível
    4. [ ] Links úteis no topo (skip link)
    5. [ ] ESC fecha modais
    6. [ ] Enter ativa botões e links

    Imagens

    1. [ ] Todas imagens têm alt text
    2. [ ] Alt text descreve conteúdo/função
    3. [ ] Imagens decorativas têm alt=""
    4. [ ] Textos em imagens evitados

    Contrastes

    1. [ ] Texto normal: 4.5:1 mínimo
    2. [ ] Texto grande (18pt+): 3:1 mínimo
    3. [ ] Gráficos: 3:1

    Formulários

    1. [ ] Labels associados a inputs
    2. [ ] Erros descritos claramente
    3. [ ] Campos obrigatórios marcados
    4. [ ] Autocomplete quando aplicável

    Semântica

    1. [ ] Cabeçalhos em ordem (h1 > h2 > h3)
    2. [ ] Listas usam
        /
        1. [ ] Tabelas têm headers
        2. [ ] Landmarks definidos

        ARIA

        1. [ ] ARIA usado quando HTML não é suficiente
        2. [ ] ARIA não sobrepõe semântica nativa
        3. [ ] Live regions atualizam corretamente

    Screen Reader Testing

    # Screen Reader Testing
    
    

    VoiceOver (macOS)

    1. Cmd + F5: Ativar VoiceOver
    2. Tab/Cmd + Option + Setas: Navegar
    3. Cmd + Option + U: Rotor

    NVDA (Windows)

    1. Insert + D: Ler documento
    2. Tab: Próximo elemento
    3. Insert + Espaço: Modo foco

    Verificar:

    1. [ ] Ordem de leitura faz sentido
    2. [ ] Imagens descritas
    3. [ ] Links têm contexto
    4. [ ] Formulários etiquetados
    5. [ ] Tabelas fazem sentido
    6. [ ] Headings navegáveis

Ferramentas

Ferramenta Tipo Custo
axe DevTools Browser Extension Grátis
WAVE Browser Extension Grátis
Lighthouse DevTools/CLI Grátis
AXE-core Library Grátis
SiteImprove SaaS Pago
Deque aXe Enterprise Pago
Tenon.io API Pago

Conclusão

Acessibilidade é fundamental para inclusão. As chaves são:

  1. Semântica primeiro – Use HTML correto
  2. Teste automatizado – Capture issues rapidamente
  3. Teste manual – Screen readers e teclado
  4. WCAG compliance – Atingir nível AA mínimo
  5. Continuous testing – Integre ao CI/CD