Episode ini membahas accessibility testing dengan Cypress: menambahkan axe-core untuk accessibility assertions, menguji keyboard navigation, ARIA roles, dan semantic HTML, memahami accessibility rules, serta membangun accessible test flows.

Web yang tidak dapat diakses adalah web yang menutup pintu bagi sebagian pengguna. Episode 17 membahas accessibility testing di Cypress: menambahkan axe-core, menguji keyboard navigation, ARIA roles, dan semantic HTML, memahami accessibility rules, serta membangun test flows yang mencakup aksesibilitas.
Accessibility bukan fitur tambahan — ia bagian dari kualitas. Test yang memeriksanya menjaga aplikasi tetap ramah bagi pengguna screen reader dan navigasi keyboard.
axe-core adalah engine analisis aksesibilitas yang bisa dipakai langsung di Cypress:
npm install -D cypress-axe axe-corenpm install -D cypress-axe axe-core menambahkan command cy.checkA11y dan engine analysis. Pastikan juga di-import di cypress/support/e2e.js:
import "cypress-axe";import "cypress-axe" membuat command aksesibilitas tersedia di seluruh spec.
Setelah halaman dimuat, jalankan pemeriksaan otomatis:
it("halaman login tidak punya pelanggaran a11y", () => {
cy.visit("/login");
cy.checkA11y();
});cy.checkA11y() memindai halaman dan gagal jika menemukan pelanggaran aturan axe. Default-nya seluruh aturan WCAG dijalankan; kegagalan ditampilkan lengkap dengan elemen dan rekomendasi perbaikan.
Pengguna yang tidak memakai mouse bergantung pada keyboard. Uji urutan tab dan shortcut:
cy.get("[data-cy=search-input]").focus();
cy.get("body").type("{tab}");
cy.focused().should("have.attr", "data-cy", "search-button");cy.focused() membaca elemen yang sedang fokus. Assertion have.attr memastikan tab memindahkan fokus ke tombol yang benar — verifikasi urutan navigasi keyboard yang sesungguhnya.
Periksa bahwa elemen interaktif memakai role yang benar:
cy.get("[role=dialog]").should("be.visible");
cy.get("[data-cy=close-dialog]").should("have.attr", "aria-label", "Tutup dialog");[role=dialog] memastikan modal dinyatakan sebagai dialog. aria-label: "Tutup dialog" memberi nama yang terbaca screen reader untuk tombol tutup — praktik yang wajib untuk elemen ikon tanpa teks.
Terkadang kalian ingin mengesampingkan aturan tertentu atau fokus pada aturan tertentu:
cy.checkA11y(null, {
rules: {
"color-contrast": { enabled: false },
},
});"color-contrast": { enabled: false } menonaktifkan pemeriksaan kontras warna. Gunakan selektif — misalnya saat menguji komponen yang kontrasnya diatur brand — dan jangan dinonaktifkan tanpa alasan.
Pemeriksaan bisa diarahkan ke wilayah halaman tertentu:
cy.checkA11y("[data-cy=form-pendaftaran]");cy.checkA11y("[data-cy=form-pendaftaran]") membatasi pemindaian pada form tersebut. Pola ini mempercepat pemindaian dan membuat pesan kegagalan lebih mudah dilacak.
Jadikan aksesibilitas bagian dari alur, bukan test terpisah. Tambahkan pemeriksaan setelah halaman utama dimuat:
it("alur pendaftaran dapat diakses", () => {
cy.visit("/daftar");
cy.checkA11y();
cy.get("[data-cy=nama]").type("Arman");
cy.get("[data-cy=email]").type("user@example.com");
cy.checkA11y("[data-cy=form-daftar]");
cy.get("[data-cy=submit]").click();
cy.contains("Pendaftaran berhasil").should("be.visible");
});Pemeriksaan cy.checkA11y() di awal dan di tengah alur memastikan halaman maupun interaksi tetap dapat diakses. Dengan pola ini, regresi aksesibilitas terdeteksi sejak awal, bukan setelah rilis.
Tip
Integrasikan pemeriksaan aksesibilitas ke alur utama yang paling sering dikunjungi pengguna. Dua atau tiga halaman kunci yang teruji aksesibilitasnya lebih bernilai daripada ratusan halaman yang tidak pernah dicek.
Episode 17 menempatkan aksesibilitas sebagai bagian pengujian: menambahkan axe-core lewat cypress-axe, memeriksa keyboard navigation dengan cy.focused(), memvalidasi ARIA roles dan semantic HTML, menyaring rules sesuai kebutuhan, serta menanamkan pemeriksaan di alur utama.
Inti yang harus dibawa pulang:
cy.checkA11y() memindai halaman terhadap aturan WCAG.cy.focused() setelah menekan {tab}.aria-label yang deskriptif.Di episode 18 selanjutnya kita akan membahas custom plugins dan extensions — memakai Cypress plugins dan community modules, membuat plugin custom, memperluas commands dan task APIs, serta pola plugin yang bisa dipakai ulang.