diff --git a/core/src/components/menu/test/a11y/e2e.ts b/core/src/components/menu/test/a11y/e2e.ts
deleted file mode 100644
index 874b6a4f334..00000000000
--- a/core/src/components/menu/test/a11y/e2e.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { AxePuppeteer } from '@axe-core/puppeteer';
-import { newE2EPage } from '@stencil/core/testing';
-
-test('menu: axe', async () => {
- const page = await newE2EPage({
- url: '/src/components/menu/test/a11y?ionic:_testing=true',
- });
-
- const menu = await page.find('ion-menu');
- await menu.callMethod('open');
- await menu.waitForVisible();
-
- const results = await new AxePuppeteer(page).analyze();
- expect(results.violations.length).toEqual(0);
-});
diff --git a/core/src/components/menu/test/a11y/index.html b/core/src/components/menu/test/a11y/index.html
index 0fdc6cbe0b9..a7e66cb9fc4 100644
--- a/core/src/components/menu/test/a11y/index.html
+++ b/core/src/components/menu/test/a11y/index.html
@@ -2,18 +2,28 @@
- Segment - a11y
+ Menu - a11y
+
- Menu
+
+
+ Menu
+
+
+
+
@@ -21,6 +31,7 @@ Menu
+ Open Menu
Button
@@ -35,5 +46,12 @@ Menu
+
+
diff --git a/core/src/components/menu/test/a11y/menu.e2e.ts b/core/src/components/menu/test/a11y/menu.e2e.ts
new file mode 100644
index 00000000000..98d5bd7d26a
--- /dev/null
+++ b/core/src/components/menu/test/a11y/menu.e2e.ts
@@ -0,0 +1,28 @@
+import AxeBuilder from '@axe-core/playwright';
+import { expect } from '@playwright/test';
+import { test } from '@utils/test/playwright';
+
+test.describe('menu: a11y', () => {
+ test.beforeEach(async ({ skip }) => {
+ skip.rtl();
+ skip.mode('md');
+ });
+
+ test('menu should not have accessibility violations', async ({ page }) => {
+ await page.goto(`/src/components/menu/test/a11y`);
+
+ const menu = page.locator('ion-menu');
+ const button = page.locator('#open-menu');
+
+ await button.click();
+ await page.waitForSelector('ion-menu', { state: 'visible' });
+
+ await expect(menu).toHaveAttribute('role', 'navigation');
+
+ const heading = page.locator('ion-menu h1');
+ await expect(heading).toHaveText('Open Menu');
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+});
diff --git a/core/src/components/menu/test/basic/e2e.ts b/core/src/components/menu/test/basic/e2e.ts
deleted file mode 100644
index dd83dfeacff..00000000000
--- a/core/src/components/menu/test/basic/e2e.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { newE2EPage } from '@stencil/core/testing';
-
-import { testMenu } from '../test.utils';
-
-const DIRECTORY = 'basic';
-const getActiveElementID = async (page) => {
- const activeElement = await page.evaluateHandle(() => document.activeElement);
- return page.evaluate((el) => el?.id, activeElement);
-};
-
-test('menu: start menu', async () => {
- await testMenu(DIRECTORY, '#start-menu', 'first');
-});
-
-test('menu: start custom menu', async () => {
- await testMenu(DIRECTORY, '#custom-menu', 'custom');
-});
-
-test('menu: end menu', async () => {
- await testMenu(DIRECTORY, '#end-menu');
-});
-
-test('menu: focus trap', async () => {
- const page = await newE2EPage({ url: '/src/components/menu/test/basic?ionic:_testing=true' });
-
- await page.click('#open-first');
- const menu = await page.find('#start-menu');
- await menu.waitForVisible();
-
- let activeElID = await getActiveElementID(page);
- expect(activeElID).toEqual('start-menu');
-
- await page.keyboard.press('Tab');
- activeElID = await getActiveElementID(page);
- expect(activeElID).toEqual('start-menu-button');
-
- // do it again to make sure focus stays inside menu
- await page.keyboard.press('Tab');
- activeElID = await getActiveElementID(page);
- expect(activeElID).toEqual('start-menu-button');
-});
-
-test('menu: preserve scroll position', async () => {
- const page = await newE2EPage({ url: '/src/components/menu/test/basic?ionic:_testing=true' });
-
- await page.click('#open-first');
- const menu = await page.find('#start-menu');
- await menu.waitForVisible();
-
- await page.$eval('#start-menu ion-content', (menuContentEl: any) => {
- return menuContentEl.scrollToPoint(0, 200);
- });
-
- await menu.callMethod('close');
-
- await page.click('#open-first');
- await menu.waitForVisible();
-
- const scrollTop = await page.$eval('#start-menu ion-content', async (menuContentEl: any) => {
- const contentScrollEl = await menuContentEl.getScrollElement();
- return contentScrollEl.scrollTop;
- });
-
- expect(scrollTop).toEqual(200);
-});
-
-/**
- * RTL Tests
- */
-
-test('menu:rtl: start menu', async () => {
- await testMenu(DIRECTORY, '#start-menu', 'first', true);
-});
-
-test('menu:rtl: start custom menu', async () => {
- await testMenu(DIRECTORY, '#custom-menu', 'custom', true);
-});
-
-test('menu:rtl: end menu', async () => {
- await testMenu(DIRECTORY, '#end-menu', '', true);
-});
diff --git a/core/src/components/menu/test/basic/index.html b/core/src/components/menu/test/basic/index.html
index 722be746148..af0074a4cbd 100644
--- a/core/src/components/menu/test/basic/index.html
+++ b/core/src/components/menu/test/basic/index.html
@@ -12,12 +12,6 @@
-
-