Accessibility scoring don’t tell much about actual state of accessibility

Note: This post is older than two years. It may still be totally valid, but things change and technology moves fast. Code based posts may be especially prone to changes...

Number of words: 3879.

(Loaded 836 times)

In this blog post I go into details behind automatic accessibility testing and how I don’t really trust any accessibility scores such tools provide.
It all drills down to inability of automatic tools to pass WCAG success criteria and limited ability of them to fail some. Manual testing is the only real way to really know about state of accessibility.

With Web Accessibility Directive (WAD) now more than two years old we probably see more accessibility statements when we browse, especially on public sector websites in European Union.

I like that and I also like that sometimes even private sector tries to make their accessibility statements (especially those companies that are often selling to private sector). Another positive impact of WAD that can be seen as an improvement.

Because it’s not necessarily that. I have to write about different scores that sometimes appear in accessibility statements and are actually not presenting the whole truth about accessibility although their name says exactly that they are.

Your automatic test is saying your accessibility score is 100% and you can wrongly think you conform to WCAG

I’ve seen folks using Google Lighthouse accessibility score on their accessibility statement as a proof that their site is compliant with WCAG 2.1 on levels A and AA. A lot of larger businesses like to use some corporate tooling scoring that mentions their accessibility score is 100/100 and similar.

I like automatic tools, don’t get me wrong. I even coded my own automatic accessibility testing tool – aXeSiA, just to see how I can get a better statistic analysis based on all public facing sites on a domain.

They enable us with bulk test results, to catch the problems that can be easy to detect in the code and sometimes also in the interpreted code (like CSS and HTML combined).

But let me remind us about some major downsides of such tools:

  1. Automatic tools can only cover up to ca. 30% of all WCAG success criteria.
  2. Automatic tools can only detect fails but often they can’t confirm passes.
  3. Automatic tools can sometimes report false positives – fails that are actually not fails
  4. Automatic tools can sometimes fail to check the site – they are prone to bugs as any other software

With these downsides in mind we can quickly conclude that even when we get a 100% pass from an automatic tool that doesn’t really mean a lot in regards with WCAG. It means that our code seems to be without detectable faults.

So writing that your score is 100% doesn’t actually mean a lot. It just means that your code is passing some predefined test rules that can’t really cover everything WCAG does.

Please try to understand that when you use your score as proof. It’s a good thing to pass all those automatic tests, I am not arguing that. But it is far from enough and it’s only a start, not the end. It’s a good start, don’t get me wrong, but it is only a start and actually a minimum.

Dirty details behind automatic accessibility testing

Automatic accessibility testing tools try to cover as much of WCAG success criteria as possible. I hope that some day we can get to a point that they are so reliable that we can trust them 100% and concentrate on user testing. But it will take a lot of time and effort if it will even be possible. Call me an optimistic realist. For now, we are quite behind and it seems like it will always be like that, considering the efforts made on progress overall and progress of automatic accessibility testing.

Automatic testing can prevent releases of code that is most likely to negatively effect overall accessibility. But they can’t really confirm that the the code really makes our product accessible. They can only find fails, but they can’t confirm passes – a simple example is if image is missing alt attribute. That’s a 100% fail. But if it has the attribute and it is empty it doesn’t mean that it is 100% correct pass. The image may not be decorative, so alt text should be there.

As Manuel Matuzović wrote in his “Building the most inaccessible site possible with a perfect Lighthouse score” (opens in new window) – we can very quickly make a totally inaccessible website that still gets the best scores when checked with automatic accessibility testing tools.

And it isn’t really strange when we know about the background.

Almost all accessibility testing tools are based on similar or even same test rules, defined by accessibility professionals gathered in ACT Rules Community (W3C group, opens in new window). ACT Rules community work on testable rules (opens in new window) that can then be implemented as automatic tests in different tools, like Deque’s axe and Google’s Lighthouse (which is actually using axe behind the scenes (opens in new window)).

So at the time of writing this blog post there are 91 ACT rules (including deprecated). This does not mean that they cover all different WCAG success criteria! I did a quick analysis and parsed them so that I can capture current state for you.

ACT rules define 38 out of 78 WCAG success criterion tests for fails

