fix(test): stabilize e2e tests (#1678)

This commit is contained in:
Sam Potts
2026-06-12 07:13:07 +10:00
committed by GitHub
parent 00aa6247b8
commit 4a81e048a1
2 changed files with 19 additions and 18 deletions
+16 -11
View File
@@ -1,10 +1,23 @@
import { expect, test } from '@playwright/test';
import { expect, type Page, test } from '@playwright/test';
import { DATA_ATTRS, SELECTORS } from '../fixtures/selectors';
import { PlayerPage } from '../page-objects/player';
test.describe('Error Dialog', () => {
let player: PlayerPage;
async function triggerError(page: Page) {
await page.evaluate(() => {
const video = document.querySelector('video') as HTMLVideoElement;
if (!video) return;
Object.defineProperty(video, 'error', {
configurable: true,
value: { code: 4, message: 'Test media error' },
});
video.dispatchEvent(new Event('error'));
});
}
test.beforeEach(async ({ page }) => {
player = new PlayerPage(page);
await page.goto('/pages/html-video-mp4.html');
@@ -14,11 +27,7 @@ test.describe('Error Dialog', () => {
test('shows error dialog on media load failure', async ({ page }) => {
const errorDialog = page.locator(SELECTORS.errorDialog).first();
// Set an invalid source to trigger a media error
await page.evaluate(() => {
const video = document.querySelector('video') as HTMLVideoElement;
if (video) video.src = 'https://example.com/does-not-exist.mp4';
});
await triggerError(page);
// Error dialog should appear with data-open
await expect(errorDialog).toHaveAttribute(DATA_ATTRS.open, '', { timeout: 15_000 });
@@ -27,11 +36,7 @@ test.describe('Error Dialog', () => {
test('error dialog can be dismissed', async ({ page }) => {
const errorDialog = page.locator(SELECTORS.errorDialog).first();
// Trigger error
await page.evaluate(() => {
const video = document.querySelector('video') as HTMLVideoElement;
if (video) video.src = 'https://example.com/does-not-exist.mp4';
});
await triggerError(page);
await expect(errorDialog).toHaveAttribute(DATA_ATTRS.open, '', { timeout: 15_000 });
+3 -7
View File
@@ -4,7 +4,7 @@ import { DATA_ATTRS, SELECTORS } from '../fixtures/selectors';
import { PlayerPage } from '../page-objects/player';
for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly PageEntry[]) {
const usesSettingsMenu = !path.includes('/cdn-video') && !path.includes('/ejected');
const rateMenu = !path.includes('/cdn-video') && !path.includes('/ejected');
test.describe(`Video Controls — ${name}`, () => {
test.skip(({ browserName }) => {
return skipBrowsers?.includes(browserName as 'chromium' | 'webkit' | 'firefox') ?? false;
@@ -27,11 +27,7 @@ for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly Pa
await expect(player.muteButton).toHaveAttribute(DATA_ATTRS.volumeLevel);
await expect(player.fullscreenButton).toHaveAttribute(DATA_ATTRS.availability);
await expect(player.pipButton).toHaveAttribute(DATA_ATTRS.availability);
if (usesSettingsMenu) {
await expect(player.settingsButton).toBeAttached();
} else {
await expect(player.captionsButton).toHaveAttribute(DATA_ATTRS.availability);
}
await expect(player.settingsButton).toBeAttached();
await expect(player.duration).not.toHaveText('');
await player.showControls();
await expect(player.controls).toBeAttached();
@@ -96,7 +92,7 @@ for (const { name, path, media, skipBrowsers } of ALL_VIDEO_PAGES as readonly Pa
// --- Playback Rate ---
(usesSettingsMenu ? test : test.skip)('playback rate menu changes selected rate', async () => {
(rateMenu ? test : test.skip)('playback rate menu changes selected rate', async () => {
const initialRate = await player.getPlaybackRate();
await player.selectAlternativePlaybackRate();