11import { test , expect } from "@mendix/run-e2e/fixtures" ;
2- import { waitForDataReady } from "@mendix/run-e2e/mendix-helpers" ;
2+ import { waitForWidget , waitFrames } from "@mendix/run-e2e/mendix-helpers" ;
33
44test . 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,21 @@ 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+ ) ;
132+ // Wait two animation frames so the browser flushes layout and paints the poster frame.
133+ await waitFrames ( page , 2 ) ;
116134 await expect ( widget ) . toHaveScreenshot ( "videoPlayerExternalPoster.png" ) ;
117135 } ) ;
118136
@@ -122,21 +140,21 @@ test.describe("External video", () => {
122140 } ) ;
123141
124142 test ( "renders video aspect ratio correctly" , async ( { page } ) => {
125- await expect ( page . locator ( ".mx-name- videoPlayer1") ) . toBeVisible ( ) ;
143+ await waitForWidget ( page , " videoPlayer1") ;
126144 const videoElement = await page . locator ( ".mx-name-videoPlayer1" ) . first ( ) . boundingBox ( ) ;
127145 const { width, height } = videoElement ;
128146 const aspectRatio = Number ( width / height ) ;
129147 expect ( aspectRatio ) . toBeCloseTo ( 16 / 9 , 0.1 ) ;
130148
131149 await page . locator ( ".mx-name-tabPage2" ) . click ( ) ;
132- await expect ( page . locator ( ".mx-name- videoPlayer3") ) . toBeVisible ( ) ;
150+ await waitForWidget ( page , " videoPlayer3") ;
133151 const videoElement2 = await page . locator ( ".mx-name-videoPlayer3" ) . first ( ) . boundingBox ( ) ;
134152 const { width : width2 , height : height2 } = videoElement2 ;
135153 const aspectRatio2 = Number ( width2 / height2 ) ;
136154 expect ( aspectRatio2 ) . toBeCloseTo ( 3 / 2 , 0.1 ) ;
137155
138156 await page . locator ( ".mx-name-tabPage3" ) . click ( ) ;
139- await expect ( page . locator ( ".mx-name- videoPlayer5") ) . toBeVisible ( ) ;
157+ await waitForWidget ( page , " videoPlayer5") ;
140158 const videoElement3 = await page . locator ( ".mx-name-videoPlayer5" ) . first ( ) . boundingBox ( ) ;
141159 const { width : width3 , height : height3 } = videoElement3 ;
142160 expect ( width3 ) . toEqual ( height3 ) ;
0 commit comments