40 lines
3.0 KiB
JavaScript
40 lines
3.0 KiB
JavaScript
const {chromium}=require('playwright-core'),assert=require('node:assert/strict');
|
||
(async()=>{
|
||
const browser=await chromium.launch({channel:'chrome',headless:true});
|
||
try {
|
||
const page=await browser.newPage({viewport:{width:1600,height:1100}}),errors=[];
|
||
page.on('pageerror',e=>errors.push(e.message));
|
||
await page.addInitScript(()=>localStorage.setItem('huobao:tours',JSON.stringify(['episode'])));
|
||
let phase='sampling';
|
||
await page.route('**/api/**',async route=>{
|
||
if(!['GET','HEAD'].includes(route.request().method()))return route.abort();
|
||
if(route.request().url().includes('/generation-tasks')){
|
||
const response=await route.fetch(),body=await response.json();
|
||
const task=body.data.tasks.find(t=>t.id===237);assert.ok(task);
|
||
const progress={phase,observedAt:Date.now(),historySamples:3,historyMinSeconds:1200,historyMaxSeconds:1800,
|
||
...(phase==='sampling'?{step:8,totalSteps:20,stepUpdatedAt:Date.now(),samplingMinSeconds:600,samplingMaxSeconds:900}:{}),
|
||
...(phase==='queued'?{queueAhead:2,queuePosition:2}:{})};
|
||
if(phase==='stale'){progress.phase='sampling';progress.observedAt=Date.now()-120000}
|
||
task.status='processing';task.stage=['queued','downloading'].includes(phase)?phase:'running';task.params=JSON.stringify({...JSON.parse(task.params||'{}'),progress});
|
||
return route.fulfill({response,json:body});
|
||
}
|
||
return route.continue();
|
||
});
|
||
async function open(){
|
||
await page.goto('http://127.0.0.1:18938/drama/6/episode/1',{waitUntil:'networkidle'});
|
||
await page.getByText('视频制作',{exact:true}).first().click();
|
||
const panel=page.locator('.video-task-inspector .task-progress');await panel.waitFor();return panel;
|
||
}
|
||
let panel=await open();let text=await panel.innerText();
|
||
assert.match(text,/8 \/ 20 步/);assert.match(text,/采样预计还需约 10–15 分钟/);
|
||
assert.match(text,/后续解码、编码和保存另计/);assert.match(text,/同显卡、同规格通常耗时约 20–30 分钟/);
|
||
await panel.scrollIntoViewIfNeeded();await page.screenshot({path:'D:/web/dj/integration-work/progress-ui-sampling.png'});
|
||
await page.setViewportSize({width:1280,height:850});assert.equal(await panel.evaluate(e=>e.scrollWidth<=e.clientWidth+2),true);
|
||
phase='queued';panel=await open();assert.match(await panel.innerText(),/前面还有 2 个任务/);
|
||
phase='decoding';panel=await open();assert.match(await panel.innerText(),/解码中/);assert.equal(await panel.locator('progress').count(),0);
|
||
phase='stale';panel=await open();assert.match(await panel.innerText(),/进度更新暂时延迟/);assert.doesNotMatch(await panel.innerText(),/采样预计还需/);
|
||
phase='downloading';panel=await open();assert.match(await panel.innerText(),/视频生成已结束/);assert.doesNotMatch(await panel.innerText(),/采样预计还需|读取显卡进度/);
|
||
assert.deepEqual(errors,[]);console.log('PASS: sampling-only ETA, exact-spec history, queue count, decoding, stale suppression, 1280px layout; no writes');
|
||
}finally{await browser.close()}
|
||
})().catch(e=>{console.error(e.stack);process.exit(1)});
|