<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mark Steadman</title>
    <description>The latest articles on Forem by Mark Steadman (@steady5063).</description>
    <link>https://forem.com/steady5063</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F595171%2F40dfac43-7061-423f-a887-cd1033a74aaa.jpeg</url>
      <title>Forem: Mark Steadman</title>
      <link>https://forem.com/steady5063</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/steady5063"/>
    <language>en</language>
    <item>
      <title>Accessibility Snapshot Testing in iOS</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Fri, 20 Mar 2026 13:19:28 +0000</pubDate>
      <link>https://forem.com/steady5063/accessibility-snapshot-testing-in-ios-408e</link>
      <guid>https://forem.com/steady5063/accessibility-snapshot-testing-in-ios-408e</guid>
      <description>&lt;p&gt;Snapshot testing is a popular type of regression testing that a lot of development teams are unaware has untapped potential when it comes to accessibility. The &lt;code&gt;AccessibilitySnapshot library&lt;/code&gt; offers a way to bring accessibility into your automated regression suite. By treating the accessibility hierarchy as a testable artifact, developers can catch issues early and maintain a consistent, inclusive experience for all users.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Snapshot Testing?
&lt;/h2&gt;

&lt;p&gt;Snapshot testing is a regression‑testing technique that compares the current output of a component to a previously approved “snapshot.” In traditional iOS development, this often means capturing a visual rendering of a view and ensuring it hasn’t changed unexpectedly. It’s a powerful way to detect unintended UI shifts, layout regressions, or styling inconsistencies.&lt;/p&gt;

&lt;p&gt;Accessibility snapshot testing applies the same philosophy, but focuses on semantics over pixels. The snapshot will include labels, traits, hints, element order, grouping, and the overall accessibility hierarchy. These items directly impact how assistive technology interacts with your mobile application, so treating them as part of your regression suite is a natural extension of of snapshot testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running an Accessibility Snapshot
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/cashapp/AccessibilitySnapshot/tree/main" rel="noopener noreferrer"&gt;Accessibility Snapshot Library &lt;/a&gt; from the folks at CashApp makes it straightforward to incorporate accessibility snapshots into your test suite. The library makes use of the already established 'SnapshotTesting' Framework, and allows you  to add in accessibility assertions with ease.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
    &lt;span class="c1"&gt;//Function to create hosting controller&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createHost&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;UIHostingController&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;hostingController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIHostingController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rootView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;hostingController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hostingController&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//Snapshot test for home screen&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;testHomeScreenAccessibility&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;HomeView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="nf"&gt;assertSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;matching&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;createHost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accessibilityImage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this test case we create a function to create a &lt;code&gt;UIHostingController&lt;/code&gt; and then a test case to make a snapshot of the home screen of our application. When this test case runs, we will get an accessibility snapshot that looks like the following: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuky178wqnpifr86m0h0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuky178wqnpifr86m0h0f.png" alt="Login screen with to login fields in the screen shot. on the right is the laid out a11y structure of the view, which starts with " width="800" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output allows testers to be able to see the accessibility hierarchy of their application and check for semantic structure, grouping, or proper trait issues without ever using a screen reader!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accessibility Snapshot Testing Matters
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Reliable Regression Detection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Accessibility regressions are often subtle. A renamed label, a missing trait, or a restructured view hierarchy may not be visually obvious, yet they can dramatically affect how a screen is navigated with assistive technology. Snapshot testing catches these issues early—before they reach users.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clear, Readable Output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the strengths of the &lt;code&gt;AccessibilitySnapshot library&lt;/code&gt; is the clarity of its output. Instead of trying to use the screen reader light on the accessibility inspector or manually inspecting elements, developers and testers a structured representation of the accessibility tree. This makes debugging faster and helps teams build a shared understanding of accessible UI design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Accessibility snapshot testing brings a powerful new dimension to automated testing in iOS. With tools like &lt;code&gt;Accessibility Snapshot&lt;/code&gt;, teams can validate the structure and semantics of their UI with ease. The result is a more stable, predictable, and inclusive experience for users who rely on assistive technologies.&lt;/p&gt;

&lt;p&gt;To see a full working example, please visit &lt;a href="https://github.com/Steady5063/iOS-Automated-Accessibility-Example-Lib/blob/main/a11ydemoTests/accessibilitySnapshotExample.swift" rel="noopener noreferrer"&gt;iOS-Automated-Accessibility-Library&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Accessibility Regression Testing With XCUI</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:52:12 +0000</pubDate>
      <link>https://forem.com/steady5063/accessibility-regression-testing-with-xcui-mpa</link>
      <guid>https://forem.com/steady5063/accessibility-regression-testing-with-xcui-mpa</guid>
      <description>&lt;p&gt;The question often asked in the mobile development community is, "I want to be able to add accessibility to my regression tests, but is there a way to do it?". There have been many open source projects created in the past that have allowed for it, but most of them either have stopped having support or are out of date. &lt;/p&gt;

&lt;p&gt;Since Xcode 15, &lt;code&gt;performAccessibilityAudit()&lt;/code&gt; is now a function that is readily available for use within XCUI tests! It runs the same automated checks as the "Accessibility Inspector" and allows for consistent regression of accessibility issues. So how do we make the most of it? Let's check it out!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up
&lt;/h2&gt;

&lt;p&gt;The simple answer to setting it up is, if you have an &lt;code&gt;XCTestCase&lt;/code&gt; using &lt;code&gt;XCUIApplication()&lt;/code&gt; then you can call &lt;code&gt;performAccessibilityAudit()&lt;/code&gt; on your content!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;accessibilityAuditExample&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;XCTestCase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;XCUIApplication&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

       &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;setUpWithError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="n"&gt;continueAfterFailure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
           &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;XCUIApplication&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
           &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can be triggered on any XCUIElement, which means you can scope your checks to the entire app, a specific screen, or a single component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performing the Audit
&lt;/h2&gt;

&lt;p&gt;To have the audit be performed on the current application screen, simply call 'app.peformAccessibilityAudit()'. &lt;/p&gt;

&lt;p&gt;Here is a simple example of setting up an application, and then performing an audit on the home screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//Performing Accessibility Audit on Login Screen&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;testLoginScreenAccessibilityAudit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;XCUIApplication&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabBars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Home"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;performAccessibilityAudit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test Case Setup
&lt;/h2&gt;

&lt;p&gt;With the ease of using the accessibility audit functionality, you can decide how you want to do the testing. There are multiple ways in which you can set it up: &lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility has its own test suite
&lt;/h3&gt;

&lt;p&gt;Instead of doing regression tests as part of the usual suite of tests, you would make accessibility test suite that runs through the application and ONLY tests that content. (do not recommend, however there are reasons to do so) &lt;/p&gt;

&lt;h3&gt;
  
  
  Each XCTestCase has its own accessibility test
&lt;/h3&gt;

&lt;p&gt;For each XCTestCase there is a test for accessibility (or multiple) that live with the rest of the tests. This is a great way to integrate accessibility as part of the normal regression testing process, while also calling out accessibility as its own test. &lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility test is added to each test case
&lt;/h3&gt;

&lt;p&gt;Instead of making separate tests for accessibility, simply add it in as part of another test case. For example, if you were testing the functionality of a login screen (entering text, error messaging, etc.) and then during that you would run an audit for each stage! &lt;/p&gt;

&lt;h2&gt;
  
  
  Data and Results
&lt;/h2&gt;

&lt;p&gt;When the test case has been completed, you can see the results in multiple different ways. In the test navigator, if you click on fail test case it will take you to where the issue is and showcase the issues found in line in the code with the test&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljq1g03l42rcwx3gd7g1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljq1g03l42rcwx3gd7g1.png" alt="3 test cases within xcode, one on login screen with 2 'element has no description', on on Blasters screen with 'Contrast failed' and one on the Sabers screen with 6 issues ranging from 'Dynamic type not supported' to 'Text clipped' " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other way is to go to the report navigator, and under tests you will see the issues found with their descriptions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtzbe8kchxwhfyjpvdxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtzbe8kchxwhfyjpvdxc.png" alt="Report navigator view, where each of the three test cases are show casing all of the issues for each test case" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Bringing the Accessibility Inspector functionality into your XCUI test suite gives your team  a first‑party, reliable, and maintainable way to catch accessibility regressions automatically.&lt;/p&gt;

&lt;p&gt;By integrating audits directly into your existing XCTestCases, accessibility stops being an afterthought and becomes part of the natural development and QA process. It’s simple, built‑in, and it finally gives iOS teams a dependable path to automated accessibility regression testing.&lt;/p&gt;

