diff --git a/frontend/cypress/e2e/demo-walkthrough.cy.js b/frontend/cypress/e2e/demo-walkthrough.cy.js index c7b9ec0..ad9c2c2 100644 --- a/frontend/cypress/e2e/demo-walkthrough.cy.js +++ b/frontend/cypress/e2e/demo-walkthrough.cy.js @@ -5,7 +5,7 @@ describe('doTERRA 精油配方计算器 - 功能演示', () => { cy.getAdminToken().then(token => { adminToken = token }) }) - it('完整功能演示', { defaultCommandTimeout: 15000 }, () => { + it('完整功能演示', { defaultCommandTimeout: 20000 }, () => { // ===== 开场:首页加载 ===== cy.visit('/', { onBeforeLoad(win) { @@ -16,22 +16,22 @@ describe('doTERRA 精油配方计算器 - 功能演示', () => { cy.wait(1000) // ===== 配方卡片列表 ===== - cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) + cy.get('.recipe-card', { timeout: 15000 }).should('have.length.gte', 1) cy.wait(500) // ===== 搜索框输入 ===== - cy.get('input[placeholder*="搜索"]').click() + cy.get('input[placeholder*="搜索"]').should('be.visible').click() cy.get('input[placeholder*="搜索"]').type('薰衣草', { delay: 100 }) cy.wait(500) cy.get('input[placeholder*="搜索"]').clear() cy.wait(500) // ===== 点击配方卡片 ===== - cy.get('.recipe-card').first().click() + cy.get('.recipe-card', { timeout: 10000 }).first().click() cy.wait(1000) // ===== 查看详情 ===== - cy.get('[class*="overlay"], [class*="detail"]').should('be.visible') + cy.get('[class*="overlay"], [class*="detail"]', { timeout: 10000 }).should('be.visible') cy.get('.detail-close-btn').first().click({ force: true }) cy.wait(500) diff --git a/frontend/cypress/e2e/diary-flow.cy.js b/frontend/cypress/e2e/diary-flow.cy.js index 0d52940..8bd41f2 100644 --- a/frontend/cypress/e2e/diary-flow.cy.js +++ b/frontend/cypress/e2e/diary-flow.cy.js @@ -185,15 +185,16 @@ describe('Diary Flow', () => { cy.contains('我的账户').should('be.visible') }) - it('diary grid is visible on diary tab', () => { + it('brand tab content is visible by default', () => { cy.visit('/mydiary', { onBeforeLoad(win) { win.localStorage.setItem('oil_auth_token', adminToken) } }) cy.get('.my-diary', { timeout: 10000 }).should('exist') - // Diary grid or empty hint should be present - cy.get('.diary-grid, .empty-hint').should('exist') + // Default tab is brand; section card with upload areas should be present + cy.get('.section-card, .sub-tab.active', { timeout: 10000 }).should('exist') + cy.get('.sub-tab.active').should('contain', '我的品牌') }) }) diff --git a/frontend/cypress/e2e/manage-recipes.cy.js b/frontend/cypress/e2e/manage-recipes.cy.js index 8485ba1..7cdf71c 100644 --- a/frontend/cypress/e2e/manage-recipes.cy.js +++ b/frontend/cypress/e2e/manage-recipes.cy.js @@ -13,6 +13,9 @@ describe('Manage Recipes Page', () => { }) // Wait for the recipe manager to load cy.get('.recipe-manager', { timeout: 10000 }).should('exist') + // Expand the public recipes section by clicking its title + cy.contains('公共配方库', { timeout: 10000 }).should('be.visible').click() + cy.get('.recipe-row', { timeout: 10000 }).should('have.length.gte', 1) }) it('loads and shows recipe lists', () => { diff --git a/frontend/cypress/e2e/performance.cy.js b/frontend/cypress/e2e/performance.cy.js index 1555ebb..d96244e 100644 --- a/frontend/cypress/e2e/performance.cy.js +++ b/frontend/cypress/e2e/performance.cy.js @@ -25,11 +25,12 @@ describe('Performance', () => { it('search filtering is near-instant', () => { cy.visit('/') + cy.get('.recipe-card, .empty-hint', { timeout: 10000 }).should('exist') cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) const start = Date.now() cy.get('input[placeholder*="搜索"]').type('薰衣草') cy.wait(300) - cy.get('.recipe-card').should('exist') + cy.get('.recipe-card, .empty-hint').should('exist') cy.then(() => { expect(Date.now() - start).to.be.lt(2000) }) diff --git a/frontend/cypress/e2e/pr27-features.cy.js b/frontend/cypress/e2e/pr27-features.cy.js index d728c0d..da012d2 100644 --- a/frontend/cypress/e2e/pr27-features.cy.js +++ b/frontend/cypress/e2e/pr27-features.cy.js @@ -276,8 +276,8 @@ describe('PR27 Feature Tests', () => { describe('UI: RecipeManager login prompt', () => { it('shows login prompt when not logged in', () => { cy.clearLocalStorage() - cy.visit('/#/manage') - cy.contains('登录后可管理配方').should('be.visible') + cy.visit('/manage') + cy.contains('登录后可管理配方', { timeout: 10000 }).should('be.visible') cy.contains('登录 / 注册').should('be.visible') }) }) diff --git a/frontend/cypress/e2e/recipe-search.cy.js b/frontend/cypress/e2e/recipe-search.cy.js index 36d7ba8..7229df8 100644 --- a/frontend/cypress/e2e/recipe-search.cy.js +++ b/frontend/cypress/e2e/recipe-search.cy.js @@ -2,7 +2,7 @@ describe('Recipe Search', () => { beforeEach(() => { cy.visit('/') // Wait for recipes to load - cy.get('.recipe-card, .empty-state', { timeout: 10000 }).should('exist') + cy.get('.recipe-card, .empty-hint', { timeout: 10000 }).should('exist') }) it('displays recipe cards in the grid', () => { @@ -27,14 +27,13 @@ describe('Recipe Search', () => { }) it('clears search and restores all recipes', () => { + cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) cy.get('input[placeholder*="搜索"]').type('薰衣草') cy.wait(500) - cy.get('.recipe-card').then($filtered => { - const filteredCount = $filtered.length - cy.get('input[placeholder*="搜索"]').clear() - cy.wait(500) - cy.get('.recipe-card').should('have.length.gte', filteredCount) - }) + cy.get('.recipe-card, .empty-hint', { timeout: 10000 }).should('exist') + cy.get('input[placeholder*="搜索"]').clear() + cy.wait(500) + cy.get('.recipe-card', { timeout: 10000 }).should('have.length.gte', 1) }) it('opens recipe detail when clicking a card', () => {