11// Control UI tests cover sessions behavior.
2- import { chromium , type Browser , type Page } from "playwright" ;
3- import { describe , expect , it } from "vitest" ;
2+ import { chromium , type Browser , type BrowserContext , type Page } from "playwright" ;
3+ import { afterAll , beforeAll , describe , expect , it } from "vitest" ;
44import { readStyleSheet } from "../../../../test/helpers/ui-style-fixtures.js" ;
55import {
66 canRunPlaywrightChromium ,
@@ -20,7 +20,7 @@ const describeBrowserLayout = canRunPlaywrightChromium(chromiumExecutablePath)
2020 : describe . skip ;
2121
2222type BrowserFixture = {
23- browser : Browser ;
23+ context : BrowserContext ;
2424 page : Page ;
2525} ;
2626
@@ -163,30 +163,43 @@ function sessionsTableHtml() {
163163 ` ;
164164}
165165
166- async function openFixture ( width : number , height : number ) : Promise < BrowserFixture > {
167- const browser = await chromium . launch ( { executablePath : chromiumExecutablePath , headless : true } ) ;
166+ async function openFixture (
167+ browser : Browser ,
168+ width : number ,
169+ height : number ,
170+ ) : Promise < BrowserFixture > {
171+ const context = await browser . newContext ( { viewport : { width, height } } ) ;
168172 let page : Page | undefined ;
169173 try {
170- page = await browser . newPage ( { viewport : { width , height } } ) ;
174+ page = await context . newPage ( ) ;
171175 await page . setContent (
172176 `<!doctype html><html><head><style>${ readUiCss ( ) } </style></head><body>${ sessionsTableHtml ( ) } </body></html>` ,
173177 ) ;
174- return { browser , page } ;
178+ return { context , page } ;
175179 } catch ( error ) {
176- await page ?. close ( ) . catch ( ( ) => { } ) ;
177- await browser . close ( ) . catch ( ( ) => { } ) ;
180+ await context . close ( ) . catch ( ( ) => { } ) ;
178181 throw error ;
179182 }
180183}
181184
182185async function closeFixture ( fixture : BrowserFixture ) : Promise < void > {
183- await fixture . page . close ( ) . catch ( ( ) => { } ) ;
184- await fixture . browser . close ( ) . catch ( ( ) => { } ) ;
186+ await fixture . context . close ( ) . catch ( ( ) => { } ) ;
185187}
186188
187- describeBrowserLayout . concurrent ( "sessions responsive browser layout" , ( ) => {
189+ describeBrowserLayout ( "sessions responsive browser layout" , ( ) => {
190+ let browser : Browser ;
191+
192+ beforeAll ( async ( ) => {
193+ // Browser startup dominates this suite; fresh contexts keep viewport state isolated.
194+ browser = await chromium . launch ( { executablePath : chromiumExecutablePath , headless : true } ) ;
195+ } ) ;
196+
197+ afterAll ( async ( ) => {
198+ await browser ?. close ( ) . catch ( ( ) => { } ) ;
199+ } ) ;
200+
188201 it . each ( VIEWPORTS ) ( "keeps the session roster visible at %dx%d" , async ( width , height ) => {
189- const fixture = await openFixture ( width , height ) ;
202+ const fixture = await openFixture ( browser , width , height ) ;
190203 const { page } = fixture ;
191204 try {
192205 const metrics = await page . evaluate ( ( ) => {
0 commit comments