After parsing the list of ACT rules I managed to discover that there are 38 rules (or tests) that can be mapped to WCAG success criteria. This means that the group managed to write 38 rules out of 78 (all WCAG 2.1 success criteria on all levels (A, AA and AAA)).

  1. 1.1.1 Non-Text Content (Level A)
  2. 1.2.1 Audio-Only And Video-Only (Prerecorded) (Level A)
  3. 1.2.2 Captions (Prerecorded) (Level A)
  4. 1.2.3 Audio Description Or Media Alternative (Prerecorded) (Level A)
  5. 1.2.5 Audio Description (Prerecorded) (Level AA)
  6. 1.2.8 Media Alternative (Prerecorded) (Level AAA)
  7. 1.3.1 Info And Relationships (Level A)
  8. 1.3.3 Sensory Characteristics (Level A)
  9. 1.3.4 Orientation (Level AA)
  10. 1.3.5 Identify Input Purpose (Level AA)
  11. 1.4.12 Text Spacing (Level AA)
  12. 1.4.2 Audio Control (Level A)
  13. 1.4.3 Contrast (Minimum) (Level AA)
  14. 1.4.4 Resize Text (Level AA)
  15. 1.4.5 Images Of Text (Level AA)
  16. 1.4.6 Contrast (Enhanced) (Level AAA)
  17. 1.4.9 Images Of Text (No Exception) (Level AAA)
  18. 2.1.1 Keyboard (Level A)
  19. 2.1.2 No Keyboard Trap (Level A)
  20. 2.1.3 Keyboard (No Exception) (Level AAA)
  21. 2.1.4 Character Key Shortcuts (Level A)
  22. 2.2.1 Timing Adjustable (Level A)
  23. 2.2.2 Pause, Stop, Hide (Level A)
  24. 2.2.4 Interruptions (Level AAA)
  25. 2.4.1 Bypass Blocks (Level A)
  26. 2.4.2 Page Titled (Level A)
  27. 2.4.4 Link Purpose (In Context) (Level A)
  28. 2.4.6 Headings And Labels (Level AA)
  29. 2.4.7 Focus Visible (Level AA)
  30. 2.4.9 Link Purpose (Link Only) (Level AAA)
  31. 2.5.3 Label In Name (Level A)
  32. 2.5.4 Motion Actuation (Level A)
  33. 3.1.1 Language Of Page (Level A)
  34. 3.1.2 Language Of Parts (Level AA)
  35. 3.2.5 Change On Request (Level AAA)
  36. 3.3.1 Error Identification (Level A)
  37. 4.1.1 Parsing (Level A)
  38. 4.1.2 Name, Role, Value (Level A)

Not all of them are actually implemented by automatic accessibility testing tools, but the rules are defined and potentially it means that they will also be implemented.

Now there is a problem – as mentioned before – the rules don’t cover passes but only fails, and also that is not the whole story – the fails are limited to some of multiple possible.

So – again – please don’t think that automatic accessibility testing tools can now find if you conform to half of whole WCAG 2.1! This only means that there are theoretical rules that can find fails for 38 of 78 WCAG success criteria.

Automatic accessibility testing tools can only find failures. Passes can only be established manually. Watch also out for falsely reported failures, all software has bugs and border cases.

my reflection about automatic accessibility testing tools.

There are 101 accessibility requirement mappings for 88 non-deprecated rules

Some rules are deprecated, so I removed them and out of 91 rules 88 are non-deprecated. Rules can cover multiple accessibility requirements mappings, so this means that 1 rule can cover 1 WCAG and 1 best practice, for example.

