const { chromium } = require('playwright-core'); const assert = require('node:assert/strict'); const path = require('node:path'); (async () => { const browser = await chromium.launch({channel:'chrome', headless:true}); try { const page = await browser.newPage({viewport:{width:1600,height:1120}}); const errors=[]; page.on('pageerror',e=>errors.push(e.message)); await page.addInitScript(()=>localStorage.setItem('huobao:tours',JSON.stringify(['episode']))); await page.route('**/api/v1/tasks',route=>route.request().method()==='POST'?route.abort():route.continue()); await page.goto('http://127.0.0.1:18950/drama/1/episode/1',{waitUntil:'networkidle'}); const close=page.locator('.driver-popover-close-btn'); if(await close.isVisible()) await close.click(); await page.getByText('视频制作',{exact:true}).first().click(); const form=page.locator('.scene-lock-panel'); try { await form.waitFor({timeout:8000}); } catch(e) { await page.screenshot({path:path.join(process.env.SCENE_FIXTURE,'ui-failure.png')}); console.log('UI:',(await page.locator('body').innerText()).slice(0,2400),errors); throw e; } assert.match(await form.innerText(),/Dormitory/); assert.match(await form.innerText(),/所有分镜共用/); await form.getByLabel('空间与固定陈设').fill('Blue plaster walls; east window; oak desk below the window.'); assert.match(await form.innerText(),/未保存/); await form.getByRole('button',{name:'保存场景设定',exact:true}).click(); await page.waitForFunction(()=>document.querySelector('.scene-lock-panel .actions')?.textContent.includes('已保存')); const value=await page.evaluate(async()=> (await (await fetch('/api/v1/storyboards/1/environment')).json()).data); assert.equal(value.current.environment,'Blue plaster walls; east window; oak desk below the window.'); assert.equal(value.stale,true); await page.reload({waitUntil:'networkidle'}); await page.getByText('视频制作',{exact:true}).first().click(); await form.waitFor(); assert.equal(await form.getByLabel('空间与固定陈设').inputValue(),'Blue plaster walls; east window; oak desk below the window.'); await form.scrollIntoViewIfNeeded(); await page.screenshot({path:path.join(process.env.SCENE_FIXTURE,'scene-lock-ui.png')}); await page.setViewportSize({width:1280,height:850}); assert.equal(await form.evaluate(e=>e.scrollWidth<=e.clientWidth+2),true); assert.deepEqual(errors,[]); console.log('PASS: scene panel, shared setting save, stale version warning, reload persistence, narrow layout; no real generation'); } finally {await browser.close();} })().catch(e=>{console.error(e.stack);process.exit(1)});