@@ -149,6 +149,9 @@ function waitForPort(port: number, timeout: number): Promise<void> {
149149export default async function globalSetup ( _config : FullConfig ) : Promise < void > {
150150 const extensionRoot = path . resolve ( __dirname , '..' ) ;
151151 const coreDir = path . resolve ( __dirname , '../../paranext-core' ) ;
152+ const testResultsDir = path . join ( extensionRoot , 'e2e-tests/test-results' ) ;
153+ fs . mkdirSync ( testResultsDir , { recursive : true } ) ;
154+ const rendererLogPath = path . join ( testResultsDir , 'renderer-dev-server.log' ) ;
152155
153156 // Fail fast if Platform.Bible is already running (single-instance lock will
154157 // cause Playwright's Electron instance to exit immediately)
@@ -204,9 +207,10 @@ export default async function globalSetup(_config: FullConfig): Promise<void> {
204207 console . log ( `Renderer dev server already running on port ${ RENDERER_PORT } .` ) ;
205208 } else {
206209 console . log ( 'Starting paranext-core renderer dev server...' ) ;
210+ const rendererLogFd = fs . openSync ( rendererLogPath , 'w' ) ;
207211 const devServer = spawn ( 'npm' , [ 'run' , 'start:renderer' ] , {
208212 cwd : coreDir ,
209- stdio : 'ignore' ,
213+ stdio : [ 'ignore' , rendererLogFd , rendererLogFd ] ,
210214 shell : true ,
211215 detached : true ,
212216 env : { ...process . env , ELECTRON_RUN_AS_NODE : undefined , SKIP_START_MAIN : '1' } ,
@@ -224,9 +228,20 @@ export default async function globalSetup(_config: FullConfig): Promise<void> {
224228 console . log (
225229 `Port ${ RENDERER_PORT } is accepting connections. Waiting for webpack compilation...` ,
226230 ) ;
227- // Wait for the renderer index to serve successfully so Electron does not attach during
228- // an in-progress compilation window.
229- await waitForHttpOk ( `http://127.0.0.1:${ RENDERER_PORT } /index.html` , 300_000 ) ;
231+ // Wait for webpack-dev-middleware to begin serving renderer assets before launching Electron.
232+ // In CI we degrade to a warning if this probe times out, since the dev server can still finish
233+ // compiling shortly after Electron starts.
234+ try {
235+ await waitForHttpOk ( `http://127.0.0.1:${ RENDERER_PORT } /dist/renderer.dev.js` , 120_000 ) ;
236+ } catch ( error ) {
237+ if ( ! process . env . CI ) throw error ;
238+ const message =
239+ error instanceof Error ? error . message : 'Unknown renderer readiness probe failure' ;
240+ console . warn (
241+ `Renderer HTTP readiness probe timed out in CI: ${ message } . Continuing with port-only readiness.` ,
242+ ) ;
243+ console . warn ( `Renderer dev server logs: ${ rendererLogPath } ` ) ;
244+ }
230245 console . log ( 'Renderer dev server is ready.' ) ;
231246 }
232247}
0 commit comments