Skip to content

Conversation

@ScharfViktor
Copy link
Contributor

@ScharfViktor ScharfViktor commented Jun 11, 2025

related #400

This PR implements the checkAccessibility() function to check accessibility using e2e playwright tests with the following recommended rule tags: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'best-practice']

Next, we need to decide on a strategy, namely:

  • Will it be a separate set of tests, or will we check a11e in existing tests? I would prefer to use existing e2e tests with the ability to enable/disable a11y tests (A11Y_TEST=true).
  • Where to use checkAccessibility()
    • check every click()
    • check in specific places in action.ts files where page elements are clicked directly
  • Failed tests:
    • do not fail the test the first time. Just get the error logs
    • further, during the fix, we can fail tests based on violation.impact (critical — test failed, moderate — test passed)

I experimented and wrapped each click with patchPageForA11y
here is result of running one test with enabled/disabled A11Y_TEST

running one suite without a11y:

10sec:

1 scenario (1 passed)
11 steps (11 passed)
0m10.136s (executing steps: 0m07.482s)

running one suite witht a11y` 17 sec:

tests become fragile.

Log
HEADLESS=true A11Y=true OC_BASE_URL=host.docker.internal:9200 pnpm test:e2e:cucumber tests/e2e/cucumber/features/smoke/tags.feature:54

> @3.0.0-alpha.1 test:e2e:cucumber /Users/v.scharf/Work/opencloud/web
> NODE_TLS_REJECT_UNAUTHORIZED=0 TS_NODE_PROJECT=./tests/e2e/cucumber/tsconfig.json cucumber-js --profile=e2e --parallel ${PARALLEL:-1} "tests/e2e/cucumber/features/smoke/tags.feature:54"

(node:558) [DEP0180] DeprecationWarning: fs.Stats constructor is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:597) [DEP0180] DeprecationWarning: fs.Stats constructor is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
Feature: Users can use web to organize tags # tests/e2e/cucumber/features/smoke/tags.feature:1

  Scenario: Tag sharing # tests/e2e/cucumber/features/smoke/tags.feature:54
(node:597) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use `node --trace-warnings ...` to show where the warning was created)
    Given "Admin" creates following users using API
      │ id    │
      │ Alice │
      │ Brian │
    Given "Alice" creates the following folders in personal space using API
      │ name             │
      │ folder_to_shared │
    And "Alice" creates the following files into personal space using API
      │ pathToFile                 │ content     │
      │ folder_to_shared/lorem.txt │ lorem ipsum │
    And "Alice" logs in
♿ Accessibility violations detected in after locator.fill(#oc-login-username):

[autocomplete-valid] autocomplete attribute must be used correctly
  Impact: serious
  Description: Ensure the autocomplete attribute is correct and suitable for the form field
  Help: https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=playwright
  Node 1: <input class="oc-input " autocapitalize="off" spellcheck="false" autocomplete="kopano-account username" placeholder="Username" id="oc-login-username" aria-invalid="false" value="Alice-120">
  Node 2: <input class="oc-input " type="password" margin="normal" autocomplete="kopano-account current-password" placeholder="Password" id="oc-login-password" aria-invalid="false">
Accessibility check failed with 1 violation(s) in after locator.fill(#oc-login-username).
♿ Accessibility violations detected in after locator.fill(#oc-login-password):

[autocomplete-valid] autocomplete attribute must be used correctly
  Impact: serious
  Description: Ensure the autocomplete attribute is correct and suitable for the form field
  Help: https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=playwright
  Node 1: <input class="oc-input " autocapitalize="off" spellcheck="false" autocomplete="kopano-account username" placeholder="Username" id="oc-login-username" aria-invalid="false" value="Alice-120">
  Node 2: <input class="oc-input " type="password" margin="normal" autocomplete="kopano-account current-password" placeholder="Password" id="oc-login-password" aria-invalid="false">
Accessibility check failed with 1 violation(s) in after locator.fill(#oc-login-password).
♿ Accessibility violations detected in after locator.click(button[type="submit"]):

[heading-order] Heading levels should only increase by one
  Impact: moderate
  Description: Ensure the order of headings is semantically correct
  Help: https://dequeuniversity.com/rules/axe/4.10/heading-order?application=playwright
  Node 1: <h3 class="oc-login-card-title" data-msgid="Logging you in" data-current-language="en">Logging you in</h3>

[landmark-one-main] Document should have one main landmark
  Impact: moderate
  Description: Ensure the document has a main landmark
  Help: https://dequeuniversity.com/rules/axe/4.10/landmark-one-main?application=playwright
  Node 1: <html lang="en" style="--oc-role-background: #F5FAFD; --oc-role-chrome: #20434f; --oc-role-error: #BA1A1A; --oc-role-error-container: #FFDAD6; --oc-role-inverse-on-surface: #EDF1F4; --oc-role-inverse-primary: #88D1EC; --oc-role-inverse-surface: #2C3134; --oc-role-on-background: #171C1F; --oc-role-on-chrome: #ffffff; --oc-role-on-error: #FFFFFF; --oc-role-on-error-container: #410002; --oc-role-on-primary: #19353F; --oc-role-on-primary-container: #001F28; --oc-role-on-primary-fixed: #001F28; --oc-role-on-primary-fixed-variant: #004E60; --oc-role-on-secondary: #FFFFFF; --oc-role-on-secondary-container: #071E26; --oc-role-on-secondary-fixed: #071E26; --oc-role-on-secondary-fixed-variant: #344A52; --oc-role-on-surface: #171C1F; --oc-role-on-surface-variant: #40484C; --oc-role-on-tertiary: #FFFFFF; --oc-role-on-tertiary-container: #171937; --oc-role-on-tertiary-fixed: #171937; --oc-role-on-tertiary-fixed-variant: #424465; --oc-role-outline: #70787C; --oc-role-outline-variant: #BFC8CC; --oc-role-primary: #E2BAFF; --oc-role-primary-container: #B7EAFF; --oc-role-primary-fixed: #B7EAFF; --oc-role-primary-fixed-dim: #88D1EC; --oc-role-scrim: #000000; --oc-role-secondary: #20434f; --oc-role-secondary-container: #f4e5ff; --oc-role-secondary-fixed: #CFE6F1; --oc-role-secondary-fixed-dim: #B3CAD4; --oc-role-shadow: #000000; --oc-role-surface: #FFFFFF; --oc-role-surface-bright: #F5FAFD; --oc-role-surface-container: #F1F3F4; --oc-role-surface-container-high: #E4E9EC; --oc-role-surface-container-highest: #DEE3E6; --oc-role-surface-container-low: #EFF4F7; --oc-role-surface-container-lowest: #FFFFFF; --oc-role-surface-dim: #D6DBDE; --oc-role-surface-tint: #07677F; --oc-role-surface-variant: #DBE4E8; --oc-role-tertiary: #5A5C7E; --oc-role-tertiary-container: #E0E0FF; --oc-role-tertiary-fixed: #E0E0FF; --oc-role-tertiary-fixed-dim: #C3C3EB; --oc-color-icon-archive: #fbbe54; --oc-color-icon-audio: #700460; --oc-color-icon-document: #3b44a6; --oc-color-icon-folder: #4d7eaf; --oc-color-icon-image: #ee6b3b; --oc-color-icon-medical: #0984db; --oc-color-icon-pdf: #ec0d47; --oc-color-icon-presentation: #ee6b3b; --oc-color-icon-spreadsheet: #15c286; --oc-color-icon-video: #045459; --oc-role-errorContainer: #FFDAD6; --oc-role-inverseOnSurface: #EDF1F4; --oc-role-inversePrimary: #88D1EC; --oc-role-inverseSurface: #2C3134; --oc-role-onBackground: #171C1F; --oc-role-onChrome: #ffffff; --oc-role-onError: #FFFFFF; --oc-role-onErrorContainer: #410002; --oc-role-onPrimary: #19353F; --oc-role-onPrimaryContainer: #001F28; --oc-role-onPrimaryFixed: #001F28; --oc-role-onPrimaryFixedVariant: #004E60; --oc-role-onSecondary: #FFFFFF; --oc-role-onSecondaryContainer: #071E26; --oc-role-onSecondaryFixed: #071E26; --oc-role-onSecondaryFixedVariant: #344A52; --oc-role-onSurface: #171C1F; --oc-role-onSurfaceVariant: #40484C; --oc-role-onTertiary: #FFFFFF; --oc-role-onTertiaryContainer: #171937; --oc-role-onTertiaryFixed: #171937; --oc-role-onTertiaryFixedVariant: #424465; --oc-role-outlineVariant: #BFC8CC; --oc-role-primaryContainer: #B7EAFF; --oc-role-primaryFixed: #B7EAFF; --oc-role-primaryFixedDim: #88D1EC; --oc-role-secondaryContainer: #f4e5ff; --oc-role-secondaryFixed: #CFE6F1; --oc-role-secondaryFixedDim: #B3CAD4; --oc-role-surfaceBright: #F5FAFD; --oc-role-surfaceContainer: #F1F3F4; --oc-role-surfaceContainerHigh: #E4E9EC; --oc-role-surfaceContainerHighest: #DEE3E6; --oc-role-surfaceContainerLow: #EFF4F7; --oc-role-surfaceContainerLowest: #FFFFFF; --oc-role-surfaceDim: #D6DBDE; --oc-role-surfaceTint: #07677F; --oc-role-surfaceVariant: #DBE4E8; --oc-role-tertiaryContainer: #E0E0FF; --oc-role-tertiaryFixed: #E0E0FF; --oc-role-tertiaryFixedDim: #C3C3EB;">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <h1 class="oc-invisible-sr">Oidc callback</h1>
  Node 2: <div class="oc-login-card-body"><h3 class="oc-login-card-title" data-msgid="Logging you in" data-current-language="en">Logging you in</h3> <p data-msgid="Please wait, you are being redirected." data-current-language="en">Please wait, you are being redirected.</p></div>
  Node 3: <div class="oc-login-card-footer oc-pt-rm"><p>OpenCloud – Excellent file sharing</p></div>
  Node 4: <img class="oc-login-emblem" alt="OpenCloud emblem" src="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='2.83%202.84%2021.45%2027.82'%3e%3cpolygon%20points='13.55%2023.12%2014.72%2022.45%2014.72%2017.57%2018.92%2015.14%2018.92%2013.8%2017.75%2013.12%2013.53%2015.56%209.36%2013.16%208.19%2013.83%208.19%2015.18%2012.39%2017.6%2012.39%2022.45%2013.55%2023.12'%20fill='%23e2baff'/%3e%3cpolygon%20points='24.28%209.02%2013.56%202.84%2013.56%202.84%2013.56%202.84%202.83%209.02%202.83%2011.72%2013.56%205.53%2024.28%2011.72%2024.28%209.02'%20fill='%23e2baff'/%3e%3cpolygon%20points='24.28%2021.78%2013.56%2027.97%202.83%2021.78%202.83%2024.48%2013.56%2030.66%2013.56%2030.66%2013.56%2030.66%2024.28%2024.48%2024.28%2021.78'%20fill='%23e2baff'/%3e%3c/svg%3e">
Accessibility check failed with 3 violation(s) in after locator.click(button[type="submit"]).
    And "Alice" adds the following tags for the following resources using the sidebar panel
      │ resource                   │ tags         │
      │ folder_to_shared/lorem.txt │ tag 1, tag 2 │
♿ Accessibility violations detected in after locator.click(:is(#files-files-table, .oc-tiles-item, #files-shared-with-me-accepted-section, .files-table) [data-test-resource-name="folder_to_shared"]):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="1" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/personal/alice-120/folder_to_shared/lorem.txt?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=personal/alice-120/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(:is(#files-files-table, .oc-tiles-item, #files-shared-with-me-accepted-section, .files-table) [data-test-resource-name="folder_to_shared"]).
♿ Accessibility violations detected in after locator.click(//span[@data-test-resource-name="lorem.txt"]/ancestor::tr[contains(@class, "oc-tbody-tr")]//button[contains(@class, "resource-table-btn-action-dropdown")]):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="1" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/personal/alice-120/folder_to_shared/lorem.txt?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=personal/alice-120/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(//span[@data-test-resource-name="lorem.txt"]/ancestor::tr[contains(@class, "oc-tbody-tr")]//button[contains(@class, "resource-table-btn-action-dropdown")]).
♿ Accessibility violations detected in after locator.click(.oc-files-actions-show-details-trigger):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="1" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-file-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/personal/alice-120/folder_to_shared/lorem.txt?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=personal/alice-120/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(.oc-files-actions-show-details-trigger).
♿ Accessibility violations detected in after locator.click(#app-sidebar .is-active-root-panel .header__close):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="1" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/personal/alice-120/folder_to_shared/lorem.txt?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=personal/alice-120/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(#app-sidebar .is-active-root-panel .header__close).
    When "Alice" shares the following resource using the sidebar panel
      │ resource         │ recipient │ type │ role     │ resourceType │
      │ folder_to_shared │ Brian     │ user │ Can edit │ folder       │
♿ Accessibility violations detected in after locator.click(//span[@data-test-resource-name="folder_to_shared"]/ancestor::tr[contains(@class, "oc-tbody-tr")]//button[contains(@class, "resource-table-btn-action-dropdown")]):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(//span[@data-test-resource-name="folder_to_shared"]/ancestor::tr[contains(@class, "oc-tbody-tr")]//button[contains(@class, "resource-table-btn-action-dropdown")]).
♿ Accessibility violations detected in after locator.click(.oc-files-actions-show-details-trigger):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(.oc-files-actions-show-details-trigger).
♿ Accessibility violations detected in after locator.click(#sidebar-panel-sharing-select):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#sidebar-panel-sharing-select).
♿ Accessibility violations detected in after locator.click(#files-share-invite-input):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#files-share-invite-input).
♿ Accessibility violations detected in after locator.fill(#files-share-invite-input):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.fill(#files-share-invite-input).
♿ Accessibility violations detected in after locator.click(div[data-testid="new-collaborators-form"] div[data-testid="recipient-autocomplete-item-Brian Murphy"]):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(div[data-testid="new-collaborators-form"] div[data-testid="recipient-autocomplete-item-Brian Murphy"]).
♿ Accessibility violations detected in after locator.click(#new-collaborators-form):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#new-collaborators-form).
♿ Accessibility violations detected in after locator.click(#files-collaborators-role-button-new):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#files-collaborators-role-button-new).
♿ Accessibility violations detected in after locator.click(#new-collaborators-form-create-button):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-download-archive-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 2: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-move-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 3: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-copy-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 4: <button type="button" aria-label="" class="oc-button oc-rounded oc-button-m oc-button-justify-content-left oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-files-actions-delete-trigger action-menu-item oc-py-s oc-px-m oc-width-1-1" data-testid="action-handler">
  Node 5: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#new-collaborators-form-create-button).
♿ Accessibility violations detected in after locator.click(#app-sidebar .is-active-sub-panel .header__close):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/personal/alice-120/folder_to_shared?fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(#app-sidebar .is-active-sub-panel .header__close).
    And "Alice" logs out
    And "Brian" logs in
♿ Accessibility violations detected in after locator.fill(#oc-login-username):

[autocomplete-valid] autocomplete attribute must be used correctly
  Impact: serious
  Description: Ensure the autocomplete attribute is correct and suitable for the form field
  Help: https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=playwright
  Node 1: <input class="oc-input " autocapitalize="off" spellcheck="false" autocomplete="kopano-account username" placeholder="Username" id="oc-login-username" aria-invalid="false" value="Brian-120">
  Node 2: <input class="oc-input " type="password" margin="normal" autocomplete="kopano-account current-password" placeholder="Password" id="oc-login-password" aria-invalid="false">
Accessibility check failed with 1 violation(s) in after locator.fill(#oc-login-username).
♿ Accessibility violations detected in after locator.fill(#oc-login-password):

[autocomplete-valid] autocomplete attribute must be used correctly
  Impact: serious
  Description: Ensure the autocomplete attribute is correct and suitable for the form field
  Help: https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=playwright
  Node 1: <input class="oc-input " autocapitalize="off" spellcheck="false" autocomplete="kopano-account username" placeholder="Username" id="oc-login-username" aria-invalid="false" value="Brian-120">
  Node 2: <input class="oc-input " type="password" margin="normal" autocomplete="kopano-account current-password" placeholder="Password" id="oc-login-password" aria-invalid="false">
Accessibility check failed with 1 violation(s) in after locator.fill(#oc-login-password).
♿ Accessibility violations detected in after locator.click(button[type="submit"]):

[aria-progressbar-name] ARIA progressbar nodes must have an accessible name
  Impact: serious
  Description: Ensure every ARIA progressbar node has an accessible name
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=playwright
  Node 1: <div class="MuiCircularProgress-root jss7 MuiCircularProgress-colorPrimary MuiCircularProgress-indeterminate" role="progressbar" style="width: 24px; height: 24px;">

[autocomplete-valid] autocomplete attribute must be used correctly
  Impact: serious
  Description: Ensure the autocomplete attribute is correct and suitable for the form field
  Help: https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=playwright
  Node 1: <input class="oc-input " autocapitalize="off" spellcheck="false" autocomplete="kopano-account username" placeholder="Username" id="oc-login-username" aria-invalid="false" value="Brian-120">
  Node 2: <input class="oc-input " type="password" margin="normal" autocomplete="kopano-account current-password" placeholder="Password" id="oc-login-password" aria-invalid="false">
Accessibility check failed with 2 violation(s) in after locator.click(button[type="submit"]).
    And "Brian" navigates to the shared with me page
♿ Accessibility violations detected in after locator.click(//a[@data-nav-name="files-shares"]):

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw oc-p-xs oc-files-actions-hide-share-trigger raw-hover-surface">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/files/spaces/share/folder_to_shared?shareId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 3 violation(s) in after locator.click(//a[@data-nav-name="files-shares"]).
    Then the following resources should contain the following tags in the files list for user "Brian"
      │ resource                   │ tags         │
      │ folder_to_shared/lorem.txt │ tag 1, tag 2 │
♿ Accessibility violations detected in after locator.click(:is(#files-files-table, .oc-tiles-item, #files-shared-with-me-accepted-section, .files-table) [data-test-resource-name="folder_to_shared"]):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="2" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/share/folder_to_shared/lorem.txt?shareId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=share/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;contextRouteQuery.shareId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;contextRouteQuery.sort-by=name&amp;contextRouteQuery.sort-dir=asc" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(:is(#files-files-table, .oc-tiles-item, #files-shared-with-me-accepted-section, .files-table) [data-test-resource-name="folder_to_shared"]).
    And "Brian" logs out
♿ Accessibility violations detected in after locator.click(#_userMenuButton):

[aria-hidden-focus] ARIA hidden element must not be focusable or contain focusable elements
  Impact: serious
  Description: Ensure aria-hidden elements are not focusable nor contain focusable elements
  Help: https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=playwright
  Node 1: <li data-key="2" aria-hidden="true" class="oc-breadcrumb-list-item oc-flex oc-flex-middle oc-invisible-sr">

[button-name] Buttons must have discernible text
  Impact: critical
  Description: Ensure buttons have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/button-name?application=playwright
  Node 1: <button type="button" class="oc-button oc-rounded oc-button-m oc-button-justify-content-center oc-button-gap-m oc-button-secondary oc-button-raw oc-button-secondary-raw resource-table-edit-name raw-hover-surface oc-p-xs">

[link-name] Links must have discernible text
  Impact: serious
  Description: Ensure links have discernible text
  Help: https://dequeuniversity.com/rules/axe/4.10/link-name?application=playwright
  Node 1: <a href="/text-editor/share/folder_to_shared/lorem.txt?shareId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%2106d5c740-c5f4-4060-989e-27c602aaf38f&amp;contextRouteName=files-spaces-generic&amp;contextRouteParams.driveAliasAndItem=share/folder_to_shared&amp;contextRouteQuery.fileId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;contextRouteQuery.shareId=37d53b7d-4808-4fa3-b630-53b3001d4ef9%248e2c902c-189e-4cb5-9b07-3aa2536d6bef%21c4ff0cb0-b2c9-4425-ad52-e8e954701702&amp;contextRouteQuery.sort-by=name&amp;contextRouteQuery.sort-dir=asc" class="oc-resource-link oc-resource-icon-link" target="_self" draggable="false" no-hover="">

[region] All page content should be contained by landmarks
  Impact: moderate
  Description: Ensure all page content is contained by landmarks
  Help: https://dequeuniversity.com/rules/axe/4.10/region?application=playwright
  Node 1: <div class="versions oc-pb-m oc-pl-m oc-text-xsmall oc-text-muted"><span>OpenCloud 3.0.0+94b79a058</span> <span>OpenCloud Web UI 3.0.0-alpha.1</span></div>
Accessibility check failed with 4 violation(s) in after locator.click(#_userMenuButton).

1 scenario (1 passed)
11 steps (11 passed)
0m17.095s (executing steps: 0m14.786s)
v.scharf@Mac web % 

running one suite:

without a11y

HEADLESS=true A11Y_TEST=false pnpm test:e2e:cucumber tests/e2e/cucumber/features/smoke/

14 scenarios (14 passed)
253 steps (253 passed)
2m43.404s (executing steps: 2m40.704s)

with a11y for all tests

HEADLESS=true A11Y_TEST=true pnpm test:e2e:cucumber tests/e2e/cucumber/features/smoke/

14 scenarios (3 failed, 11 passed)
253 steps (3 failed, 32 skipped, 218 passed)
6m29.083s (executing steps: 6m26.405s)

error:

✖ And "Alice" logs in # file:/Users/v.scharf/Work/opencloud/web/tests/e2e/cucumber/steps/ui/session.ts:33
    page.evaluate: Execution context was destroyed, most likely because of a navigation
        at AxeBuilder.analyze (/Users/v.scharf/Work/opencloud/web/node_modules/.pnpm/@axe-core+playwright@4.10.2_playwright-core@1.52.0/node_modules/@axe-core/playwright/dist/index.mjs:201:16)
        at checkAccessibility (/Users/v.scharf/Work/opencloud/web/tests/e2e/support/utils/accessibility.ts:7:10)
        at locator.click (/Users/v.scharf/Work/opencloud/web/tests/e2e/support/utils/accessibility.ts:38:23)

@ScharfViktor ScharfViktor force-pushed the a11yTests branch 2 times, most recently from 010e3d7 to 84199fd Compare June 11, 2025 14:39
@AlexAndBear AlexAndBear force-pushed the a11yTests branch 3 times, most recently from 403c9ab to ecd30b2 Compare June 11, 2025 20:21
@ScharfViktor
Copy link
Contributor Author

I think that's enough for the first step.

what I do:

  • I don't check accessibility with every click (it's a long and unstable).
  • I check accessibility in a separate set of tests. Later, I will add keyboard navigation tests there.
  • I don't scan all elements. With include(), we can specify where the test should scan.
  • I implemented the first file, smoke.feature, in which I follow the structure, open various tabs, and check the accessibility of files-view-wrapper (there will be others, deeper).
    Screenshot 2025-06-13 at 11 34 12
  • In some places (for example, when logging in), I need to check accessibility before completing the action (by clicking the login button), so in order to avoid writing a new login action, I use the Cucumber tag @a11y and place the check in an existing function.
  • All detected issues have an impact level. We receive a log of all issues but can fail the test for a specific impact level.
  • I'll put the tests into CI in the following pr

@ScharfViktor ScharfViktor marked this pull request as ready for review June 13, 2025 09:50
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR integrates automated accessibility checks into the end-to-end tests by leveraging AxeBuilder for Playwright. The key changes include:

  • Introducing the checkAccessibility function and patching Playwright’s locator methods (click, fill, press) to trigger accessibility checks.
  • Enhancing session and actor objects to pass an accessibility flag, and adding new view mode options.
  • Updating environment and Cucumber steps to enable accessibility tests and extend resource view mode handling.

Reviewed Changes

Copilot reviewed 12 out of 13 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tests/e2e/support/utils/accessibility.ts Adds accessibility check function and patches locator methods to run a11y checks after actions
tests/e2e/support/objects/runtime/session.ts Extends login and sign-in methods to optionally run accessibility checks
tests/e2e/support/objects/app-files/resource/index.ts
tests/e2e/support/objects/app-files/resource/actions.ts
Introduces a switchViewMode function and expands target options for view mode toggling
tests/e2e/support/environment/actor/actor.ts Applies the a11y patch conditionally based on the A11Y_TEST env variable
tests/e2e/cucumber/* Updates step definitions and environment configuration to support accessibility tests
package.json Adds @axe-core/playwright dependency
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

@AlexAndBear
Copy link
Contributor

AlexAndBear commented Jun 13, 2025

Looks very clean and straight forward to me !

run pnpm lint --fix

@ScharfViktor ScharfViktor merged commit a82a8f5 into main Jun 16, 2025
18 checks passed
@ScharfViktor ScharfViktor deleted the a11yTests branch June 16, 2025 06:06
@openclouders openclouders mentioned this pull request Jun 13, 2025
1 task
'{string} check accessibility of the {string} page',
async function (this: World, stepUser: string, place: string): Promise<void> {
const { page } = this.actorsEnvironment.getActor({ key: stepUser })
await checkAccessibility(page, `personal space page`, place)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

personal space page will be only true for some tests.
Can we get enough context e.g. from the URL or maybe we can put it into the step definition
'{string} checks the accessibility of the DOM element {string} on the {string}
so in the feature file it will be: When "Alice" checks the accessibility of the DOM element ".files-view-wrapper" on the "personal space page"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, I'll leave your comment unresolved and fix it in the next PR.

import { checkAccessibility } from '../../../support/utils/accessibility'

Then(
'{string} check accessibility of the {string} page',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest to change it to
'{string} checks the accessibility of the DOM element {string} on the current page',

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants