Skip to content

Commit 7bd60e0

Browse files
test(video-player): wait for widget after tab clicks, fix poster race
1 parent 9347dc1 commit 7bd60e0

1 file changed

Lines changed: 21 additions & 5 deletions

File tree

packages/pluggableWidgets/video-player-web/e2e/VideoPlayer.spec.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { test, expect } from "@mendix/run-e2e/fixtures";
2-
import { waitForDataReady } from "@mendix/run-e2e/mendix-helpers";
2+
import { waitForWidget } from "@mendix/run-e2e/mendix-helpers";
33

44
test.describe("Video Player", () => {
55
test.beforeEach(async ({ page }) => {
@@ -41,6 +41,7 @@ test.describe("Tab page", () => {
4141

4242
test("renders youtube video", async ({ page }) => {
4343
await page.locator(".mx-name-tabPage1").click();
44+
await waitForWidget(page, "videoPlayer1");
4445
await expect(
4546
page.locator(".widget-video-player.widget-video-player-container.mx-name-videoPlayer1.size-box iframe")
4647
).toBeVisible();
@@ -52,6 +53,7 @@ test.describe("Tab page", () => {
5253

5354
test("renders vimeo video", async ({ page }) => {
5455
await page.locator(".mx-name-tabPage5").click();
56+
await waitForWidget(page, "videoPlayer5");
5557
await expect(
5658
page.locator(".widget-video-player.widget-video-player-container.mx-name-videoPlayer5.size-box iframe")
5759
).toBeVisible();
@@ -63,6 +65,7 @@ test.describe("Tab page", () => {
6365

6466
test("renders dailymotion video", async ({ page }) => {
6567
await page.locator(".mx-name-tabPage4").click();
68+
await waitForWidget(page, "videoPlayer4");
6669
await expect(
6770
page.locator(".widget-video-player.widget-video-player-container.mx-name-videoPlayer4.size-box iframe")
6871
).toBeVisible();
@@ -74,6 +77,7 @@ test.describe("Tab page", () => {
7477

7578
test("renders html5 video", async ({ page }) => {
7679
await page.locator(".mx-name-tabPage3").click();
80+
await waitForWidget(page, "videoPlayer3");
7781
await expect(
7882
page.locator(".widget-video-player.widget-video-player-container.mx-name-videoPlayer3.size-box video")
7983
).toBeVisible();
@@ -112,7 +116,19 @@ test.describe("External video", () => {
112116
await widget.scrollIntoViewIfNeeded();
113117
await expect(widget).toBeVisible();
114118
await expect(videoLocator).toHaveAttribute("poster", /.+/);
115-
await waitForDataReady(page);
119+
// Wait for poster image to decode in-page before screenshotting.
120+
// page.evaluate with a separate Image() is unreliable — the promise can
121+
// resolve before the <video> element itself has rendered the poster frame.
122+
await videoLocator.evaluate(el =>
123+
el.poster
124+
? new Promise(r => {
125+
const i = new Image();
126+
i.onload = i.onerror = r;
127+
i.src = el.poster;
128+
if (i.complete) r();
129+
})
130+
: Promise.resolve()
131+
);
116132
await expect(widget).toHaveScreenshot("videoPlayerExternalPoster.png");
117133
});
118134

@@ -122,21 +138,21 @@ test.describe("External video", () => {
122138
});
123139

124140
test("renders video aspect ratio correctly", async ({ page }) => {
125-
await expect(page.locator(".mx-name-videoPlayer1")).toBeVisible();
141+
await waitForWidget(page, "videoPlayer1");
126142
const videoElement = await page.locator(".mx-name-videoPlayer1").first().boundingBox();
127143
const { width, height } = videoElement;
128144
const aspectRatio = Number(width / height);
129145
expect(aspectRatio).toBeCloseTo(16 / 9, 0.1);
130146

131147
await page.locator(".mx-name-tabPage2").click();
132-
await expect(page.locator(".mx-name-videoPlayer3")).toBeVisible();
148+
await waitForWidget(page, "videoPlayer3");
133149
const videoElement2 = await page.locator(".mx-name-videoPlayer3").first().boundingBox();
134150
const { width: width2, height: height2 } = videoElement2;
135151
const aspectRatio2 = Number(width2 / height2);
136152
expect(aspectRatio2).toBeCloseTo(3 / 2, 0.1);
137153

138154
await page.locator(".mx-name-tabPage3").click();
139-
await expect(page.locator(".mx-name-videoPlayer5")).toBeVisible();
155+
await waitForWidget(page, "videoPlayer5");
140156
const videoElement3 = await page.locator(".mx-name-videoPlayer5").first().boundingBox();
141157
const { width: width3, height: height3 } = videoElement3;
142158
expect(width3).toEqual(height3);

0 commit comments

Comments
 (0)