49 lines
3.2 KiB
JavaScript
49 lines
3.2 KiB
JavaScript
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=[], submissions=[];
|
|
page.on('pageerror',e=>errors.push(e.message));
|
|
page.on('dialog',d=>d.accept());
|
|
await page.addInitScript(()=>localStorage.setItem('huobao:tours',JSON.stringify(['episode'])));
|
|
await page.route('**/api/v1/tasks',async route=>{
|
|
if(route.request().method()!=='POST') return route.continue();
|
|
submissions.push(route.request().postDataJSON());
|
|
// Inspect actual browser payload without starting a generation even in this test fixture.
|
|
await route.fulfill({status:400,contentType:'application/json',body:JSON.stringify({message:'测试拦截:未提交模型'})});
|
|
});
|
|
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();
|
|
await page.locator('.video-task-row').filter({hasText:'Reference fixture'}).click();
|
|
const model=page.locator('.video-inspector-settings .model-select').filter({hasText:'当前镜头模型'});
|
|
await model.getByRole('button').click();
|
|
await page.locator('.model-select-option-name').filter({hasText:/^LTX-2\.3 ·/}).click();
|
|
const hint=page.getByTestId('shot-reference-limit');
|
|
await hint.waitFor();
|
|
assert.match(await hint.innerText(),/全部 3 个绑定素材/);
|
|
await page.locator('.video-inspector-action').click();
|
|
await page.waitForFunction(()=>!document.querySelector('.video-inspector-action').disabled);
|
|
assert.equal(submissions.length,1);
|
|
assert.equal(submissions[0].model,'LTX-2.3');
|
|
assert.deepEqual(submissions[0].reference_image_urls,['static/images/scene.png','static/images/girl.png','static/images/other.png']);
|
|
assert.equal(submissions[0].prompt,'0-4s: @Dormitory, @Girl looks at @Other.');
|
|
await hint.scrollIntoViewIfNeeded();
|
|
await page.screenshot({path:path.join(process.env.SCENE_FIXTURE,'ltx-reference-ui.png')});
|
|
// Per-shot switch back restores all bound images; the episode default stays H3 throughout.
|
|
await model.getByRole('button').click();
|
|
await page.locator('.model-select-option-name').filter({hasText:/^MiniMax-H3 ·/}).click();
|
|
await page.locator('.video-inspector-action').click();
|
|
await page.waitForFunction(()=>!document.querySelector('.video-inspector-action').disabled);
|
|
assert.equal(submissions.length,2);
|
|
assert.deepEqual(submissions[1].reference_image_urls,['static/images/scene.png','static/images/girl.png','static/images/other.png']);
|
|
assert.equal(submissions[1].prompt,'0-4s: @图片1Dormitory, @图片2Girl looks at @图片3Other.');
|
|
assert.deepEqual(errors,[]);
|
|
console.log('PASS: LTX sends all 3 bindings for first-frame composition, H3 retains direct refs; no model jobs');
|
|
} finally {await browser.close();}
|
|
})().catch(e=>{console.error(e.stack);process.exit(1)});
|