1313
1414import { ComponentPersistencePage , test , describe , expect } from '@test/e2e/helpers'
1515
16+ const navigateAndAwaitHydration = async (
17+ page : ComponentPersistencePage ,
18+ href : string ,
19+ urlPattern : string | RegExp ,
20+ timeout = 5000
21+ ) => {
22+ await page . navigateToPage ( href )
23+ await page . waitForPageLoad ( )
24+ await page . waitForHeaderComponents ( )
25+ await page . waitForURL ( urlPattern , { timeout } )
26+ }
27+
1628describe ( 'View Transitions - transition:persist on meta theme-color' , ( ) => {
1729 test ( 'should persist meta theme-color element across navigation' , async ( {
1830 page : playwrightPage ,
1931 } ) => {
2032 const page = await ComponentPersistencePage . init ( playwrightPage )
2133
2234 await page . goto ( '/' )
35+ await page . waitForHeaderComponents ( )
2336
2437 // Set up test data on the meta theme-color element
2538 const initialData = await page . setupPersistenceTest ( 'meta[name="theme-color"]' )
@@ -33,8 +46,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
3346 expect ( initialContent ) . toMatch ( / ^ # [ 0 - 9 a - f A - F ] { 6 } $ / )
3447
3548 // Navigate to a different page using Astro's View Transitions
36- await page . navigateToPage ( '/articles' )
37- await page . waitForURL ( '**/articles' , { timeout : 5000 } )
49+ await navigateAndAwaitHydration ( page , '/articles' , '**/articles' )
3850
3951 // Verify the element persisted with the same DOM identity
4052 const afterNavigationData = await page . verifyPersistence ( 'meta[name="theme-color"]' )
@@ -56,6 +68,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
5668 } ) => {
5769 const page = await ComponentPersistencePage . init ( playwrightPage )
5870 await page . goto ( '/' )
71+ await page . waitForHeaderComponents ( )
5972
6073 // Mark the <head> element to verify it persists (Astro behavior)
6174 const headData = await page . evaluate ( ( ) => {
@@ -89,8 +102,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
89102 expect ( metaData . content ) . toMatch ( / ^ # [ 0 - 9 a - f A - F ] { 6 } $ / )
90103
91104 // Navigate using View Transitions
92- await page . navigateToPage ( '/articles' )
93- await page . waitForURL ( '**/articles' , { timeout : 5000 } )
105+ await navigateAndAwaitHydration ( page , '/articles' , '**/articles' )
94106
95107 // Check if head element persisted (Astro keeps the same head element)
96108 const afterNavigationHead = await page . evaluate ( ( ) => {
@@ -128,6 +140,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
128140 } ) => {
129141 const page = await ComponentPersistencePage . init ( playwrightPage )
130142 await page . goto ( '/' )
143+ await page . waitForHeaderComponents ( )
131144
132145 // Get initial theme-color value
133146 const initialColor = await page . evaluate ( ( ) => {
@@ -138,8 +151,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
138151 expect ( initialColor ) . toMatch ( / ^ # [ 0 - 9 a - f A - F ] { 6 } $ / )
139152
140153 // Navigate to another page
141- await page . navigateToPage ( '/services' )
142- await page . waitForURL ( '**/services' , { timeout : 5000 } )
154+ await navigateAndAwaitHydration ( page , '/services' , '**/services' )
143155
144156 // Get theme-color value after navigation
145157 const afterNavigationColor = await page . evaluate ( ( ) => {
@@ -154,6 +166,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
154166 // Home is not listed in the navigation menu, so reload the page to return
155167 await page . goto ( '/' )
156168 await page . waitForURL ( / \/ $ / , { timeout : 5000 } )
169+ await page . waitForHeaderComponents ( )
157170
158171 // Verify theme-color is still the same
159172 const finalColor = await page . evaluate ( ( ) => {
@@ -170,6 +183,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
170183 } ) => {
171184 const page = await ComponentPersistencePage . init ( playwrightPage )
172185 await page . goto ( '/' )
186+ await page . waitForHeaderComponents ( )
173187
174188 // Mark the canonical link element to check if it's replaced or just updated
175189 const initialData = await page . evaluate ( ( ) => {
@@ -190,8 +204,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
190204 expect ( initialData . href ) . toMatch ( / \/ $ / )
191205
192206 // Navigate to articles page
193- await page . navigateToPage ( '/articles' )
194- await page . waitForURL ( '**/articles' , { timeout : 5000 } )
207+ await navigateAndAwaitHydration ( page , '/articles' , '**/articles' )
195208
196209 // Check if element was replaced or just updated
197210 const afterNavigationData = await page . evaluate ( ( ) => {
@@ -225,6 +238,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
225238 } ) => {
226239 const page = await ComponentPersistencePage . init ( playwrightPage )
227240 await page . goto ( '/' )
241+ await page . waitForHeaderComponents ( )
228242
229243 // Get initial sitemap URL
230244 const initialSitemap = await page . evaluate ( ( ) => {
@@ -235,8 +249,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
235249 expect ( initialSitemap ) . toBe ( '/sitemap-index.xml' )
236250
237251 // Navigate to services page
238- await page . navigateToPage ( '/services' )
239- await page . waitForURL ( '**/services' , { timeout : 5000 } )
252+ await navigateAndAwaitHydration ( page , '/services' , '**/services' )
240253
241254 // Get sitemap URL after navigation
242255 const afterNavigationSitemap = await page . evaluate ( ( ) => {
@@ -254,6 +267,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
254267 } ) => {
255268 const page = await ComponentPersistencePage . init ( playwrightPage )
256269 await page . goto ( '/' )
270+ await page . waitForHeaderComponents ( )
257271
258272 // Get initial mobile-web-app-capable value
259273 const initialValue = await page . evaluate ( ( ) => {
@@ -264,8 +278,7 @@ describe('View Transitions - transition:persist on meta theme-color', () => {
264278 expect ( initialValue ) . toBe ( 'yes' )
265279
266280 // Navigate to case studies page
267- await page . navigateToPage ( '/case-studies' )
268- await page . waitForURL ( '**/case-studies' , { timeout : 5000 } )
281+ await navigateAndAwaitHydration ( page , '/case-studies' , '**/case-studies' )
269282
270283 // Get mobile-web-app-capable value after navigation
271284 const afterNavigationValue = await page . evaluate ( ( ) => {
0 commit comments