Ana içeriğe geç

Erişilebilirlik Doğrulamaları (axe-core)

TestFly 1.0.0, axe-core 4.10.2'yi doğrudan JAR içinde paketler. Sıfır ek bağımlılıkla bir WCAG taraması çalıştırmak için open() işleminden sonra accessibility() çağırın.


Hızlı örnek​

public class CheckoutAccessibilityTest extends BaseTest {

@Test
public void checkout_passesWCAG21AA() {
open("/checkout");

accessibility()
.withTags("wcag2a", "wcag21aa") // WCAG 2.1 AA kuralları
.withLevel(Impact.SERIOUS) // SERIOUS veya CRITICAL'de hata ver
.excluding("#cookie-banner") // üçüncü parti widget'ı atla
.run();
}
}

API başvurusu​

accessibility() — giriş noktası​

BaseTest ve BaseJUnit5Test içinde mevcuttur. Bir AccessibilityAssert oluşturucu (builder) döndürür.

Oluşturucu metotları​

MetotAçıklama
.withTags(String... tags)Yalnızca verilen axe-core etiketleriyle eşleşen kuralları çalıştırır. Yaygın etiketler: "wcag2a", "wcag2aa", "wcag21aa", "wcag22aa", "best-practice". Varsayılan: tüm kurallar.
.withLevel(Impact minimum)Yalnızca bu önem düzeyine eşit veya daha yüksek ihlaller için hata verir. Varsayılan: Impact.MINOR (tüm ihlaller hata üretir).
.excluding(String... selectors)Taramadan hariç tutulacak CSS seçicileri. Bu öğelerde köklenen alt ağaçlar yok sayılır.
.withContext(String selector)Taramayı bu CSS seçicisinde köklenen alt ağaçla sınırlar.

Uç (terminal) metotlar​

MetotAçıklama
.run()Taramayı çalıştırır ve yapılandırılan düzeyde ihlal bulunursa AssertionError fırlatır.
.collect()Taramayı çalıştırır ve doğrulama yapmadan AccessibilityResult döndürür.

Önem düzeyleri​

Impact.CRITICAL   // yardımcı teknoloji kullanıcıları için erişilemez
Impact.SERIOUS // geçici çözüm olasılığı olan ciddi engel
Impact.MODERATE // tam blokaj olmadan bozulmuş deneyim
Impact.MINOR // gerçek dünya etkisi düşük, en iyi uygulamadan sapma

Sıralama: CRITICAL > SERIOUS > MODERATE > MINOR.


Kapsamlı taramalar​

// Yalnızca giriş formunu tara
accessibility()
.withContext("#login-form")
.run();

// Bilinen erişilemez üçüncü parti widget'ları hariç tut
accessibility()
.excluding("#intercom-container", "#zendesk-widget")
.run();

Doğrulama yapmadan sonuçları toplama​

AccessibilityResult result = accessibility()
.withTags("wcag2a", "wcag21aa")
.collect();

System.out.println("İhlaller: " + result.violationCount());
System.out.println("Geçen kurallar: " + result.passCount());

for (AccessibilityViolation v : result.violations()) {
System.out.println("[" + v.impact() + "] " + v.id() + " — " + v.help());
v.nodes().forEach(n -> System.out.println(" " + n.target()));
}

// Yumuşak doğrulama — en fazla 2 küçük ihlale tolerans göster
softAssert().that(
result.violationsAtLevel(Impact.SERIOUS).isEmpty(),
"Serious ihlaller bulundu:\n" + result.violations()
);

Hata mesajı biçimi​

.run() ihlal bulduğunda tam bir rapor içeren bir AssertionError fırlatır:

[Accessibility] 2 violations found on: https://example.com/checkout
Rules: wcag2a, wcag21aa
Minimum impact: SERIOUS

1. [CRITICAL] image-alt
Ensures <img> elements have alternate text
Fix: Images must have alternate text
Docs: https://dequeuniversity.com/rules/axe/4.10/image-alt
→ img.hero-banner
Fix any of the following: Element does not have an alt attribute

2. [SERIOUS] color-contrast
Ensures the contrast ratio between foreground and background colors meets thresholds
Fix: Elements must have sufficient color contrast
Docs: https://dequeuniversity.com/rules/axe/4.10/color-contrast
→ p.disclaimer-text
Fix any of the following: Element has insufficient color contrast of 3.5 (Expected 4.5:1)
… and 3 more node(s)

Yaygın WCAG etiket kombinasyonları​

AmaçEtiketler
WCAG 2.0 A"wcag2a"
WCAG 2.0 AA (birçok ülkede asgari yasal gereklilik)"wcag2a", "wcag2aa"
WCAG 2.1 AA (AB Erişilebilirlik Yasası, ADA)"wcag2a", "wcag21aa"
WCAG 2.2 AA"wcag2a", "wcag21aa", "wcag22aa"
En iyi uygulamalar (WCAG ötesi)"best-practice"

Notlar​

  • axe-core her sayfa yüklendiğinde tarayıcıya bir kez enjekte edilir. Aynı sayfaya yapılan sonraki accessibility() çağrıları zaten enjekte edilmiş örneği yeniden kullanır.
  • İnternet bağlantısı gerekmez — axe-core 4.10.2, sınıf yolu (classpath) kaynağı olarak JAR içinde paketlenmiştir.
  • Ek bir Maven bağımlılığı gerekmez.