Skip to content

Commit 6b0d3b6

Browse files
authored
fix(test): update e2e menu selectors (#1674)
1 parent f90a700 commit 6b0d3b6

4 files changed

Lines changed: 27 additions & 47 deletions

File tree

apps/e2e/fixtures/selectors.ts

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@ function withinControls(selector: string): string {
1515
return `media-controls ${selector}, .media-controls ${selector}`;
1616
}
1717

18-
/** Scope a descendant selector to each comma-separated panel matcher. */
19-
function withinMenuPanel(panelSelector: string, descendant: string): string {
20-
return panelSelector
18+
function unchecked(selector: string): string {
19+
return selector
2120
.split(',')
22-
.map((panel) => `${panel.trim()} ${descendant}`)
21+
.map((part) => `${part.trim()}[aria-checked="false"]`)
2322
.join(', ');
2423
}
2524

25+
const menu = '[role="menu"]';
26+
const item = '[role="menuitem"]';
27+
const option = '[role="menuitemradio"]';
28+
const activeMenu = `${menu}[data-menu-view-state="active"]`;
29+
const playbackRateOptions = [
30+
`#playback-rate-menu ${option}`,
31+
withinControls(`.media-menu--playback-rate ${option}`),
32+
].join(', ');
33+
2634
export const SELECTORS = {
2735
// Player containers
2836
// HTML: <video-player>, React: wrapper div around VideoSkin
@@ -47,37 +55,16 @@ export const SELECTORS = {
4755
withinControls('.media-button--playback-rate'),
4856
withinControls('button[aria-haspopup="menu"][aria-label^="Playback rate"]:not(.media-menu__item)'),
4957
].join(', '),
50-
playbackRateMenuPanel: '#playback-rate-menu[role="menu"], [role="menu"]#playback-rate-menu',
51-
playbackRateMenuRadioItems: withinMenuPanel(
52-
'#playback-rate-menu[role="menu"], [role="menu"]#playback-rate-menu',
53-
'[role="menuitemradio"]'
54-
),
55-
/** Standalone playback rate menu items (HTML id + React open menu in controls). */
56-
openPlaybackRateMenuRadioItems: [
57-
withinMenuPanel('#playback-rate-menu[role="menu"], [role="menu"]#playback-rate-menu', '[role="menuitemradio"]'),
58-
withinControls('[role="menu"] [role="menuitemradio"]'),
59-
].join(', '),
60-
/** Currently visible settings submenu panel (HTML + React). */
61-
activeMenuPanel: '[role="menu"][data-menu-view-state="active"]',
62-
activeMenuRadioItems: '[role="menu"][data-menu-view-state="active"] [role="menuitemradio"]',
58+
playbackRateUncheckedOptions: unchecked(playbackRateOptions),
59+
activeMenuOptions: `${activeMenu} ${option}`,
60+
activeMenuUncheckedOptions: unchecked(`${activeMenu} ${option}`),
6361
settingsButton: [
6462
withinControls('.media-button--settings'),
6563
withinControls('button[commandfor="settings-menu"]'),
6664
withinControls('button[aria-label="Settings"]'),
6765
].join(', '),
68-
settingsCaptionsItem: [
69-
'media-menu-item[commandfor="settings-captions-menu"]',
70-
'[role="menuitem"]:has-text("Captions")',
71-
].join(', '),
72-
settingsSpeedItem: ['media-menu-item[commandfor="settings-speed-menu"]', '[role="menuitem"]:has-text("Speed")'].join(
73-
', '
74-
),
75-
settingsSpeedMenuPanel: '#settings-speed-menu[role="menu"], [role="menu"]#settings-speed-menu',
76-
settingsCaptionsMenuPanel: '#settings-captions-menu[role="menu"], [role="menu"]#settings-captions-menu',
77-
settingsCaptionsMenuRadioItems: withinMenuPanel(
78-
'#settings-captions-menu[role="menu"], [role="menu"]#settings-captions-menu',
79-
'[role="menuitemradio"]'
80-
),
66+
settingsCaptionsItem: `${item}:has-text("Captions")`,
67+
settingsSpeedItem: `${item}:has-text("Speed")`,
8168

8269
// Sliders
8370
// HTML: <media-time-slider>, React: horizontal .media-slider inside .media-time-controls

apps/e2e/page-objects/player.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,15 @@ export class PlayerPage {
166166
await this.settingsButton.click();
167167
await expect(this.settingsSpeedItem).toBeVisible();
168168
await this.settingsSpeedItem.click();
169-
await expect(this.page.locator(`${SELECTORS.activeMenuPanel} [role="menuitemradio"]`).first()).toBeVisible();
169+
await expect(this.page.locator(SELECTORS.activeMenuOptions).first()).toBeVisible();
170170
}
171171

172172
async openCaptionsSettings(): Promise<void> {
173173
await this.showControls();
174174
await this.settingsButton.click();
175175
await expect(this.settingsCaptionsItem).toBeVisible();
176176
await this.settingsCaptionsItem.click();
177-
await expect(this.page.locator(SELECTORS.activeMenuRadioItems).first()).toBeVisible();
177+
await expect(this.page.locator(SELECTORS.activeMenuOptions).first()).toBeVisible();
178178
}
179179

180180
async getPlaybackRate(): Promise<number> {
@@ -236,16 +236,8 @@ export class PlayerPage {
236236
await this.playbackRateButton.click();
237237
}
238238

239-
const uncheckedPlaybackRateOptions = SELECTORS.openPlaybackRateMenuRadioItems
240-
.split(', ')
241-
.map((selector) => `${selector.trim()}[aria-checked="false"]`)
242-
.join(', ');
243239
const option = this.page
244-
.locator(
245-
usesSettingsMenu
246-
? `${SELECTORS.activeMenuPanel} [role="menuitemradio"][aria-checked="false"]`
247-
: uncheckedPlaybackRateOptions
248-
)
240+
.locator(usesSettingsMenu ? SELECTORS.activeMenuUncheckedOptions : SELECTORS.playbackRateUncheckedOptions)
249241
.first();
250242
await expect(option).toBeVisible({ timeout: 5_000 });
251243
// Menu popovers can intercept pointer events on nested radio items.

apps/e2e/tests/captions.spec.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { expect, test } from '@playwright/test';
2-
import { SELECTORS } from '../fixtures/selectors';
2+
import { DATA_ATTRS, SELECTORS } from '../fixtures/selectors';
33
import { PlayerPage } from '../page-objects/player';
44

55
test.describe('Captions', () => {
@@ -11,10 +11,11 @@ test.describe('Captions', () => {
1111
await player.waitForMediaReady();
1212
});
1313

14-
test('captions settings hidden without subtitle tracks', async () => {
14+
test('captions settings are unavailable without subtitle tracks', async () => {
1515
await player.showControls();
1616
await player.settingsButton.click();
17-
await expect(player.settingsCaptionsItem).toBeHidden();
17+
await expect(player.settingsCaptionsItem).toHaveAttribute(DATA_ATTRS.availability, 'unavailable');
18+
await expect(player.settingsCaptionsItem).toHaveAttribute('aria-disabled', 'true');
1819
});
1920

2021
test('captions settings lists tracks when subtitle track is added', async ({ page }) => {
@@ -33,7 +34,7 @@ test.describe('Captions', () => {
3334
await player.showControls();
3435
await player.openCaptionsSettings();
3536

36-
const options = page.locator(SELECTORS.activeMenuRadioItems);
37+
const options = page.locator(SELECTORS.activeMenuOptions);
3738
await expect(options).toHaveCount(2, { timeout: 5_000 });
3839
});
3940
});

apps/e2e/tests/visual/video-skin.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ test.describe('Visual — Captions', () => {
6767

6868
await player.showControls();
6969
await player.openCaptionsSettings();
70-
await expect(page.locator(SELECTORS.activeMenuRadioItems)).toHaveCount(2);
71-
await page.locator(SELECTORS.activeMenuRadioItems).nth(1).dispatchEvent('click');
70+
await expect(page.locator(SELECTORS.activeMenuOptions)).toHaveCount(2);
71+
await page.locator(SELECTORS.activeMenuOptions).nth(1).dispatchEvent('click');
7272

7373
// Play briefly so the caption cue at 0:00 activates, then pause
7474
await player.play();

0 commit comments

Comments
 (0)