&lt;p&gt;To see a full working example, checkout the &lt;a href="https://github.com/Steady5063/iOS-Automated-Accessibility-Example-Lib" rel="noopener noreferrer"&gt;iOS Automated Accessibility Library&lt;/a&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>testing</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Accessibility Testing with Playwright Assertions</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Thu, 19 Feb 2026 02:03:09 +0000</pubDate>
      <link>https://forem.com/steady5063/accessibility-testing-with-playwright-assertions-3m3i</link>
      <guid>https://forem.com/steady5063/accessibility-testing-with-playwright-assertions-3m3i</guid>
      <description>&lt;p&gt;Playwright has become one of the most popular testing frameworks for web applications. During it's rise, teams using it have been looking for quick and effective ways to test for accessibility. &lt;/p&gt;

&lt;p&gt;Libraries like &lt;code&gt;playwright-axe&lt;/code&gt; or &lt;code&gt;@axe-core/playwright&lt;/code&gt; are a great starting point, but they only scratch the surface, giving very generic scans of your HTML content to give the lower 25% of accessibility issues. To truly validate the accessibility of the experience your users rely on, you need deeper, more intentional checks. That’s where Playwright’s accessibility assertions come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Playwright Axe
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Playwright-Axe&lt;/code&gt; is a popular way to add automated accessibility scanning to your test suite. It integrates the Axe engine directly into Playwright tests, allowing you to run accessibility scans as part of your end‑to‑end workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use It
&lt;/h3&gt;

&lt;p&gt;In your test setup function, (beforeEach, beforeAll) add in &lt;code&gt;injectAxe(page)&lt;/code&gt; to get axe added into the page, and then whenever you are ready to do a scan of the page in a test case simply call &lt;code&gt;checkA11y(page)&lt;/code&gt;. Here is a code sample:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="c1"&gt;//Injecting axe into the page object before every test case&lt;/span&gt;
  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beforeAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newContext&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.normalil.gov/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;injectAxe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Axe Playwright Simple Scan - No customization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;checkA11y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;What It Catches&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Axe is great at identifying very basic accessibility regression issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing or empty alt text
&lt;/li&gt;
&lt;li&gt;Color contrast failures
&lt;/li&gt;
&lt;li&gt;Incorrect or missing ARIA attributes
&lt;/li&gt;
&lt;li&gt;Structural issues like missing landmarks
&lt;/li&gt;
&lt;li&gt;Form fields without labels
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These issues are the very bare minimum of issues you can catch, and can only generically check your content for issues. This is where Playwright Assertions can help take your tests beyond a simple accessibility scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Accessibility Assertions
&lt;/h2&gt;

&lt;p&gt;Playwright includes a set of accessibility‑focused assertions that let you write specific regression tests that go beyond a generic scan of your page content. Let's take a look at the 3 assertions: &lt;/p&gt;

&lt;h3&gt;
  
  
  toHaveAccessibleDescription
&lt;/h3&gt;

&lt;p&gt;This assertion checks that your element, has a proper associated description. For example, if you had an input field that had an aria-describedby tied to it with more instructions to help users understand the input, using this assertion can be used to ensure ARIA is being associated properly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playwright assertion - toHaveAccessibleDescription()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://accessibility.deque.com/contact-us-ga&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[name="firstname"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[type="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailField&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAccessibleDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please complete this required field. (First Name). Press Tab to go to the input field to fix this error.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More Reading on Accessible Description: &lt;a href="https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-description" rel="noopener noreferrer"&gt;https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-description&lt;/a&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  toHaveAccessibleErrorMessage
&lt;/h3&gt;

&lt;p&gt;This assertion checks that an error message is associated with an input field when an error is present. One key thing to note, this ONLY works with aria-errormessage. If you associated your error messages via aria-describedby then you'd want to use the previous assertion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playwright assertion - toHaveAccessibleErrorMessage()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://accessibility.deque.com/contact-us-ga&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[name="firstname"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[type="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailField&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAccessibleErrorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please complete this required field.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More Reading on Accessible Error Message: &lt;a href="https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-error-message" rel="noopener noreferrer"&gt;https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-error-message&lt;/a&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  toHaveAccessibleName
&lt;/h3&gt;

&lt;p&gt;This assertion ensures that the object in question has the correct accessible name. This check can be very effective for complex tables with buttons, list of icon buttons, and ensuring that any action item has no misspelled words in the label!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playwright assertion - toHaveAccessibleName()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.normalil.gov/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rightSlideIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.alwaysDisplayArrowNew.next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leftSlideIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.alwaysDisplayArrowNew.prev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;leftSlideIcon&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAccessibleName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Previous Slide&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rightSlideIcon&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAccessibleName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Next Slide&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More Reading on Accessible Name: &lt;a href="https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-name" rel="noopener noreferrer"&gt;https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-name&lt;/a&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Axe and other accessibility libraries are powerful, but it’s only the beginning. Automated scanners catch general accessibility issues but using Playwright’s accessibility assertions fill a larger gap in regression testing by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing the computed accessibility tree
&lt;/li&gt;
&lt;li&gt;Ensuring accessible names, descriptions, and error messages are correct
&lt;/li&gt;
&lt;li&gt;Preventing regressions as your product evolves
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your goal is to build interfaces that are truly accessible, not just “passing a scan,” assertions are the next step!&lt;/p&gt;

&lt;p&gt;If you'd like to see a working example checkout the &lt;a href="https://github.com/Steady5063/Automated-Accessibility-Example-Lib/tree/main/Integration/Playwright" rel="noopener noreferrer"&gt;Automated Accessibility Example Library&lt;/a&gt; which houses a playwright example that show cases all the items talked about in this article. &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>iOS Accessibility Inspector: Beyond Automation</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Fri, 20 Jun 2025 12:13:01 +0000</pubDate>
      <link>https://forem.com/steady5063/ios-accessibility-inspector-beyond-automation-2cl2</link>
      <guid>https://forem.com/steady5063/ios-accessibility-inspector-beyond-automation-2cl2</guid>
      <description>&lt;p&gt;Xcodes accessibility inspector has long been thought of as only an 'automated' issue tool. This thought has led to its full potential never being fully met by developers and testers. So if it's more than just automated issues, then what should users be doing with it to catch more accessibility bugs? Let's dive right in. &lt;/p&gt;

&lt;h2&gt;
  
  
  Simple Testing List
&lt;/h2&gt;

&lt;p&gt;Keeping it simple, there are 3 main categories of tests you can do to ensure you are getting the most out of the accessibility inspector: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action Name/Role&lt;/li&gt;
&lt;li&gt;App Navigation (Screen reader light)&lt;/li&gt;
&lt;li&gt;Dynamic Type (Font size increase)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup Before We Begin
&lt;/h2&gt;

&lt;p&gt;To access the XCode accessibility inspector, you must have Xcode open and then go to &lt;code&gt;Xcode &amp;gt; Developer tools &amp;gt; Accessibility Inspector&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Once open, it may default you to the "Audit" function of the application. You need to navigate to the "Inspection" tab and ensure your screen looks like the one shown below in the image. If it does, you are ready to test!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfu33waxqfcd2bjns66k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfu33waxqfcd2bjns66k.png" alt="Default view of 'Inspection' tab of accessibility inspector that includes Navigation, basic, and actions" width="800" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Action Name/Role
&lt;/h2&gt;

&lt;p&gt;Automated checks can only tell if an action has a label or has a trait, but what it cannot do is tell you if the label or the trait actually describes the purpose of the action!&lt;/p&gt;

&lt;h3&gt;
  
  
  Action Test 1: Proper Label
&lt;/h3&gt;

&lt;p&gt;Once the action item is selected (highlighted) in the inspector,  ensure the label properly describes the action item. For example, if the button is a "Search" icon, the label should be "Search" NOT "IC Search, icon". &lt;/p&gt;

&lt;p&gt;The label also MUST NOT include the trait in the label. Using the search example above, we would not want it to read as "Search, button". As it would actually read, "Search button, button". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft23ennxned3myxw9s1ii.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft23ennxned3myxw9s1ii.webp" alt="Ic search icon image example" width="520" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Action Test 2: Proper Trait
&lt;/h3&gt;

&lt;p&gt;Once the action item is selected (highlighted) in the inspector, ensure the trait for the action properly correlates to the expected action. &lt;/p&gt;

&lt;p&gt;One prime example, buttons vs links. A button should keep you within the application while a link should take you to a WebView or out of the application. &lt;/p&gt;

&lt;h3&gt;
  
  
  Action Test 3: Over-riding Label
&lt;/h3&gt;

&lt;p&gt;The final test, check that the label that is set does not override the visible text. Overriding visible text can make it confusing mainly for voice control users. Who can use "show text" to be able to tap a button. &lt;/p&gt;

&lt;p&gt;For example, if the login button on your app visibly says login but the &lt;code&gt;accessibilityLabel&lt;/code&gt; for it says "login to your application" it may not function with voice control. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpnwhjzsoovaxk5htilo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpnwhjzsoovaxk5htilo.png" alt="Example of login button being overridden with improper label of 'Login to your application'" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  App Navigation (Screen reader light)
&lt;/h2&gt;

