/** * 路由初始化测试 - 验证所有下拉框都有值 * * 功能: * - 验证各个路由初始化后,模型选择下拉框和提示词模板下拉框都有选项 * - 确保数据加载正常,避免空状态 * * 测试范围: * - Basic 模式:basic-system, basic-user * - Pro 模式:pro-multi, pro-variable * - Image 模式:text2image, image2image */ import { test, expect } from '../fixtures' import { navigateToMode } from '../helpers/common' type RouteCase = { name: string mode: 'basic' | 'pro' | 'image' subMode: string hashPath: string modelLabel: RegExp templateLabel: RegExp } const ROUTES: RouteCase[] = [ { name: 'basic-system', mode: 'basic' as const, subMode: 'system' as const, hashPath: '/#/basic/system', modelLabel: /优化模型|Optimization Model/i, templateLabel: /优化提示词模板|Optimization Template/i, }, { name: 'basic-user', mode: 'basic' as const, subMode: 'user' as const, hashPath: '/#/basic/user', modelLabel: /优化模型|Optimization Model/i, templateLabel: /优化提示词模板|Optimization Template/i, }, { name: 'pro-multi', mode: 'pro' as const, subMode: 'multi' as const, hashPath: '/#/pro/multi', modelLabel: /优化模型|Optimization Model/i, templateLabel: /优化提示词模板|Optimization Template/i, }, { name: 'pro-variable', mode: 'pro' as const, subMode: 'variable' as const, hashPath: '/#/pro/variable', modelLabel: /优化模型|Optimization Model/i, templateLabel: /优化提示词模板|Optimization Template/i, }, { name: 'image-text2image', mode: 'image' as const, subMode: 'text2image' as const, hashPath: '/#/image/text2image', modelLabel: /Text Model|文本模型|优化模型|Optimization Model/i, templateLabel: /Optimization Template|优化.*模板/i, }, { name: 'image-image2image', mode: 'image' as const, subMode: 'image2image' as const, hashPath: '/#/image/image2image', modelLabel: /Text Model|文本模型|优化模型|Optimization Model/i, templateLabel: /Optimization Template|优化.*模板/i, }, ] /** * 验证下拉框有选项 * @description 检查 Naive UI Select 组件是否渲染了选项 */ async function expectSelectHasOptions(page: Parameters[0]['page'], label: RegExp): Promise { const labelNode = page.getByText(label).first() await expect(labelNode).toBeVisible({ timeout: 15000 }) // 找到包含该 label 的最近选择器容器(Naive UI NSelect 会渲染 .n-base-selection) const container = labelNode.locator( 'xpath=ancestor::*[.//div[contains(@class,"n-base-selection")]][1]' ) const select = container.locator('.n-base-selection').first() await expect(select).toBeVisible({ timeout: 15000 }) await select.click() // 有选项时会渲染 .n-base-select-option;空态会渲染 empty slot const firstOption = page.locator('.n-base-select-option').first() await expect(firstOption).toBeVisible({ timeout: 15000 }) const optionCount = await page.locator('.n-base-select-option').count() expect(optionCount).toBeGreaterThan(0) await page.keyboard.press('Escape') } test.describe('Route Initialization: 模型/模板下拉框有值', () => { for (const route of ROUTES) { test(route.name, async ({ page }) => { // ✅ 使用 navigateToMode 导航(从 / 进入,再通过 UI 切换到目标工作区) await navigateToMode(page, route.mode, route.subMode) // ✅ 验证模型和模板下拉框都加载了选项 await expectSelectHasOptions(page, route.modelLabel) await expectSelectHasOptions(page, route.templateLabel) }) } })