From 259b790309142c8297cb2739c94c843f7b8eec7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Fri, 13 Mar 2026 13:35:10 +0800 Subject: [PATCH] fix: update E2E test selectors and improve login stability - Fix selectors to use config keys instead of Chinese labels - Add page load waiting and element visibility checks - Improve global setup with better error handling - Update all config-linkage tests with correct selectors --- e2e/global-setup.ts | 7 ++++++- e2e/src/tests/config-linkage/config-params.spec.ts | 12 ++++++------ e2e/src/tests/config-linkage/config-toggle.spec.ts | 6 +++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/e2e/global-setup.ts b/e2e/global-setup.ts index 53319d0..444c508 100644 --- a/e2e/global-setup.ts +++ b/e2e/global-setup.ts @@ -16,7 +16,12 @@ async function globalSetup(config: FullConfig) { console.log('📝 访问登录页面...'); await page.goto(`${env.baseURL}/admin/login`, { waitUntil: 'networkidle' }); + console.log('⏳ 等待页面加载...'); + await page.waitForLoadState('domcontentloaded', { timeout: 10000 }); + await page.waitForTimeout(2000); + console.log('🔑 填写登录信息...'); + await page.waitForSelector('#email', { timeout: 10000 }); await page.locator('#email').fill('admin@novalon.cn'); await page.locator('#password').fill('admin123456'); @@ -32,7 +37,7 @@ async function globalSetup(config: FullConfig) { } catch (error) { console.log('❌ 登录超时,当前URL:', page.url()); console.log('📸 截图保存...'); - await page.screenshot({ path: 'test-results/login-failure.png' }); + await page.screenshot({ path: 'test-results/login-failure.png', fullPage: true }); throw error; } diff --git a/e2e/src/tests/config-linkage/config-params.spec.ts b/e2e/src/tests/config-linkage/config-params.spec.ts index 6475353..3ed6a8f 100644 --- a/e2e/src/tests/config-linkage/config-params.spec.ts +++ b/e2e/src/tests/config-linkage/config-params.spec.ts @@ -17,7 +17,7 @@ test.describe('前后台配置参数测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const newsConfig = adminPage.locator('text=新闻模块配置').locator('..').locator('..'); + const newsConfig = adminPage.locator('text=feature_news').locator('..').locator('..'); await newsConfig.locator('input[type="number"]').fill('2'); await newsConfig.locator('button:has-text("保存")').click(); @@ -60,7 +60,7 @@ test.describe('前后台配置参数测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const newsConfig = adminPage.locator('text=新闻模块配置').locator('..').locator('..'); + const newsConfig = adminPage.locator('text=feature_news').locator('..').locator('..'); const categoriesTextarea = newsConfig.locator('textarea'); await categoriesTextarea.fill('公司新闻\n产品发布'); @@ -99,7 +99,7 @@ test.describe('前后台配置参数测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const newsConfig = adminPage.locator('text=新闻模块配置').locator('..').locator('..'); + const newsConfig = adminPage.locator('text=feature_news').locator('..').locator('..'); await newsConfig.locator('select').selectOption('desc'); await newsConfig.locator('button:has-text("保存")').click(); @@ -142,7 +142,7 @@ test.describe('前后台配置参数测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const productsConfig = adminPage.locator('text=产品模块配置').locator('..').locator('..'); + const productsConfig = adminPage.locator('text=feature_products').locator('..').locator('..'); await productsConfig.locator('text=showPricing').locator('..').locator('input[type="checkbox"]').check(); await productsConfig.locator('button:has-text("保存")').click(); @@ -182,9 +182,9 @@ test.describe('前后台配置参数测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const productsConfig = adminPage.locator('text=产品模块配置').locator('..').locator('..'); + const productsConfig = adminPage.locator('text=feature_products').locator('..').locator('..'); - const featuredProductsTextarea = productsConfig.locator('text=featuredProducts').locator('..').locator('textarea'); + const featuredProductsTextarea = productsConfig.locator('textarea'); await featuredProductsTextarea.fill('erp'); await productsConfig.locator('button:has-text("保存")').click(); await adminPage.waitForSelector('text=保存成功', { timeout: 5000 }); diff --git a/e2e/src/tests/config-linkage/config-toggle.spec.ts b/e2e/src/tests/config-linkage/config-toggle.spec.ts index 429818b..20d76df 100644 --- a/e2e/src/tests/config-linkage/config-toggle.spec.ts +++ b/e2e/src/tests/config-linkage/config-toggle.spec.ts @@ -17,7 +17,7 @@ test.describe('前后台配置联动测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const servicesConfig = adminPage.locator('text=服务模块配置').locator('..').locator('..'); + const servicesConfig = adminPage.locator('text=feature_services').locator('..').locator('..'); await servicesConfig.locator('input[type="checkbox"]').first().check(); await servicesConfig.locator('button:has-text("保存")').click(); await adminPage.waitForSelector('text=保存成功', { timeout: 5000 }); @@ -53,7 +53,7 @@ test.describe('前后台配置联动测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const productsConfig = adminPage.locator('text=产品模块配置').locator('..').locator('..'); + const productsConfig = adminPage.locator('text=feature_products').locator('..').locator('..'); await productsConfig.locator('input[type="checkbox"]').first().check(); await productsConfig.locator('button:has-text("保存")').click(); await adminPage.waitForSelector('text=保存成功', { timeout: 5000 }); @@ -89,7 +89,7 @@ test.describe('前后台配置联动测试', () => { await adminPage.goto('/admin/settings'); await adminPage.waitForLoadState('networkidle'); - const newsConfig = adminPage.locator('text=新闻模块配置').locator('..').locator('..'); + const newsConfig = adminPage.locator('text=feature_news').locator('..').locator('..'); await newsConfig.locator('input[type="checkbox"]').first().check(); await newsConfig.locator('button:has-text("保存")').click(); await adminPage.waitForSelector('text=保存成功', { timeout: 5000 });