&lt;p&gt;Accessibility inspector comes with a screen reader built in (similar to that of Voice Over) that allows you to hear and navigate the application as a screen reader user would! The advantage of this, is not all iOS developers have access to physical phones to test with VoiceOver! &lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation Test 1: Accessibility focus order
&lt;/h3&gt;

&lt;p&gt;Pressing the "Play" button on the Navigation group, let the navigator go through one by one of each item in the application and highlight each item. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4u3xuduvjeqqvo6m8ju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4u3xuduvjeqqvo6m8ju.png" alt="Navigation bar example, that shows left/right and play buttons that are in the accessibility inspector" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As long as the accessibility focus order goes from left to right in a concise and simple order that matches that of the visual order, then you are good! If it jumps and skips around the view while using it, then you have focus order issues. &lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation Test 2: Proper grouping
&lt;/h3&gt;

&lt;p&gt;Using the Navigation section, use the arrows right and left to navigate each item one by one in the view. While doing this, look for groups of content that could easily be put together. &lt;/p&gt;

&lt;p&gt;The example image below shows a card component that can have the name, image, and description grouped as one, and then the "Add to Cart" button as the next accessibility focus stop. However, in this case they are all individual accessibility focus stops.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka6lw18v56vfga62kip5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka6lw18v56vfga62kip5.png" alt="Accessibility grouping example, that shows  a card component that can have the name, image, and description being all separate focus stops" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Type (Font size increase)
&lt;/h2&gt;

&lt;p&gt;The final test is for dynamic type! Which is a very simple test to ensure that your application properly is using dynamic type in your mobile application and the text resizes! &lt;/p&gt;

&lt;p&gt;Different than the other tests, you will have to navigation in the top right to the "Settings" (the third button to the right). Once there, you will notice a number of different accessibility settings. Go to the bottom and select "Dynamic type". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8clxfd19k0ucxv223i8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8clxfd19k0ucxv223i8g.png" alt="Using the dynamic type resize function to test an application to ensure the text doesn't break accessibility rules " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you do that, simply move the slider up and ensure that the text does not do the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overlap over other text&lt;/li&gt;
&lt;li&gt;Addition of trailing ... &lt;/li&gt;
&lt;li&gt;Overflow its container and get cutoff &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Accessibility inspector is much more than just automation. Using these simple tests in daily development and QA, can help ensure that your application goes beyond the basics of automation and does more to ensure its accessibility! &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>mobile</category>
      <category>testing</category>
    </item>
    <item>
      <title>Debunking the Myths of the iOS Accessibility Inspector</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Tue, 08 Apr 2025 11:53:55 +0000</pubDate>
      <link>https://forem.com/steady5063/debunking-the-myths-of-the-ios-accessibility-inspector-4597</link>
      <guid>https://forem.com/steady5063/debunking-the-myths-of-the-ios-accessibility-inspector-4597</guid>
      <description>&lt;p&gt;One of the most commonly overlooked tools in iOS development is the XCode accessibility inspector. The inspector is a free tool that comes with XCode that you can use to help test your application for accessibility issues. Over the years however, the tool has gotten a bad reputation for being unreliable and only being an "automated" checker. &lt;/p&gt;

&lt;p&gt;While some of the functional issues with tool are completely valid, the tool itself is so much more than just automated audits. Lets dive into some of the big myths about the iOS accessibility inspector and debunk them!&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth 1: "Only Automation"
&lt;/h2&gt;

&lt;p&gt;While it is true that the inspector has an audit function that runs automated tests, the myth that it ONLY does this is false. There are two big features that developers miss in the tool, the ability to manually inspect each element and screen reader navigation!&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual Inspection
&lt;/h3&gt;

&lt;p&gt;You can access each individual element on the screen by using the "Inspection" tab. Once you target your application you want to test using the target button, you can use the arrows under "navigation" to go through each item in the screen one by one. &lt;/p&gt;

&lt;p&gt;For each element that is highlighted, the following information will show: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Label&lt;/li&gt;
&lt;li&gt;Value&lt;/li&gt;
&lt;li&gt;Traits&lt;/li&gt;
&lt;li&gt;Identifier&lt;/li&gt;
&lt;li&gt;Hint&lt;/li&gt;
&lt;li&gt;User Input Labels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can now see the accessibility tree information for that element! Not only that, you can also do simple manual checks to go beyond automation. &lt;/p&gt;

&lt;p&gt;For example, in the image below, currently focused is a search icon in an application, and that icon button has a label of "ic search" with a trait of 'button'. Automated checks would say this is fine since it has a label, however the label itself is not sufficient as it does not properly describe its purpose and contains partial image name. This is the true power of the manual inspector! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4w4akyqqgb9nua5q7mj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4w4akyqqgb9nua5q7mj.png" alt="The accessibility tree inspector" width="520" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screen Reader Navigation
&lt;/h3&gt;

&lt;p&gt;One of the more unique features of the "Inspection" portion of this tool is the ability for it to read out the content of the view. Using the "navigation" section, you can simply hit the 'play' button and it will read out all the content within the view with a screen reader. &lt;/p&gt;

&lt;p&gt;You may be thinking to yourself, "Well what is the benefit here if I can just fire up voiceover and do the same?". If a developer is using this tool and doesn't have access to a physical device and only an emulator, then this can be a subtle substitute for screen reader testing! It also shows all the information for each element just like above, so developers can learn why something may not be announcing properly. &lt;/p&gt;

&lt;h2&gt;
  
  
  Myth 2: Automated Checks Lack
&lt;/h2&gt;

&lt;p&gt;A true statement when it comes to automated accessibility, is that it will NOT get you to 100% of all issues. However, that doesn't mean that automation can't get you started down a path to make your content accessible. &lt;/p&gt;

&lt;p&gt;The accessibility inspector has been thought to have "only having 3 checks" for accessibility, touch target sizes, dynamic type and contrast. The truth is, there are 7 automated issues it checks for: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Element Description&lt;/li&gt;
&lt;li&gt;Contrast&lt;/li&gt;
&lt;li&gt;Hit Region&lt;/li&gt;
&lt;li&gt;Element Detection&lt;/li&gt;
&lt;li&gt;Clipped Text&lt;/li&gt;
&lt;li&gt;Traits&lt;/li&gt;
&lt;li&gt;Dynamic Type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most development teams don't know where to start when it comes to making their applications accessible. These simple checks can help them get started down that path and can begin to ensure accessible practices while developing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulmhbu77l0qbu4by5k0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulmhbu77l0qbu4by5k0h.png" alt="Automated audit result example that includes touch target size issues, dynamic type and element missing description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth 3: No Reporting
&lt;/h2&gt;

&lt;p&gt;One of the bigger reasons teams choose not to use the accessibility inspector is "it doesn't have the ability to export a report". That is true no longer! The accessibility inspector does have the ability to export the automated checks to a report! &lt;/p&gt;

&lt;p&gt;Within the inspector, if you go "File &amp;gt; Save audit report as.." you will be able to save an HTML file version of the report with screen shots and all!&lt;/p&gt;

&lt;p&gt;This can help development teams with: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definition of done&lt;/li&gt;
&lt;li&gt;Automated monitoring of applications&lt;/li&gt;
&lt;li&gt;Reporting of bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3m1uurxcc9aslaq6muv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3m1uurxcc9aslaq6muv.png" alt="Example report showcasing the screen shots at the top, and the issues at the bottom" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth 4: Only Works with Simulator
&lt;/h2&gt;

&lt;p&gt;Accessibility inspector does not only work with the simulator! Yes, you read this correctly. You do not need direct access to the code or the simulator to run the accessibility inspector against your application!&lt;/p&gt;

&lt;p&gt;You can plug-in your iPhone, pick an application and start inspecting it using the "Inspection" tab or run an automated audit it right away! &lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Accessibility Inspector gets a bad reputation for only being single use case tool. The fact is, it has so many more features to help development teams make their applications accessible. Using this tool daily in development can help build a culture that makes accessible applications from the start!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>mobile</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Mobile Accessibility Advent Calendar Part 3</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Mon, 27 Jan 2025 13:31:20 +0000</pubDate>
      <link>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-3-5g1g</link>
      <guid>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-3-5g1g</guid>
      <description>&lt;p&gt;Welcome to part three of the Mobile Accessibility Advent Calendar! In this post we will cover days 17 through 24!&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 17 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Let's talk assistive technology on Android!  &lt;/p&gt;

&lt;p&gt;In the previous post, we talked about getting into the mindset of only testing with screen readers, in this case TalkBack The truth is there is a load of different assistive technologies that users use that you should be testing with to ensure you content is accessible. &lt;br&gt;
 &lt;br&gt;
What you should be testing with:   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TalkBack- The standard default screen reader with Android, that should be at the core of the testing you are doing.
 &lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=rAIXE6ilRQ0" rel="noopener noreferrer"&gt;Switch Access&lt;/a&gt; - Allows users to use an adaptive accessory to interact with their phone in customizable ways that make it easier to use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://support.vitalsource.com/hc/en-us/articles/360017723293-Android-Talkback-Keyboard-Commands" rel="noopener noreferrer"&gt;Keyboard&lt;/a&gt; - Android tends to have more keyboard users. Android actually allows for developers to make their applications accessible with keyboard by having specific attributes in the code, which in turns makes it a bit more keyboard friendly. Keyboard is CORE to what is needed to ensure your application is accessible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 18 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Lets talk about tables!&lt;br&gt;
 &lt;br&gt;
One misconception in mobile applications developed in SwiftUI (iOS) and Android (View/Jetpack) is that tables announce the EXACT same way as they do in web. Announcing the column and the row numbers and each respective cells data that you are on.&lt;br&gt;
 &lt;br&gt;
In mobile, there is NOT a semantic table like this. There are tables that layout content, and even a table in iOS that is used for desktop applications, but they do not function like this. In order to properly create a table and get the associations, you have to customize the table you have created and add in the proper announcements. The label must include the row (if necessary) and column header text, along with the data text.   &lt;/p&gt;

&lt;p&gt;Using this delivery table as an example: &lt;a href="https://www.w3.org/WAI/tutorials/tables/two-headers/" rel="noopener noreferrer"&gt;https://www.w3.org/WAI/tutorials/tables/two-headers/&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In mobile we would want the label for the first cell to announce as "9:00 - 11:00, Monday, Closed". You can add in the word Row, or Column, but for the most part a lot of users have advocated not to have that information in mobile applications.&lt;br&gt;
 &lt;br&gt;
Please ensure you take the time to make your data tables accessible for all! It can make a huge difference in making your application easier to consume for everyone!&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 19 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cyqhmd36qguwm14kauj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cyqhmd36qguwm14kauj.png" alt="iOS inspector logo" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
iOS Accessibility inspector that comes with Xcode has a bad rep. Does it have some bugs and quirks, absolutely. However, most of the accessibility community thinks it is only automated issues that it finds, and those are about 3 issues. The truth is, it is a robust tool that lets you inspect the application for both automated AND manual issues. Here are some super dope facts about XCode accessibility inspector:&lt;br&gt;
 &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can connect your phone and inspect ANY application for accessibility issues. No access needed to the code.&lt;/li&gt;
&lt;li&gt;It has a step through ability to see all the information in the accessibility tree (Traits, Labels, Hints)&lt;/li&gt;
&lt;li&gt;Navigation inspector can show how a user with VoiceOver would navigate the application.&lt;/li&gt;
&lt;li&gt;Run Audits that check for 7 automated issues:

&lt;ul&gt;
&lt;li&gt;Element description&lt;/li&gt;
&lt;li&gt;Hit Region&lt;/li&gt;
&lt;li&gt;Contract&lt;/li&gt;
&lt;li&gt;Element Detection&lt;/li&gt;
&lt;li&gt;Clipped Text&lt;/li&gt;
&lt;li&gt;Traits&lt;/li&gt;
&lt;li&gt;Dynamic Type
  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Day 20 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Orientation matters!  &lt;/p&gt;

&lt;p&gt;A lot of mobile accessibility applications currently only work in portrait. When they need to work in both portrait and landscape. Landscape allows ALL types of users to be able to interact with your application how they want. Some users use mounts for their device, others like a large screen, some use keyboards and its easier for them to navigate and see with keyboard.&lt;br&gt;
 &lt;br&gt;
However, if you do not develop/design with both modes in mind, this can be a very heavy lift to fix up and ensure that it is accessible. Not only must it not just orient, it must also:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not cut off any text or overlap content&lt;/li&gt;
&lt;li&gt;Must still have proper navigation order&lt;/li&gt;
&lt;li&gt;All actions must still function&lt;/li&gt;
&lt;li&gt;Must work with screen reader
 
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 21 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febujf7ogcw4xmnmki5bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febujf7ogcw4xmnmki5bg.png" alt="Example touch target size for android with and without padding" width="800" height="448"&gt;&lt;/a&gt;&lt;br&gt;
(Photo credit droids on roids)&lt;br&gt;
 &lt;br&gt;
Have you ever used an application and tried to tap a button on the screen and you just cannot seem to be able to get it to work? Maybe it's the smudge on your screen, or maybe, its that the application you are using does not have proper touch target sizes!&lt;br&gt;
 &lt;br&gt;
iOS and Android each respectively have their own touch target sizes that each item that has an action must meet in order for it to work for ALL users.&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;iOS Dimensions:&lt;/strong&gt; 44 X 44pt&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Android Dimensions:&lt;/strong&gt; 48 X 48dp&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 22 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
The ability for any and all users to be able to resize the text on their phone is one of the best features of mobile devices. Allowing for users to adjust their text size can help a variety of different users be able to interact with your applications in ways they may not have been able to in the past.  Unfortunately, there are still MANY applications that do not resize AT ALL, causing frustration that may make them leave your application all together. How can we ensure our applications scale?&lt;br&gt;
 &lt;br&gt;
Designers:&lt;br&gt;
 &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure you include specs that show multiple levels of resizing content.&lt;/li&gt;
&lt;li&gt;Ensure no text content is cut off using a trailing …&lt;/li&gt;
&lt;li&gt;Minimum font sizes for body text, 17 pt for iOS, 16sp for Android
 
Developers&lt;/li&gt;
&lt;li&gt;In iOS ensure your application uses Dynamic type&lt;/li&gt;
&lt;li&gt;In Android use Scalable Pixels (SP) instead of DP
 
Is this everything? No, but it does help to start getting your application down the right path of properly resizing!  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Day 24 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Today I want to take an opportunity to shout out some of my favorite mobile accessibility presentations I have seen! These are all free to view and are great resources to use at your organization!  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=cgm8qQpoDt0&amp;amp;t=952s" rel="noopener noreferrer"&gt;Building Accessibility Android Apps w/ Jetpack Compose&lt;/a&gt; by Devanshu Chandra&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AQH0zG7zcgQ" rel="noopener noreferrer"&gt;Intro to Mobile App Accessibility&lt;/a&gt; by Rachael Yomtoob&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=X8aioKWLNJM" rel="noopener noreferrer"&gt;Native Mobile Accessibility Testing&lt;/a&gt; by Jan Jaap de Groot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1wO7F69e2-8" rel="noopener noreferrer"&gt;Mobile Accessibility Tools&lt;/a&gt; by Shafik Quoraishee&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 25 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
We have made it to the end!! My final post will not be a new tip or trick, it will be an ask and a call to action.&lt;br&gt;
 &lt;br&gt;
Mobile accessibility has long since been an afterthought for a lot of people in the world. However, with the world turning more and more to using mobile applications, it is time for organizations and creators of mobile applications to make their content accessible.   At the end of the day, it doesn't take that much to make your application accessible. I have a challenge:&lt;/p&gt;

&lt;p&gt;Designers:   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use free annotations kits to properly annotate accessibility&lt;/li&gt;
&lt;li&gt;Ensure color alone is not used to indicate state or contain valuable information&lt;/li&gt;
&lt;li&gt;Ensure the application works in both orientations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use testing tools (iOS a11y inspector, Android google scanner)&lt;/li&gt;
&lt;li&gt;Take advantage of the linters for iOS and Android&lt;/li&gt;
&lt;li&gt;Learn to use a screen reader (Talkback and Voiceover) and test your application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scrum masters/Product owners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prioritize accessibility in definition of done&lt;/li&gt;
&lt;li&gt;Include accessibility bugs in sprint planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not everything or every role, but even doing these simple things above can help turn the tide to ensure we start building applications with accessibility in mind. &lt;br&gt;
   &lt;br&gt;
Thank you for following #MobileA11yAdventCalendar all month for tips and tricks on #Mobile #Accessibility ! Lets make the mobile world a more accessible place for all!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>android</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Mobile Accessibility Advent Calendar Part 2</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Mon, 13 Jan 2025 14:57:50 +0000</pubDate>
      <link>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-2-39c1</link>
      <guid>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-2-39c1</guid>
      <description>&lt;p&gt; &lt;br&gt;
