diff --git a/apps/web/e2e/core-generation.spec.ts b/apps/web/e2e/core-generation.spec.ts index c94dcec9b..a4a09953e 100755 --- a/apps/web/e2e/core-generation.spec.ts +++ b/apps/web/e2e/core-generation.spec.ts @@ -265,8 +265,21 @@ test.describe("Core generation flow", () => { await expect(page.getByText("视频渲染中")).toBeVisible({ timeout: 30_000 }) // 等待渲染完成:进度卡变为「视频生成完成」(最长等待 3 分钟) - // 冒烟测试通过即代表主链路(素材→数量弹窗→配音→标题→确认生成→渲染完成)可用 await expect(page.getByText("视频生成完成")).toBeVisible({ timeout: 180_000 }) + + // #1954 修复:生成完成后步骤4底部应显示「下一步:选择封面」按钮,点击进入步骤5封面页 + const nextCoverBtn = page + .locator(".xx-step-actions .xx-btn-primary") + .filter({ hasText: "下一步:选择封面" }) + await expect(nextCoverBtn).toBeVisible({ timeout: 10_000 }) + await nextCoverBtn.click() + + // 断言进入步骤5:步骤条应高亮「选择封面」,主内容出现「🖼️ 选择封面」标题 + await expect(page.getByRole("heading", { name: "🖼️ 选择封面" })).toBeVisible({ + timeout: 10_000, + }) + // 主按钮应消失(封面是最后一步),仅保留「← 上一步」 + await expect(page.locator(".xx-step-actions .xx-btn-primary")).toHaveCount(0) } else { console.log(`[E2E] Generate API returned ${genResp.status()}, wizard flow test still passes`) // 创建失败时停留在标题页并展示错误提示 diff --git a/apps/web/src/pages/generate/components/GenerateStepActions.tsx b/apps/web/src/pages/generate/components/GenerateStepActions.tsx index 2f436814a..2f6c5660b 100644 --- a/apps/web/src/pages/generate/components/GenerateStepActions.tsx +++ b/apps/web/src/pages/generate/components/GenerateStepActions.tsx @@ -1,11 +1,11 @@ /** - * GeneratePage 步骤底部操作按钮(Issue #1677 修正:固定 6 步) - * v2: 步骤4 按钮前显示本次积分消耗;积分不足时禁用按钮并提示充值 + * GeneratePage 步骤底部操作按钮(5 步向导:素材→配音→标题→确认生成→封面) + * v3: 修复 #1954 off-by-one —— 步骤4 单视频/批量生成完成后正确显示「下一步:选择封面」 * * 步骤 1~3:上一步 / 下一步 - * 步骤 4(选择标题):「✨ 确认生成视频 / 确认生成 N 个视频」→ 创建正式生成任务,成功后跳步骤5 - * 步骤 5(确认生成):渲染进度页,全部完成后「下一步:选择封面」;仅上一步 - * 步骤 6(选择封面):仅上一步 + * 步骤 4(确认生成/进度):未开始 →「✨ 确认生成视频」;生成中 →「⏳ 视频渲染中…」; + * 失败 →「🔄 重新生成」;全部完成 →「下一步:选择封面 →」 + * 步骤 5(选择封面):仅上一步,无主按钮 */ import React from "react" import { Tooltip } from "antd" @@ -22,14 +22,13 @@ export interface GenerateStepActionsProps { generateError: string | null /** 批量模式下勾选的视频数量(N=1 时为1) */ selectedCount?: number - // v2: 积分相关 /** 本次预估消耗积分 */ estimatedCost?: number /** 是否积分不足 */ pointsInsufficient?: boolean /** 积分不足原因 */ insufficientReason?: string - /** 剩余免费混剪次数 */ + /** 本次使用的免费混剪次数 */ freeClipsUsedThisTime?: number /** 前往充值 */ onRecharge?: () => void @@ -60,8 +59,17 @@ const GenerateStepActions: React.FC = ({ ) } - /* 步骤 4:选择标题 — 确认生成 */ + /* 步骤 4:确认生成 / 进度 / 完成进封面 */ if (currentStep === 4) { + // #1954 修复:单视频/批量 全部生成完成后显示「下一步:选择封面」 + if (generated && !generating && !generateError) { + return ( + + ) + } + const costTag = typeof estimatedCost === "number" && estimatedCost > 0 ? ( @@ -118,23 +126,7 @@ const GenerateStepActions: React.FC = ({ ) } - /* 步骤 5:确认生成进度页 — 全部完成后下一步进封面 */ - if (currentStep === 5) { - if (generated) { - return ( - - ) - } - return ( - - ) - } - - /* 步骤 6(封面,最后一步):无主按钮 */ + /* 步骤 5(封面,最后一步):无主按钮 */ return null }