11import { 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
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,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