Welcome to part two of the Mobile Accessibility Advent Calendar! In this post we will cover days 9 through 16! &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 9 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Continuing from where we started from our Day 8 post, common terminology in iOS. These are web terms translated into mobile accessibility terms. Web is on the left, and mobile equivalent on the right.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aria-label&lt;/strong&gt; = .accessibilityLabel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role/State&lt;/strong&gt; = Traits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heading&lt;/strong&gt; = .isHeader &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page Title&lt;/strong&gt; = .navigationTitle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aria-hidden&lt;/strong&gt; = .accessibilityHidden&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aria-live&lt;/strong&gt; = accessibilityNotification.Announcement
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using just these simple common terms can help you make a connection that lasts with iOS developers and designers! In our next posts we will cover iOS and Android respectively.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 10 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Continuing from where we started from our Day 8 post, this is common terminology in Android. These are web terms translated into their similar mobile accessibility terms. Web is on the left, and mobile equivalent on the right.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aria-label&lt;/strong&gt; = contentDescription&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role/State&lt;/strong&gt; = Role/RoleDescription&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heading&lt;/strong&gt; = semantics isHeading()&lt;/li&gt;
&lt;li&gt;Page Title = TopAppBar title&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aria-hidden&lt;/strong&gt; = isImportantForAccessibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aria-live&lt;/strong&gt; = LiveRegionMode Polite/Assertive
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using just these simple common terms can help you make a connection that lasts with iOS developers and designers! Are there any others that you can think of??&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 11 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlqitcf15bvc8ou4zy8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlqitcf15bvc8ou4zy8c.png" alt="Ebay Include Logo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designers can help ensure mobile applications are accessible, however, most designers don't know where to start in order to properly annotate for accessibility. There are two FREE Figma plugins that exist that your design teams can use to begin bringing accessibility into the design process.   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Include from eBay&lt;/strong&gt;: &lt;a href="https://www.figma.com/community/plugin/1208180794570801545/includeaccessibility-annotations" rel="noopener noreferrer"&gt;https://www.figma.com/community/plugin/1208180794570801545/includeaccessibility-annotations&lt;/a&gt;
 &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVS A11y iOS Annotations&lt;/strong&gt;: &lt;a href="https://www.figma.com/community/file/1331647574396908226/accessibility-annotation-kit-for-ios" rel="noopener noreferrer"&gt;https://www.figma.com/community/file/1331647574396908226/accessibility-annotation-kit-for-ios&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 12 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Resource time!  There are 3 main resources that I tend to go back to over and over again when it comes to mobile accessibility. These are key resources that can help you with implementation guidance for fixing issues, what to avoid, and more education deep dives on multiple different types of mobile concepts and application types.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cvs-health/ios-swiftui-accessibility-techniques" rel="noopener noreferrer"&gt;The iOS Accessibility Technique library&lt;/a&gt; created by Paul Adams&lt;br&gt;
 &lt;br&gt;
&lt;a href="https://github.com/cvs-health/android-compose-accessibility-techniques" rel="noopener noreferrer"&gt;The Jetpack Compose Accessibility Technique library&lt;/a&gt; created by Robert Allen Henley &lt;/p&gt;

&lt;p&gt;&lt;a href="//Appt.org"&gt;Appt.org&lt;/a&gt; by Stitching Appt&lt;br&gt;
 &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 13 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
One of the top issues seen in mobile applications, is the improper grouping of content. What do I mean by improper grouping? In Android and iOS applications you can create content and have the whole item be tappable, like the iOS settings menu. You can also create components such as cards that can have multiple different pieces of information in them, like in commercial applications where you have an image of the item, description of item, and the price.&lt;br&gt;
 &lt;br&gt;
By default, when creating components such as these each individual item is accessible one by one for screen reader users. This causes a very frustrating experience when navigating complex applications. So what's the solution? Group similar content together to make each accessibility focus point clear and concise for the user.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For good and bad examples of grouping see my article here:  &lt;a href="https://dev.to/steady5063/top-5-ios-mobile-app-accessibility-issues-pt-1-51g8"&gt;https://dev.to/steady5063/top-5-ios-mobile-app-accessibility-issues-pt-1-51g8&lt;/a&gt;
 &lt;/li&gt;
&lt;li&gt;&lt;p&gt;More information on how to group content in iOS:  &lt;a href="https://www.hackingwithswift.com/books/ios-swiftui/hiding-and-grouping-accessibility-data%E2%80%A8%C2%A0" rel="noopener noreferrer"&gt;https://www.hackingwithswift.com/books/ios-swiftui/hiding-and-grouping-accessibility-data  &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More information on how to group content in Android: &lt;a href="https://appt.org/en/docs/jetpack-compose/samples/accessibility-group%E2%80%A8" rel="noopener noreferrer"&gt;https://appt.org/en/docs/jetpack-compose/samples/accessibility-group &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 14 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fadasitecompliance.com%2Fwp-content%2Fuploads%2F2020%2F06%2Fdisability-rights-law-scaled-1-e1591978910578.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fadasitecompliance.com%2Fwp-content%2Fuploads%2F2020%2F06%2Fdisability-rights-law-scaled-1-e1591978910578.jpg" alt="" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Question I am often asked is, "it seems like mobile accessibility is the right thing to do, but is there anything that is actually enforcing that my application be accessible?" or "All I see is things that say 'web' accessibility but nothing for mobile, so we are off the hook right?". &lt;/p&gt;

&lt;p&gt;In the past year or so, it is no longer web that is being called out, it is mobile applications as well! So when anyone asks does the application need to be accessible, emphatically say YES! Besides from the question of WCAG (which we will get to in another post), there are things in law that now point to the need to have your mobile applications be accessible. &lt;br&gt;
  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oklahoma State Mobile Apps&lt;/strong&gt;: &lt;a href="https://adasitecompliance.com/oklahoma-agency-doj-settled-inaccessible-mobile-app/" rel="noopener noreferrer"&gt;https://adasitecompliance.com/oklahoma-agency-doj-settled-inaccessible-mobile-app/&lt;/a&gt;
 &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOJ Accessibility Guidance&lt;/strong&gt;: &lt;a href="https://www.ada.gov/resources/2024-03-08-web-rule/#the-reasons-the-department-set-specific-requirements-for-web-and-mobile-app-accessibility%E2%80%A8%E2%80%A8%C2%A0" rel="noopener noreferrer"&gt;https://www.ada.gov/resources/2024-03-08-web-rule/#the-reasons-the-department-set-specific-requirements-for-web-and-mobile-app-accessibility   &lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 15 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;The daily conversation I have with folks in the mobile space is one of two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Where are the standards for mobile accessibility!?!?!"  &lt;/li&gt;
&lt;li&gt;"Does WCAG actually apply to mobile??"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; &lt;br&gt;
The answer in short, WCAG does apply to mobile applications. Yes, before anyone gets up in arms and says the word "web" is literally in the title that doesn't make sense, it will. The principals that WCAG is built on are easily transferable to mobile applications. &lt;/p&gt;

&lt;p&gt;Does every little thing within WCAG apply? Not necessarily. Are there resources and guidance in WCAG that are web based and can make it difficult to translate it into what is needed for mobile? Sure!  However if you are looking for a starting set of resources to help guide you in the right direction for guidelines there are a couple really good ones!  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BBC Mobile Standards:&lt;/strong&gt;
&lt;a href="https://www.bbc.co.uk/accessibility/forproducts/guides/mobile/summary/" rel="noopener noreferrer"&gt;https://www.bbc.co.uk/accessibility/forproducts/guides/mobile/summary/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;W3C (OLD) Accessibility Mapping&lt;/strong&gt;: &lt;a href="https://www.w3.org/TR/mobile-accessibility-mapping/" rel="noopener noreferrer"&gt;https://www.w3.org/TR/mobile-accessibility-mapping/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also some mobile specific standards (built on principal of WCAG but their own guidelines):&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Evinced Mobile Standards (MCAG)&lt;/strong&gt;: &lt;a href="https://getevinced.github.io/mcag/" rel="noopener noreferrer"&gt;https://getevinced.github.io/mcag/&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
Also, there is an awesome working group that is currently building a set of standalone mobile accessibility standards.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 16 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Let's talk assistive technology!  &lt;/p&gt;

&lt;p&gt;One mindset we tend to get into in mobile application accessibility is testing only with screen readers. In theory screen reader testing SHOULD catch most of the issues in your application, however to get a full picture of the accessibility of your app you need to test with multiple assistive technologies.  The truth is there is a load of different assistive technologies that users use that you should be testing with to ensure you content is accessible. For this post, we will cover iOS!&lt;br&gt;
 &lt;br&gt;
What you should be testing with:   &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Voiceover - The standard default screen reader with iOS, that should be at the core of the testing you are doing.
 &lt;/li&gt;
&lt;li&gt;Switch Control - Allows users to use an adaptive accessory to interact with their phone by highlighting each item sequentially.
&lt;a href="https://www.youtube.com/watch?v=HBo2BZ-Zzwg" rel="noopener noreferrer"&gt;More on Switch Control&lt;/a&gt;
 &lt;/li&gt;
&lt;li&gt;Voice Control - Allows users to use voice to control iOS device. One of the common testing methodologies I suggest with this is saying "show numbers" and ensuring all the actionable items on the screen are accounted for AND function.
&lt;a href="https://moba11y.com/blog/accessibility-testing-guide/voice-control-testing/" rel="noopener noreferrer"&gt;More on Voice Control&lt;/a&gt;
 &lt;/li&gt;