NumberAccessibility Requirements MappingIs WCAG Success Criterion?Rules
1This rule is not required for conformance.falseARIA attribute is defined in WAI-ARIA, Audio element content has transcript, Audio element content is media alternative for text, Document has a landmark with non-repeated content, Element marked as decorative is not exposed, Focusable element has no keyboard trap via non-standard navigation, Focusable element has no keyboard trap via standard navigation, Video element content is media alternative for text, Video element visual-only content is media alternative for text
21.3.1 Info And Relationships (Level A)trueARIA required context role, ARIA required owned elements, Headers attribute specified on a cell refers to cells in the same table element, Heading has non-empty accessible name, Role attribute has valid value, Table header cell has assigned cells
3ARIA 1.1, 6.3 Values For States And PropertiesfalseARIA state or property has valid value
4ARIA5: Using WAI-ARIA State And Property Attributes To Expose The State Of A User Interface ComponentfalseARIA state or property is permitted, Element with role attribute has required states and properties
5ARIA 1.1, 7.6 State And Property Attribute ProcessingfalseARIA state or property is permitted
64.1.1 Parsing (Level A)trueAttribute is not duplicated, Id attribute value is unique
7H94: Ensuring That Elements Do Not Contain Duplicate AttributesfalseAttribute is not duplicated
81.2.8 Media Alternative (Prerecorded) (Level AAA)trueAudio and visuals of video element have transcript, Video element visual content has accessible alternative
9G69: Providing An Alternative For Time Based MediafalseAudio and visuals of video element have transcript, Video element visual content has accessible alternative
101.2.1 Audio-Only And Video-Only (Prerecorded) (Level A)trueAudio element content has text alternative, Video element visual-only content has accessible alternative
11G158: Providing An Alternative For Time-Based Media For Audio-Only ContentfalseAudio element content has text alternative
12Audio Element Content Has TranscriptfalseAudio element content has text alternative
13Audio Element Content Is Media Alternative For TextfalseAudio element content has text alternative
141.4.2 Audio Control (Level A)trueAudio or video element avoids automatically playing audio
15WCAG Non-InterferencefalseAudio or video element avoids automatically playing audio, Focusable element has no keyboard trap, Text content that changes automatically can be paused, stopped or hidden
16G60: Playing A Sound That Turns Off Automatically Within Three SecondsfalseAudio or video element avoids automatically playing audio, Audio or video element that plays automatically has no audio that lasts more than 3 seconds
17G170: Providing A Control Near The Beginning Of The Web Page That Turns Off Sounds That Play AutomaticallyfalseAudio or video element avoids automatically playing audio, Audio or video element that plays automatically has a control mechanism
18G171: Playing Sounds Only On User RequestfalseAudio or video element avoids automatically playing audio
19Audio Or Video Element That Plays Automatically Has A Control MechanismfalseAudio or video element avoids automatically playing audio
20Audio Or Video Element That Plays Automatically Has No Audio That Lasts More Than 3 SecondsfalseAudio or video element avoids automatically playing audio
211.3.5 Identify Input Purpose (Level AA)trueAutocomplete attribute has valid value
22SCR28: Using An Expandable And Collapsible Menu To Bypass Block Of ContentfalseBlock of repeated content is collapsible, Bypass Blocks of Repeated Content
234.1.2 Name, Role, Value (Level A)trueButton has non-empty accessible name, Element with aria-hidden has no content in sequential focus navigation, Element with presentational children has no focusable content, Element with role attribute has required states and properties, Form field has non-empty accessible name, Iframe element has non-empty accessible name, Iframe elements with identical accessible names have equivalent purpose, Image button has non-empty accessible name, Link has non-empty accessible name, Menuitem has non-empty accessible name
242.4.1 Bypass Blocks (Level A)trueBypass Blocks of Repeated Content
25G1: Adding A Link At The Top Of Each Page That Goes Directly To The Main Content AreafalseBypass Blocks of Repeated Content, Document has an instrument to move focus to non-repeated content
26G123: Adding A Link At The Beginning Of A Block Of Repeated Content To Go To The End Of The BlockfalseBypass Blocks of Repeated Content, Document has an instrument to move focus to non-repeated content
27G124: Adding Links At The Top Of The Page To Each Area Of The ContentfalseBypass Blocks of Repeated Content, Document has an instrument to move focus to non-repeated content
28H69: Providing Heading Elements At The Beginning Of Each Section Of ContentfalseBypass Blocks of Repeated Content, Document has heading for non-repeated content
29Document Has Heading For Non-Repeated ContentfalseBypass Blocks of Repeated Content
30Document Has A Landmark With Non-Repeated ContentfalseBypass Blocks of Repeated Content
31Block Of Repeated Content Is CollapsiblefalseBypass Blocks of Repeated Content
32Document Has An Instrument To Move Focus To Non-Repeated ContentfalseBypass Blocks of Repeated Content
331.3.3 Sensory Characteristics (Level A)trueContent has alternative for visual reference
34G96: Providing Textual Identification Of Items That Otherwise Rely Only On Sensory Information To Be UnderstoodfalseContent has alternative for visual reference
352.5.4 Motion Actuation (Level A)trueDevice motion based changes to the content can also be created from the user interface, Device motion based changes to the content can be disabled
362.4.7 Focus Visible (Level AA)trueElement in sequential focus order has visible focus
37Fourth Rule Of ARIA UsefalseElement with aria-hidden has no content in sequential focus navigation
383.1.2 Language Of Parts (Level AA)trueElement with lang attribute has valid language tag, HTML element language subtag matches language
39H58: Using Language Attributes To Identify Changes In The Human LanguagefalseElement with lang attribute has valid language tag, HTML element language subtag matches language
403.3.1 Error Identification (Level A)trueError message describes invalid form field value
412.1.2 No Keyboard Trap (Level A)trueFocusable element has no keyboard trap
42G21: Ensuring That Users Are Not Trapped In ContentfalseFocusable element has no keyboard trap
43Focusable Element Has No Keyboard Trap Via Standard NavigationfalseFocusable element has no keyboard trap
44Focusable Element Has No Keyboard Trap Via Non-Standard NavigationfalseFocusable element has no keyboard trap
452.4.6 Headings And Labels (Level AA)trueForm field label is descriptive, Heading is descriptive
46G131: Providing Descriptive LabelsfalseForm field label is descriptive
47H43: Using Id And Headers Attributes To Associate Data Cells With Header Cells In Data TablesfalseHeaders attribute specified on a cell refers to cells in the same table element
48H42: Using H1-H6 To Identify HeadingsfalseHeading has non-empty accessible name
491.4.5 Images Of Text (Level AA)trueHTML graphics contain no text
501.4.9 Images Of Text (No Exception) (Level AAA)trueHTML graphics contain no text
513.1.1 Language Of Page (Level A)trueHTML page has lang attribute, HTML page lang and xml:lang attributes have matching values, HTML page lang attribute has valid language tag, HTML page language subtag matches default language
52H57: Using Language Attributes On The Html ElementfalseHTML page has lang attribute, HTML page lang attribute has valid language tag, HTML page language subtag matches default language
532.4.2 Page Titled (Level A)trueHTML page has non-empty title, HTML page title is descriptive
54G88: Providing Descriptive Titles For Web PagesfalseHTML page has non-empty title, HTML page title is descriptive
55H25: Providing A Title Using The Title ElementfalseHTML page has non-empty title, HTML page title is descriptive
56H93: Ensuring That Id Attributes Are Unique On A Web PagefalseId attribute value is unique
572.1.1 Keyboard (Level A)trueIframe with negative tabindex has no interactive elements, Scrollable element is keyboard accessible
58G202: Ensuring Keyboard Control For All FunctionalityfalseIframe with negative tabindex has no interactive elements, Scrollable element is keyboard accessible
591.1.1 Non-Text Content (Level A)trueImage accessible name is descriptive, Image button has non-empty accessible name, Image has non-empty accessible name, Image not in the accessibility tree is decorative, Object element rendering non-text content has non-empty accessible name, SVG element with explicit role has non-empty accessible name
60G94: Providing Short Text Alternative For Non-Text Content That Serves The Same Purpose And Presents The Same Information As The Non-Text ContentfalseImage accessible name is descriptive, Image button has non-empty accessible name, Image has non-empty accessible name
61G95: Providing Short Text Alternatives That Provide A Brief Description Of The Non-Text ContentfalseImage accessible name is descriptive, Image button has non-empty accessible name, Image has non-empty accessible name
621.4.12 Text Spacing (Level AA)trueLetter spacing in style attributes is not !important, Line height in style attributes is not !important, Word spacing in style attributes is not !important
632.4.4 Link Purpose (In Context) (Level A)trueLink has non-empty accessible name, Link in context is descriptive, Links with identical accessible names and same context serve equivalent purpose
642.4.9 Link Purpose (Link Only) (Level AAA)trueLink has non-empty accessible name, Link in context is descriptive, Link is descriptive, Links with identical accessible names and same context serve equivalent purpose, Links with identical accessible names have equivalent purpose
65G91: Providing Link Text That Describes The Purpose Of A LinkfalseLink has non-empty accessible name
662.2.1 Timing Adjustable (Level A)trueMeta element has no refresh delay
672.2.4 Interruptions (Level AAA)trueMeta element has no refresh delay, Meta element has no refresh delay (no exception)
683.2.5 Change On Request (Level AAA)trueMeta element has no refresh delay, Meta element has no refresh delay (no exception)
69G110: Using An Instant Client-Side RedirectfalseMeta element has no refresh delay, Meta element has no refresh delay (no exception)
70H76: Using Meta Refresh To Create An Instant Client-Side RedirectfalseMeta element has no refresh delay, Meta element has no refresh delay (no exception)
711.4.4 Resize Text (Level AA)trueMeta viewport allows for zoom, Zoomed text node is not clipped with CSS overflow
722.1.4 Character Key Shortcuts (Level A)trueNo keyboard shortcut uses only printable characters
731.3.4 Orientation (Level AA)trueOrientation of the page is not restricted using CSS transform property
74ARIA4: Using A WAI-ARIA Role To Expose The Role Of A User Interface ComponentfalseRole attribute has valid value
75G108: Using Markup Features To Expose The Name And Role, Allow User-Settable Properties To Be Directly Set, And Provide Notification Of ChangesfalseRole attribute has valid value
762.1.3 Keyboard (No Exception) (Level AAA)trueScrollable element is keyboard accessible
772.2.2 Pause, Stop, Hide (Level A)trueText content that changes automatically can be paused, stopped or hidden
781.4.6 Contrast (Enhanced) (Level AAA)trueText has enhanced contrast, Text has minimum contrast
79G17: Ensuring That A Contrast Ratio Of At Least 7:1 Exists Between Text (And Images Of Text) And Background Behind The TextfalseText has enhanced contrast
80G18: Ensuring That A Contrast Ratio Of At Least 4.5:1 Exists Between Text (And Images Of Text) And Background Behind The TextfalseText has enhanced contrast
811.4.3 Contrast (Minimum) (Level AA)trueText has minimum contrast
821.2.2 Captions (Prerecorded) (Level A)trueVideo element auditory content has accessible alternative
83G87: Providing Closed CaptionsfalseVideo element auditory content has accessible alternative, Video element auditory content has captions
84G93: Providing Open (Always Visible) CaptionsfalseVideo element auditory content has accessible alternative, Video element auditory content has captions
85H95: Using The Track Element To Provide CaptionsfalseVideo element auditory content has accessible alternative, Video element auditory content has captions
86Video Element Content Is Media Alternative For TextfalseVideo element auditory content has accessible alternative, Video element visual content has accessible alternative, Video element visual content has strict accessible alternative
87Video Element Auditory Content Has CaptionsfalseVideo element auditory content has accessible alternative
881.2.3 Audio Description Or Media Alternative (Prerecorded) (Level A)trueVideo element visual content has accessible alternative
891.2.5 Audio Description (Prerecorded) (Level AA)trueVideo element visual content has accessible alternative, Video element visual content has strict accessible alternative
90G8: Providing A Movie With Extended Audio DescriptionsfalseVideo element visual content has accessible alternative, Video element visual content has audio description, Video element visual content has strict accessible alternative
91G78: Providing A Second, User-Selectable, Audio Track That Includes Audio DescriptionsfalseVideo element visual content has accessible alternative, Video element visual content has audio description, Video element visual content has strict accessible alternative
92G173: Providing A Version Of A Movie With Audio DescriptionsfalseVideo element visual content has accessible alternative, Video element visual content has audio description, Video element visual content has strict accessible alternative
93Video Element Visual Content Has Audio DescriptionfalseVideo element visual content has accessible alternative, Video element visual content has strict accessible alternative
94Audio And Visuals Of Video Element Have TranscriptfalseVideo element visual content has accessible alternative
95G159: Providing An Alternative For Time-Based Media For Video-Only ContentfalseVideo element visual-only content has accessible alternative, Video element visual-only content has transcript
96G166: Providing Audio That Describes The Important Video Content And Describing It As SuchfalseVideo element visual-only content has accessible alternative, Video element visual-only content has audio track alternative
97Video Element Visual-Only Content Is Media Alternative For TextfalseVideo element visual-only content has accessible alternative
98Video Element Visual-Only Content Has TranscriptfalseVideo element visual-only content has accessible alternative
99Video Element Visual-Only Content Has Audio Track AlternativefalseVideo element visual-only content has accessible alternative
1002.5.3 Label In Name (Level A)trueVisible label is part of accessible name
101G208: Including The Text Of The Visible Label As Part Of The Accessible NamefalseVisible label is part of accessible name
ACT rules and accessibility requirements like WCAG and best practices mapping (6th of November 2022)

To summarize – automatic testing alone is far from enough and can’t tell the real state

If you have read so far, I hope you have a bit better understanding about relevance behind automatic testing and scoring based on that. I can’t repeat this enough – automatic testing often needs manual validation. So don’t trust it totally and verify the results. It is of course very nice to be able to scan hundreds or even thousands of URLs very quickly, but the reported results are only the beginning.

Automatic results needs manual verification and therefore automatic scoring can’t really be trusted. Once again – perfect score on problematic websites is still a reality and we need human specialists and people with disabilities to really detect the real situation.

Author: Bogdan Cerovac

I am IAAP certified Web Accessibility Specialist (from 2020) and was Google certified Mobile Web Specialist.

Work as digital agency co-owner web developer and accessibility lead.

Sole entrepreneur behind IDEA-lab Cerovac (Inclusion, Diversity, Equity and Accessibility lab) after work. Check out my Accessibility Services if you want me to help your with digital accessibility.

Also head of the expert council at Institute for Digital Accessibility A11Y.si (in Slovenian).

Living and working in Norway (🇳🇴), originally from Slovenia (🇸🇮), loves exploring the globe (🌐).

Nurturing the web from 1999, this blog from 2019.

More about me and how to contact me: