diff --git a/apps/web/e2e/core-generation.spec.ts b/apps/web/e2e/core-generation.spec.ts index da3dec340..246c5de61 100755 --- a/apps/web/e2e/core-generation.spec.ts +++ b/apps/web/e2e/core-generation.spec.ts @@ -52,7 +52,7 @@ type AssetListResponse = { test.describe("Core generation flow", () => { test.describe.configure({ timeout: 360_000 }) - test("walks through 7-step wizard and starts generation", async ({ page, request }) => { + test("walks through 6-step wizard and starts generation", async ({ page, request }) => { test.setTimeout(360_000) await routeBrowserApiToTestApi(page) @@ -214,18 +214,11 @@ test.describe("Core generation flow", () => { const titleText = `E2E Test ${suffix}` await titleInput.fill(titleText) - await page.getByRole("button", { name: "下一步" }).click() - // Step 5: preview — 前端实时预览架构改造,无需后端生成预览 - await expect(page.getByRole("heading", { name: /预览设置/ })).toBeVisible({ timeout: 15000 }) - await page.getByRole("button", { name: "下一步" }).click() - - // Step 6: cover (默认 AI 智能选帧模式,直接下一步) - await expect(page.getByRole("heading", { name: /选择封面/ })).toBeVisible({ timeout: 15000 }) - await page.getByRole("button", { name: "下一步" }).click() - - // Step 7: confirm and generate - await expect(page.getByRole("heading", { name: /确认生成/ })).toBeVisible() + // Step 4(标题+实时预览):确认生成按钮已移到标题页,点击直接创建最终渲染任务 + // 等待前端实时预览就绪(previewReady:素材已解析 + 模板已选中), + // 否则按钮会被 previewReady 校验拦截并弹 warning + await expect(page.locator(".xx-inline-video-player")).toBeVisible({ timeout: 30_000 }) // Wait for generation API to be called // 前端直接创建生成任务:POST /generation/tasks @@ -238,10 +231,10 @@ test.describe("Core generation flow", () => { { timeout: 30_000 }, ) - // Click generate button - await page.locator(".xx-btn-primary").filter({ hasText: "确认生成" }).first().click() + // 点击「确认生成视频」 + await page.locator(".xx-btn-primary").filter({ hasText: "确认生成视频" }).first().click() - // Verify generation was triggered successfully + // Verify generation was triggered const genResp = await generatePromise if (!genResp.ok()) { const body = await genResp.text() @@ -258,19 +251,42 @@ test.describe("Core generation flow", () => { } expect(genData.items.length).toBeGreaterThan(0) expect(genData.items[0].id).toBeTruthy() + + // Step 5: 确认生成页 — 任务创建成功后自动跳转,展示渲染进度 + await expect(page.getByRole("heading", { name: /确认生成/ })).toBeVisible({ + timeout: 15_000, + }) + + // Step 5 → Step 6:等待渲染终态 + // - 完成:页面出现「视频生成完成」,步骤5「下一步」按钮解锁,点击进入封面 + // - 失败:出现「生成失败」,停在确认生成页也算向导流程走通 + // - 超时未终态(测试环境 worker 可能不处理任务):进度仍在轮询,同样算走通 + const renderSucceeded = await page + .getByText("视频生成完成", { exact: false }) + .waitFor({ timeout: 180_000 }) + .then(() => true) + .catch(() => false) + if (renderSucceeded) { + // 渲染完成:手动点「下一步」进入封面步骤(渲染完不自动跳转) + await page.getByRole("button", { name: "下一步" }).click() + // Step 6: 封面(最后一步,无主按钮),仅验证页面渲染 + await expect(page.getByRole("heading", { name: /选择封面/ })).toBeVisible({ + timeout: 15_000, + }) + } else { + // 失败或超时:仍在确认生成页(进度展示或失败提示),向导流程已完整走通 + await expect(page.getByRole("heading", { name: /确认生成/ })).toBeVisible() + console.log("[E2E] 渲染任务失败或未在 180s 内完成,冒烟测试仍通过(已达确认生成页)") + } } else { console.log(`[E2E] Generate API returned ${genResp.status()}, wizard flow test still passes`) + // 创建失败时停留在标题页并展示错误提示 + await page + .getByText(/生成失败|重新生成/) + .isVisible({ timeout: 15_000 }) + .catch(() => false) } - // Generation may fail in test env (no worker), that's OK - // Just verify the flow started - check page shows generation-related UI - await page - .getByText(/生成中|生成完成|生成失败/) - .isVisible({ timeout: 15_000 }) - .catch(() => false) - // If we see progress or result, great; if not, flow still reached the end - // which is sufficient for an E2E smoke test - // Verify product library page loads (smoke: just verify page renders) await page.goto("/app/products") await expect(page).toHaveURL(/\/app\/products/)