&lt;li&gt;Keyboard - Yes, you read this correctly. No it isn't an assistive technology per say, however keyboard users exist in iOS. To say that they don't would be a mistake, testing your application with keyboard and Voice Over on (and off) will ensure that multiple inputs can work with it.
  &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>android</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Mobile Accessibility Advent Calendar Part 1</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Fri, 03 Jan 2025 15:47:09 +0000</pubDate>
      <link>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-1-1iac</link>
      <guid>https://forem.com/steady5063/mobile-accessibility-advent-calendar-part-1-1iac</guid>
      <description>&lt;p&gt;In the month of December, I created a mobile accessibility advent calendar across social platforms (LinkedIN, BlueSky). Each day I posted something about mobile accessibility to strengthen the knowledge of the a11y community, mobile developers and designers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
If you ever are talking to an iOS dev or designer and say "this icon is missing a role of button" and they give you a perplexed look, it's because in iOS these are called "traits". When communicating with iOS devs, one of the biggest disconnects in Accessibility is talking the same talk. If you say "this needs a trait of .isButton", it will stick!  &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Did you know, that Android comes with its own accessibility testing framework by default? The Accessibility Test Framework (ATF) is googles out of the box testing library that runs at multiple levels, including linting and UI automated testing. &lt;br&gt;
  &lt;a href="https://developer.android.com/guide/topics/ui/accessibility/testing#analysis%E2%80%A8" rel="noopener noreferrer"&gt;https://developer.android.com/guide/topics/ui/accessibility/testing#analysis &lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
If you are developing your application in SwiftUI, you are probably using SwiftLint to check your code for issues as you develop. Did you know that you can activate two accessibility rules within library? Its super simple to turn on and can help your team check for accessibility issues as you code! Here are the two rules:&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Accessibility Trait for Button&lt;/strong&gt; - All views with tap gestures added should include the .isButton or the .isLink accessibility traits&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Accessibility Label for Image&lt;/strong&gt; - Images that provide context should have an accessibility label or should be explicitly hidden from accessibility&lt;br&gt;
 &lt;br&gt;
Documentation (Search accessibility): &lt;a href="https://realm.github.io/SwiftLint/Guides.html" rel="noopener noreferrer"&gt;https://realm.github.io/SwiftLint/Guides.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
One of the most common issues in mobile applications is the lack of proper headings. Headings are needed in mobile applications to make it easy for users to navigate between large chunks of content. Without them, mobile applications can become cumbersome for users to navigate with Voiceover and Talkback.&lt;br&gt;
 &lt;br&gt;
The dope part, they are available in both platforms and yes users do use them to navigate your application! Simply give the heading text the proper trait of .isHeading in iOS and accessibilityHeading=true in Android.&lt;br&gt;
 &lt;br&gt;
For more information on headings for iOS and Android visit:  &lt;a href="https://www.magentaa11y.com/checklist-native/headings/" rel="noopener noreferrer"&gt;https://www.magentaa11y.com/checklist-native/headings/&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
In the previous post we discussed headings and how they can make applications easier to navigate for users who use Talkback in Android and Voiceover in iOS. The typical navigation of users in both platforms is to swipe right with their finger to navigate down the view and swipe left with their finger to navigate backwards. Each time a user swipes, each item in the view gains accessibility focus. This of course can be cumbersome without a way to jump around large chunks of content.&lt;br&gt;
 &lt;br&gt;
This is where the Rotor in iOS and Reading Controls in Android come in handy. Both are features that allow for users to quickly access features of an application such as headings. When a user selects "headings" to navigate, they then can swipe with their finger up or down to navigate heading to heading!  There other forms of actions and navigation that can be done using both, for more information click on one of the links below!&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS Rotor:&lt;/strong&gt;  &lt;a href="https://dequeuniversity.com/screenreaders/voiceover-ios-shortcuts" rel="noopener noreferrer"&gt;https://dequeuniversity.com/screenreaders/voiceover-ios-shortcuts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading Controls Android: &lt;/strong&gt; &lt;a href="https://dequeuniversity.com/screenreaders/talkback-shortcuts" rel="noopener noreferrer"&gt;https://dequeuniversity.com/screenreaders/talkback-shortcuts&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 6 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Be careful when using hints! &lt;/p&gt;

&lt;p&gt;Hints can be used for extra information on content in mobile applications, however, hints should not contain ANY vital information for a user.   &lt;/p&gt;

&lt;p&gt;Users of TalkBack and Voiceover have the option to turn off hints. There are a large amount of users who have this turned off, as hints are misused and may give more information than needed in mobile applications. The one misconception in mobile is that hints behave like aria-describedby in web, and is always read.  Therefore, a hint really should only be used when it is extra context for a user and not VITAL context for them to understand the control.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android Hints:&lt;/strong&gt; &lt;a href="https://appt.org/en/docs/android/samples/accessibility-hint" rel="noopener noreferrer"&gt;https://appt.org/en/docs/android/samples/accessibility-hint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS Hints:&lt;/strong&gt; &lt;a href="https://appt.org/en/docs/ios/samples/accessibility-hint" rel="noopener noreferrer"&gt;https://appt.org/en/docs/ios/samples/accessibility-hint&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 7 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;Hybrid applications combine Web and Native development into one singular item. These applications can be built with a web framework such as Angular, Vue OR they are their own language entirely like Flutter or React Native.&lt;br&gt;
 &lt;br&gt;
The major disconnect in the accessibility community is understanding the type of application that is being developed. Not all mobile applications are developed in SwiftUI/UIKit (iOS) or View/JetPack(Android). Knowing how the mobile application you are working with is being built can help you be able to give proper information on how to fix specific issues in the application itself.&lt;br&gt;
 &lt;br&gt;
The big question though is, do they need to adhere to the same standards for mobile accessibility? The answer is YES! Even though they may behave more similarly to web content, users would expect them to behave as much as possible like a mobile application!&lt;br&gt;
 &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Day 8 of the Mobile Accessibility Advent Calendar!
&lt;/h2&gt;

&lt;p&gt;Terminology is key to making a connection with mobile designers and developers. One of the big disconnects in the mobile community, is a lot of us come from a web accessibility background, and it can get really hard trying to tell mobile developers how to fix issue when what we say doesn't connect with what they know.&lt;br&gt;
 &lt;br&gt;
The next couple of posts will cover key terms in mobile and the equivalents in web. Think of this as a terminology cheat sheet! Lets first start with common terms between iOS and Android both:   &lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Page&lt;/strong&gt; = View&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Main Navigation&lt;/strong&gt;  = Navigation/System Bar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aria-describedby&lt;/strong&gt; = Hint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus&lt;/strong&gt; = Accessibility Focus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab Order&lt;/strong&gt; = Swipe Order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resize Text&lt;/strong&gt; = Scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
Even just these 5 common terms can help you make a connection that lasts! In our next posts we will cover iOS and Android respectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Stay tuned for part 2 very soon!  &lt;br&gt;
Follow #MobileA11yAdventCalendar on LinkedIn and BlueSky to see more posts from the last month! &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>ios</category>
      <category>android</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Top 5 iOS Mobile App Accessibility Issues Pt 1.</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Thu, 01 Aug 2024 15:16:11 +0000</pubDate>
      <link>https://forem.com/steady5063/top-5-ios-mobile-app-accessibility-issues-pt-1-51g8</link>
      <guid>https://forem.com/steady5063/top-5-ios-mobile-app-accessibility-issues-pt-1-51g8</guid>
      <description>&lt;p&gt;Over the last few years, I have been asked more and more "Mark, what are the most common issues in mobile applications". Normally I would respond with what I know, however lately I have began to ask myself "What is the current state of mobile accessibility" and "are the common issues still the same?" &lt;/p&gt;

