import { createServer } from 'vite' import { build } from 'esbuild' import { _electron as electron,expect } from '@playwright/test' import electronPath from 'electron' import path from 'node:path' import fs from 'node:fs/promises' for(const entry of ['index','preload'])await build({entryPoints:['src/main/'+entry+'.ts'],outfile:'dist/main/'+entry+'.cjs',bundle:true,platform:'node',format:'cjs',external:['electron'],sourcemap:true}) const server=await createServer({server:{host:'127.0.0.1',port:5174,strictPort:true}}) await server.listen() const profile=path.join(process.cwd(),'.qa','dev-window-profile') await fs.mkdir(profile,{recursive:true}) const env={...process.env,ELECTRON_RENDERER_URL:'http://127.0.0.1:5174'} delete env.ELECTRON_RUN_AS_NODE let desktop try{ desktop=await electron.launch({executablePath:electronPath,args:['.','--user-data-dir='+profile],cwd:process.cwd(),env,timeout:30000}) const page=await desktop.firstWindow();page.setDefaultTimeout(15000) await expect(page.getByText('把表格交给收据工坊')).toBeVisible({timeout:30000}) expect(await page.evaluate(()=>typeof window.receipts?.importExcel)).toBe('function') expect(await desktop.evaluate(({BrowserWindow})=>BrowserWindow.getAllWindows()[0].isVisible())).toBe(true) await desktop.evaluate(({BrowserWindow})=>{const w=BrowserWindow.getAllWindows().find(w=>w.webContents.getURL().includes('/index.html'));w.focus();w.webContents.sendInputEvent({type:'keyDown',keyCode:'F12'});w.webContents.sendInputEvent({type:'keyUp',keyCode:'F12'})}) await expect.poll(()=>desktop.evaluate(({BrowserWindow})=>BrowserWindow.getAllWindows().find(w=>w.webContents.getURL().includes('/index.html'))?.webContents.isDevToolsOpened())).toBe(true) await desktop.evaluate(({BrowserWindow})=>BrowserWindow.getAllWindows().find(w=>w.webContents.getURL().includes('/index.html'))?.webContents.closeDevTools()) await fs.writeFile('.qa/dev-window-result.json',JSON.stringify({passed:true,visible:true,rendererReady:true,desktopApi:true,f12:true},null,2)) console.log('Development window verified: visible, ready, desktop bridge and F12.') }finally{if(desktop)await desktop.close();await server.close()}