Kiểm tra khả năng truy cập API
Kiểm tra URL hoặc HTML theo WCAG 2.2 A / AA bằng axe-core: thiếu alt ảnh, nhãn form, tên link và nút, lỗi ARIA, thứ tự heading và nhiều lỗi khác.
Gửi html (mã nguồn trang) hoặc một url công khai. Trang được phân tích thành DOM mà không cần trình duyệt và kiểm tra bằng bộ quy tắc axe-core (Deque, MPL-2.0) theo level WCAG đã chọn (a, aa mặc định, aaa) cùng các thực hành tốt: alt của ảnh, nhãn form, tên link và nút, tiêu đề và ngôn ngữ trang, thứ tự heading, landmark, danh sách, bảng, role và giá trị thuộc tính ARIA, id ARIA trùng, giá trị autocomplete, chặn phóng to trong thẻ meta viewport, tiêu đề iframe…
Mỗi lỗi có mã quy tắc, impact (critical, serious, moderate, minor), tiêu chí WCAG (ví dụ 1.1.1), link hướng dẫn và tối đa max_nodes phần tử vi phạm kèm CSS selector, đoạn HTML và cách sửa. score (0-100) tóm tắt kết quả; needs_review liệt kê các kiểm tra axe chưa kết luận được.
Các quy tắc cần trang đã hiển thị (tương phản màu, kích thước vùng chạm, khoảng cách chữ, vùng cuộn, thứ tự focus) không được chạy và được liệt kê trong not_checked; nội dung do JavaScript thêm vào không được thấy. Kiểm tra tự động chỉ phát hiện một phần lỗi WCAG, nên hãy kiểm tra thủ công thêm. HTML tối đa 3 MB.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
url | body|query | string | không | Trang công khai cần tải (HTML tối đa 3 MB). Dùng html cho trang cần đăng nhập. | |
html | body | string | không | Mã nguồn trang cần kiểm tra (hoặc gửi dạng body text/html). | |
level | body|query | string | không | aa | Mức WCAG: a, aa hoặc aaa. |
best_practices | body|query | boolean | không | true | Gồm các quy tắc best practice của axe (thứ tự heading, landmark, heading rỗng…). |
max_nodes | body|query | number | không | 10 | Số phần tử vi phạm trả về cho mỗi quy tắc (1-100). |
include_passes | body|query | boolean | không | false | Liệt kê cả các quy tắc đạt. |
experimental | body|query | boolean | không | false | Gồm các quy tắc thử nghiệm của axe. |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/a11y-check" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"html":"<!doctype html><html><head><title>Shop</title></head><body><img src=\"logo.png\"><a href=\"/cart\"></a><form><input type=\"email\" placeholder=\"Email\"><button></button></form></body></html>"}'const res = await fetch('https://apibox.io.vn/v1/a11y-check', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"html": "<!doctype html><html><head><title>Shop</title></head><body><img src=\"logo.png\"><a href=\"/cart\"></a><form><input type=\"email\" placeholder=\"Email\"><button></button></form></body></html>"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/a11y-check",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"html": "<!doctype html><html><head><title>Shop</title></head><body><img src=\"logo.png\"><a href=\"/cart\"></a><form><input type=\"email\" placeholder=\"Email\"><button></button></form></body></html>"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/a11y-check');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"html":"<!doctype html><html><head><title>Shop</title></head><body><img src=\\"logo.png\\"><a href=\\"/cart\\"></a><form><input type=\\"email\\" placeholder=\\"Email\\"><button></button></form></body></html>"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"source": "html",
"url": null,
"level": "AA",
"score": 75,
"issues": 8,
"by_impact": {
"critical": 2,
"serious": 2,
"moderate": 4,
"minor": 0
},
"rules": {
"checked": 83,
"failed": 7,
"needs_review": 1,
"not_checked": 8
},
"violations": [
{
"rule": "button-name",
"impact": "critical",
"level": "A",
"wcag": [
"4.1.2"
],
"best_practice": false,
"help": "Buttons must have discernible text",
"description": "Ensure buttons have discernible text",
"help_url": "https://dequeuniversity.com/rules/axe/4.14/button-name?application=axeAPI",
"count": 1,
"nodes": [
{
"target": "button",
"html": "<button></button>",
"failure": "Element does not have inner text that is visible to screen readers | aria-label attribute does not exist or is empty | …"
}
]
},
{
"rule": "image-alt",
"impact": "critical",
"level": "A",
"wcag": [
"1.1.1"
],
"best_practice": false,
"help": "Images must have alternative text",
"description": "Ensure <img> elements have alternative text or a role of none or presentation",
"help_url": "https://dequeuniversity.com/rules/axe/4.14/image-alt?application=axeAPI",
"count": 1,
"nodes": [
{
"target": "img",
"html": "<img src=\"logo.png\">",
"failure": "Element does not have an alt attribute | …"
}
]
},
"…"
],
"needs_review": [
{
"rule": "bypass",
"impact": "serious",
"help": "Page must have means to bypass repeated blocks",
"wcag": [
"2.4.1"
],
"…": "…"
}
],
"not_checked": [
{
"rule": "avoid-inline-spacing",
"wcag": [
"1.4.12"
],
"reason": "needs the CSS object model"
},
{
"rule": "color-contrast",
"wcag": [
"1.4.3"
],
"reason": "needs rendered colours and layout"
},
"…"
],
"engine": "axe-core 4.14.0 (static DOM, no layout)",
"ms": 34,
"note": "Static check without a browser: colour contrast, target size, focus order and anything that depends on CSS layout or scripts are not tested. …"
}
Ứng dụng
- Kiểm tra trang trước khi ra mắt theo Đạo luật Tiếp cận châu Âu hoặc yêu cầu của cơ quan nhà nước
- Thêm bước kiểm tra khả năng truy cập vào CI cho site tĩnh và template
- Tìm ảnh thiếu alt và ô nhập liệu không có nhãn trên toàn site
- Lập danh sách lỗi WCAG cho báo cáo đánh giá gửi khách hàng
Hỏi đáp
Có giống chạy axe trong trình duyệt không?
API chạy cùng bộ quy tắc axe-core trên DOM tĩnh. Các quy tắc cần bố cục hoặc màu đã tính (tương phản màu, kích thước vùng chạm) không chạy được và nằm trong not_checked; nội dung do JavaScript tạo ra không được kiểm tra.
Kiểm tra theo phiên bản WCAG nào?
Các quy tắc WCAG 2.0, 2.1 và 2.2 đến mức bạn chọn (A, AA mặc định, hoặc AAA), cùng các quy tắc best practice của axe trừ khi best_practices=false.
Điểm được tính thế nào?
Bắt đầu từ 100 và trừ theo mỗi quy tắc bị vi phạm tuỳ mức độ (critical 10, serious 6, moderate 3, minor 1) so với số quy tắc đã kiểm tra. Dùng để theo dõi tiến độ, không phải chứng nhận tuân thủ.
API liên quan
Metadata của URL
Lấy tiêu đề, mô tả, thẻ Open Graph, Twitter Card, favicon, canonical, RSS và JSON-LD của bất kỳ URL nào dưới dạng JSON.
H:HTTP Header
Xem mã trạng thái HTTP và toàn bộ response header của một URL, kèm tóm tắt các security header như HSTS, CSP, X-Frame-Options.
301Kiểm tra chuyển hướng
Theo từng lần chuyển hướng 301, 302, 307, 308 của một URL và nhận toàn bộ chuỗi kèm mã trạng thái, URL cuối và số bước.