&lt;p&gt;Flash forward to the spring, in which I did a workshop for an accessibility conference called &lt;a href="https://knowbility.org/programs/accessu-2024" rel="noopener noreferrer"&gt;AccessU&lt;/a&gt; (If you haven't heard of it check it out because it is awesome!). The workshop was titled "Simplifying Mobile Accessibility", where we take the complex topic of accessibility in mobile and break it down so everyone can easily fix the bulk of their issues. &lt;/p&gt;

&lt;p&gt;For this workshop, I decided to do my own personal study of 10 iOS and Android mobile applications to see what were the most common accessibility issues in those applications, and what are general trends between all of the apps. &lt;/p&gt;

&lt;p&gt;Now, its time to share some of that information with you all, lets dive in to the top 5 iOS application accessibility issues!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Study
&lt;/h2&gt;

&lt;p&gt;Before I dive into the issues, I wanted to take a moment to explain the different applications I tested and how I tested them. Do know, for the purposes of this article I will not share the EXACT name of the applications in the study, just the industry/category they are in. &lt;/p&gt;

&lt;p&gt;When deciding the 10 applications to test, I chose 3 retail applications, 3 food or food service applications, 3 travel applications and 1 social media applications. To pick which ones of each category, I simply went to the app store and pick the top ones listed. &lt;/p&gt;

&lt;p&gt;For testing of each application, I tested with Voiceover, Voice Control, Switch Control and Enlarged font sizes. For those wanting to know how to test with each I have linked resources right here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=tswoD0r0Vnc" rel="noopener noreferrer"&gt;Voiceover Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=eg22JaZWAgs" rel="noopener noreferrer"&gt;Voice Control Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=HBo2BZ-Zzwg" rel="noopener noreferrer"&gt;Switch Control Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2G4Pp-mJbZE" rel="noopener noreferrer"&gt;Enlarged Font Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Issues
&lt;/h2&gt;

&lt;p&gt;Whew, okay finally we can get into the meat of this article; the issues! Lets dive into the first couple of commons issues seen in the sample of applications tested!&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing Traits
&lt;/h3&gt;

&lt;p&gt;This one may come as no shock to anyone reading this, however around 26% of the total issues found, where actionable items missing a proper trait. For those not familiar with iOS, think of a traits as the roles for particular items (like ARIA roles in web). &lt;/p&gt;

&lt;p&gt;Many items that were actionable were missing button or link traits, which makes it impossible for Voiceover and Voice Control users to know if the item has an action tied to it!&lt;/p&gt;

&lt;h4&gt;
  
  
  Remediation Tips
&lt;/h4&gt;

&lt;p&gt;First and foremost, if you can use semantic/native elements, USE THEM!! Anytime you use a text element or elements that are not native elements, you do not get the accessibility baked in with it. &lt;/p&gt;

&lt;p&gt;Second, if you must use an element that is not native/semantic then you can do something similar to the following to add a trait to the element to get it to announce properly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
 &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A11y is Awesome"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onTapGesture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The gesture tapped"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessibilityAddTraits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isButton&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also remove traits and then add a trait back to an element. For example, if you use an image and make it actionable but want it announce as "button".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kt"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;systemName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"heart"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessibilityRemoveTraits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isImage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessibilityAddTraits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isButton&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Improper Grouping of Content
&lt;/h3&gt;

&lt;p&gt;Coming in with around 20% of the issues found, Improper grouping of content. This one may confuse folks a little. What does Mark mean when he says "improper grouping of content"? In iOS applications you can create rows of content and have the whole item be tappable (think the iOS settings menu). You can also create components such as cards that can have multiple different pieces of information in them. &lt;/p&gt;

&lt;p&gt;By default, when creating components such as these each individual item is accessible one by one for voice over users. This causes a very frustrating experience when navigating complex applications. So what's the solution? Group similar content together to make each accessibility focus point clear and concise for the user. &lt;/p&gt;

&lt;p&gt;Bad example: &lt;/p&gt;

&lt;p&gt;In this example, we have a product with an image then under that the name, the price and price per. Notice in this example, that each individual item in the component gets an accessibility focus which is cumbersome for Voiceover users&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F281txssn5vh3dne3lzfc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F281txssn5vh3dne3lzfc.gif" alt="Bad A11y Mobile" width="320" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good Example: &lt;/p&gt;

&lt;p&gt;In this example photo, which is the same layout as above, the item is grouped together as one accessibility focus stop that allows for easy navigation and consumption of information! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4snmbmiw4zpir8w6wb0p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4snmbmiw4zpir8w6wb0p.jpg" alt="Dunkin donuts coffee with description and price all group together as one item with voiceover on" width="800" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Remediation Tips
&lt;/h4&gt;

&lt;p&gt;To group content, it is relatively simple. Take the component or content that needs to be grouped and group it using the &lt;code&gt;.accessibilityElement(children: .combine)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kt"&gt;VStack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dunkin Donuts Coffees"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Price: $5.00"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Quantity: 2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessibilityElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;This is only part 1 of the top 5 issues in iOS applications, there are still 3 more issues to cover! However, if you are a mobile developer take the time to look at your application for the two issues discussed in this article and see if your app has them. If they do, fix em up! Accessibility only helps extend the reach of your application so why not take the time to make it usable for all? &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
    </item>
    <item>
      <title>Maximizing Automated Accessibility Results</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Thu, 16 May 2024 20:01:33 +0000</pubDate>
      <link>https://forem.com/steady5063/maximizing-automated-accessibility-results-k9n</link>
      <guid>https://forem.com/steady5063/maximizing-automated-accessibility-results-k9n</guid>
      <description>&lt;p&gt;When a development team sets up their UI automation tests with accessibility, they tend to think they are done! &lt;/p&gt;

&lt;p&gt;"We included accessibility as part of our UI testing process, so we can now track how accessible we are!" However, if you asked most dev teams what they plan to do with results, the answers can be a mixed bag. &lt;/p&gt;

&lt;p&gt;If your development team wants to truly build and sustain accessibility in their environment then you need to maximize the value of the results from accessibility testing! Lets dive into how!&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency is Key
&lt;/h2&gt;

&lt;p&gt;The first thing consider to maximize your results is consistency. There are many accessibility libraries that exist and sometimes it can be confusing which one to start with. If you choose a particular ruleset such as axe or pa11y for the tests, then stick with it!&lt;/p&gt;

&lt;p&gt;Some development teams will use one ruleset for one level of test and entirely different one in a different level of test. This can cause confusion and different results. It may seem simple, but different results can make learning about accessibility difficult for some developers who parse the results. One ultimate goal is to educate developers as they code, and having those consistent results can help ensure this! &lt;/p&gt;

&lt;h2&gt;
  
  
  Enforce It
&lt;/h2&gt;

&lt;p&gt;If your development is up and running and fully using automated accessibility in UI tests, the best action to take is to enforce the issues that arise from the tests. &lt;/p&gt;

&lt;h3&gt;
  
  
  Code Reviews
&lt;/h3&gt;

&lt;p&gt;One way in which accessibility in the development process can be improved is through code reviews. A lot of development teams currently have an "honor system" for automated tests or manual accessibility testing, in which the developer claims they did those steps. Which is why they tend to continue to have issues and not see a downward trend.&lt;/p&gt;

&lt;p&gt;Adding enforcement of critical and serious accessibility issues from automated tests in code reviews can help ensure that teams fix the issues proactively before they check in code! &lt;/p&gt;

&lt;h3&gt;
  
  
  Github Actions (Quality Gates)
&lt;/h3&gt;

&lt;p&gt;Another form of enforcement is through github actions! Github actions allow you to run specific actions on commit of new code. &lt;/p&gt;

&lt;p&gt;For example, I am a developer who creates a component. I finish and I create a PR. If your tests are properly setup, a github action will run and check the accessibility of the new content you just created!&lt;/p&gt;

&lt;p&gt;Github actions are simple and effective to setup and can easily make enforcing the automated checks on every single PR! &lt;/p&gt;

&lt;p&gt;For an example of a working Github Action, you can visit my personal &lt;a href="https://github.com/Steady5063/axe-con-react-tester/blob/master/.github/workflows/axe.js.yml" rel="noopener noreferrer"&gt;Github accessibility page&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64z2772yj4uh1c1bfv3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64z2772yj4uh1c1bfv3f.png" alt="github accessibility logo" width="630" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Linting
&lt;/h3&gt;

&lt;p&gt;Linting is another simple way to enforce accessibility issues being fixed before release. Although separate from the UI automated tests, linting checks are so simple that they can help your dev team keep issue counts down! &lt;/p&gt;

&lt;p&gt;Accessibility linting has many benefits that can greatly improve your development team, including:&lt;/p&gt;

&lt;p&gt;Catching issues as you build HTML content&lt;br&gt;
Building accessibility knowledge for your developers&lt;br&gt;
Allows your team to build an accessible gate on commit&lt;br&gt;
Customizable to the framework you are developing in&lt;/p&gt;

&lt;h2&gt;
  
  
  Reporting Results
&lt;/h2&gt;

&lt;p&gt;The final thing to maximizing results is gathering reporting from your tests. Most development teams tend to create a standard check and check if it fails. However, with accessibility defects there tends to be more data needed in order to fix issues. &lt;/p&gt;

&lt;p&gt;There are a number of ways to ensure you get the most data out of the tests your create. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/axe-html-reporter" rel="noopener noreferrer"&gt;Axe HTML Reporter&lt;/a&gt; - Generates a nice report from the axe results objects for teams to use to see the state of the content tested. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/lpelypenko/axe-result-pretty-print?tab=readme-ov-file#axe-result-pretty-print" rel="noopener noreferrer"&gt;Axe pretty print console logger&lt;/a&gt; - A console logger that puts the results in a nice summary table. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jest/Mocha HTML report - You can take advantage of out of the box reporters from test frameworks like Jest/Mocha if you properly label your test cases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3dvzt6sdlq5z5u9uij6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw3dvzt6sdlq5z5u9uij6.png" alt="A sample axe html reporter" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;If your development team has fully integrated accessibility testing as part of their UI automated tests, then it is time to get the most out of those results. Using the suggestions above, you and your team can build a culture of developing content with accessibility in mind! &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Creating Effective Automated Accessibility Test Cases</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Tue, 14 May 2024 11:03:14 +0000</pubDate>
      <link>https://forem.com/steady5063/creating-effective-automated-accessibility-test-cases-21ho</link>
      <guid>https://forem.com/steady5063/creating-effective-automated-accessibility-test-cases-21ho</guid>
      <description>&lt;p&gt;One of the biggest fallacies in UI testing, especially when it comes to accessibility testing, is simply just making everything into a checkbox. Did we do the minimum UI testing on that component? Check! Did we do accessibility testing? Check!&lt;/p&gt;

&lt;p&gt;The tests that are written may not be the most thought out or effective for actually testing the UI. This can cause UI bugs to persist because the tests do not have the proper depth or  requirements. &lt;/p&gt;

&lt;p&gt;UI accessibility testing also is at fault for this. The typical phrase heard is "Yeah we do accessibility testing! Its fully integrated and we use it each time our tests run!". However, most development teams continue to push out automated accessibility issues. &lt;/p&gt;

&lt;p&gt;How can we improve our accessibility UI tests to more effectively know the issues in our code? &lt;/p&gt;

&lt;h2&gt;
  
  
  Proper Testing Structure
&lt;/h2&gt;

&lt;p&gt;Instead of rushing to make a test case that says "accessibility check", there are ways to structure and build regression tests for more effective accessibility testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  One to One UI Tests
&lt;/h3&gt;

&lt;p&gt;There is a principal in UI testing that says for each piece of UI there should be a test case to follow. Meaning one piece of UI, one test case. This ensures that each component or piece of HTML has a particular set of regression tests. &lt;/p&gt;

&lt;p&gt;We can apply this same principal to the accessibility test cases we setup. Instead of just simply installing axe-core or pa11y and running a scan at a high level, we can effectively place the scans for better coverage. &lt;/p&gt;

&lt;p&gt;For example, if we have a React component, that has a set of unit tests for its UI functionality, we can create a test case for that component like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Footer Component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Funtionality - Component has loaded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveTextContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Contact Us&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Functionality - List number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;footList&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;footList&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;childElementCount&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;


  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Accessibility - base render&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;violations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In that same test spec, if the UI test case expands and collapses the component, you could run a scan in each of those states and collect the results for each state of the UI. The goal is to make the accessibility test apart of the testing structure, but also effectively show the issues!&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Levels of Test
&lt;/h3&gt;

&lt;p&gt;If your development teams multiple levels of test such as Unit and Integration level testing, you should include accessibility testing at both levels. &lt;/p&gt;

&lt;p&gt;Why? If you test only in your unit or component UI tests, you will miss more issues that exist when those component begins interacting on the page together. &lt;/p&gt;

&lt;p&gt;An example of a component that would not have any automated issues in unit test but would in integration would be a component that has a "more info" link. If that component is used multiple times on the page, then in integration testing you would find multiple links with the same text! &lt;/p&gt;

&lt;h3&gt;
  
  
  Separate Accessibility Suite
&lt;/h3&gt;

&lt;p&gt;Different than having your accessibility tests as part of your test cases, you can have a separate suite of UI tests for accessibility. Development teams that are newer to including accessibility in their UI tests tend to go this route simply because their suite may be too complex to add it in or its easier for them to get it setup. &lt;/p&gt;

&lt;p&gt;Although not as effective as including in your current testing structure, there are benefits to creating a separate set of tests for accessibility only, which include: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More streamlined reporting on the state of accessibility&lt;/li&gt;
&lt;li&gt;Easier to see results&lt;/li&gt;
&lt;li&gt;Easier to create JIRA bugs &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To do this, in your project, create a separate accessibility tests folder and create either a single spec or specs broken down by business logic (groups of pages, etc). Then in your test &lt;code&gt;describe&lt;/code&gt; give it a name similar to "Accessibility of " and then test each page in the experience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Accessibility of Space Jam&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1996 Page&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pa11y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://spacejam.com/1996&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2000's Page&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pa11y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://spacejam.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add Accessibility Regression Tests
&lt;/h2&gt;

&lt;p&gt;Simple javascript libraries can give you easy, static accessibility results. However, you can go a step further and include specific regression tests for accessibility issues. &lt;/p&gt;

&lt;p&gt;When writing your teams test case, instead of just including a simple axe or pa11y test, build an accessibility regression test as part of your UI requirement testing. &lt;/p&gt;

&lt;p&gt;Let's take a look at an example using Cypress and a component that expands and collapses. I can write a simple accessibility regression test that ensures that I am properly setting the aria-expanded true/false like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
   &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A11y - FAQ proper expanded state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#toggle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aria-expanded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#toggle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#toggle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aria-expanded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#toggle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#toggle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aria-expanded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now these test cases can be apart of the standard requirement testing. The only thing to ensure is in the test the title includes "A11y" or "Accessibility" to ensure easily findable results. &lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;It's time to get past the "we included accessibility tests" that get little to no results and more effectively create test cases that allow your development team to fix more accessibility issues now! Using the suggestions above your team can easily begin to maintain an accessible application for years to come. &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>automation</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Choosing Your Accessibility UI Testing Library</title>
      <dc:creator>Mark Steadman</dc:creator>
      <pubDate>Mon, 13 May 2024 02:24:14 +0000</pubDate>
      <link>https://forem.com/steady5063/choosing-your-accessibility-ui-testing-library-1o09</link>
      <guid>https://forem.com/steady5063/choosing-your-accessibility-ui-testing-library-1o09</guid>
      <description>&lt;h2&gt;
  
  
  Where To Start?
&lt;/h2&gt;

&lt;p&gt;If you are a web developer looking to level up your teams UI automated tests to include accessibility what is the first thing you do? Google search of course!&lt;/p&gt;

&lt;p&gt;When you google search though, you may find yourself a bit overwhelmed with where to start. There are numerous different accessibility testing libraries and all them seem to work their own way. &lt;/p&gt;

&lt;p&gt;This is where developers tend to stop and go, "Well this is a lot, maybe ill add it later". That later, unfortunately, never comes. &lt;/p&gt;

&lt;p&gt;Let's break down how you can chose the best testing library for your development team!&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are My Options?
&lt;/h2&gt;

&lt;p&gt;There are multiple different packages that you can install into your project that allow you to include accessibility in your UI tests. &lt;/p&gt;

&lt;p&gt;The ones that I highly suggest for usage in UI testing are as follows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/axe-core" rel="noopener noreferrer"&gt;Axe-core&lt;/a&gt; - Axe is an accessibility testing engine for applications and HTML based content. It is the most powerful rules engine for accessibility and contains the MOST integrations on the market. Examples of integrations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;li&gt;Cypress&lt;/li&gt;
&lt;li&gt;Puppeteer&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/pa11y" rel="noopener noreferrer"&gt;PA11y&lt;/a&gt; - A command line node.js library that runs HTML code sniffer by default but also can run the axe-core rules as well! &lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/lighthouse" rel="noopener noreferrer"&gt;Google Lighthouse&lt;/a&gt; - Node CLI package that runs various checks on your application, but also includes accessibility testing as well!&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.npmjs.com/package/webaim-wave" rel="noopener noreferrer"&gt;Wave by WebAIM&lt;/a&gt; -  The WAVE extension is one of the most powerful extensions for accessibility testing. The package allows you to include that powerful testing in a CLI. &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;All of these work differently in their own respective ways. So how do you know which one to choose?&lt;/p&gt;

&lt;h2&gt;
  
  
  Making The Best Choice
&lt;/h2&gt;

&lt;p&gt;When deciding which accessibility testing library you should use, it comes down to one thing. Ease of integration!&lt;br&gt;
Whichever library fits into what your development team is doing for UI testing, should be the one you use. &lt;/p&gt;

&lt;p&gt;For example, if your development team does integration level testing or end to end testing, then PA11y or Wave is a great library to use as it will fit directly into integration testing with its CLI or NodeJS commands. &lt;/p&gt;

&lt;p&gt;An example of &lt;code&gt;pa11y&lt;/code&gt; running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Space Jam is accessible&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pa11y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://spacejam.com/1996&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a11yResults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are already using a previous testing library like Lighthouse, then simply ensure the accessibility tests are running and are visible! They should be included in the output results. &lt;/p&gt;

&lt;p&gt;Finally, if you want a specific integration into a testing framework such as Playwright or Cypress, use an axe-core integration. They are extremely easy to integrate into your current testing framework and can have you up and running in no time!&lt;/p&gt;

&lt;p&gt;Example using &lt;code&gt;@axe-core/playwright&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is accessible&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.spacejam.com/1996&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AxeBuilder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;violations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Choosing a library can be overwhelming to start. However, with a simple understanding of the top options available, you can get your development teams UI testing up and running with accessibility tests in no time! &lt;/p&gt;

</description>
      <category>a11y</category>
      <category>automation</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
