| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /**
- * ================================================================
- * 场景:DAN 测评服务商体系全流程 E2E 测试
- * ================================================================
- * 用户故事:
- * - 管理员:创建和管理服务商(测评/解读/规划)
- * - 家长:购买测评服务、查看 AI 解读、获取规划方案
- *
- * 前置条件:服务已部署到 cfc.iwintrue.com,功能可用
- * 运行:npx playwright test tests/e2e/dan-assessment-vendor-flow.spec.js
- * ================================================================
- */
- const { test, expect } = require('@playwright/test');
- const BASE = 'http://cfc.iwintrue.com';
- /**
- * 截图辅助函数
- */
- async function screenshot(page, name) {
- await page.screenshot({ path: `test-artifacts/${name}.png`, fullPage: true }).catch(() => {});
- }
- /**
- * 通用填充函数:尝试多种选择器
- */
- async function fillField(page, selectors, value) {
- for (const sel of selectors) {
- try {
- const el = page.locator(sel).first();
- if (await el.isVisible({ timeout: 2000 })) {
- await el.fill(value);
- return true;
- }
- } catch {
- // try next
- }
- }
- return false;
- }
- /**
- * 通用点击函数:尝试多种选择器
- */
- async function clickButton(page, selectors) {
- for (const sel of selectors) {
- try {
- const el = page.locator(sel).first();
- if (await el.isVisible({ timeout: 2000 })) {
- await el.click();
- return true;
- }
- } catch {
- // try next
- }
- }
- return false;
- }
- test.describe('【场景流程】DAN 测评服务商体系', () => {
- test('[场景 1] 管理员创建测评服务商 - 期望创建并审核通过', async ({ page }) => {
- const url = `${BASE}/#/pages/admin/vendor-review`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene1-vendor-review');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- // 检查页面是否包含预期的元素
- const content = await page.textContent('body').catch(() => '');
- const hasVendorFeature = content.includes('vendor') || content.includes('服务商') || content.includes('服务') || content.includes('审核');
- if (!hasVendorFeature) {
- test.skip();
- return;
- }
- // 尝试创建服务商
- await fillField(page, ['input[name="phone"]', '.phone-input', 'input'], '139' + String(Date.now()).slice(-8));
- await fillField(page, ['input[name="nickname"]', '.name-input', 'input[placeholder*="昵称"]'], '测评服务商_' + Date.now());
- const selectors = ['select[name="vendorType"]', '.vendor-type-picker', 'select'];
- for (const sel of selectors) {
- try {
- const el = page.locator(sel).first();
- if (await el.isVisible({ timeout: 1000 })) {
- await el.selectOption('assessment_provider');
- break;
- }
- } catch {
- // try next
- }
- }
- await clickButton(page, ['.submit-btn', '.save-btn', '.el-button--primary', 'button[type="submit"]']);
- await page.waitForTimeout(2000);
- await screenshot(page, 'dan-scene1-result');
- // 检查创建结果
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 2] 管理员创建解读服务商 - 期望创建并审核通过', async ({ page }) => {
- const url = `${BASE}/#/pages/admin/user-create`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene2-create-page');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- await fillField(page, ['input[name="phone"]', '.phone-input', 'input'], '139' + String(Date.now()).slice(-8));
- await fillField(page, ['input[name="nickname"]', '.name-input', 'input[placeholder*="昵称"]'], '解读服务商_' + Date.now());
- const selectors = ['select[name="vendorType"]', '.vendor-type-picker', 'select'];
- for (const sel of selectors) {
- try {
- const el = page.locator(sel).first();
- if (await el.isVisible({ timeout: 1000 })) {
- await el.selectOption('interpretation_provider');
- break;
- }
- } catch {
- // try next
- }
- }
- await clickButton(page, ['.submit-btn', '.save-btn', '.el-button--primary', 'button[type="submit"]']);
- await page.waitForTimeout(2000);
- await screenshot(page, 'dan-scene2-result');
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 3] 管理员创建规划服务商 - 期望创建并审核通过', async ({ page }) => {
- const url = `${BASE}/#/pages/admin/user-create`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene3-create-page');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- await fillField(page, ['input[name="phone"]', '.phone-input', 'input'], '139' + String(Date.now()).slice(-8));
- await fillField(page, ['input[name="nickname"]', '.name-input', 'input[placeholder*="昵称"]'], '规划服务商_' + Date.now());
- const selectors = ['select[name="vendorType"]', '.vendor-type-picker', 'select'];
- for (const sel of selectors) {
- try {
- const el = page.locator(sel).first();
- if (await el.isVisible({ timeout: 1000 })) {
- await el.selectOption('planner');
- break;
- }
- } catch {
- // try next
- }
- }
- await clickButton(page, ['.submit-btn', '.save-btn', '.el-button--primary', 'button[type="submit"]']);
- await page.waitForTimeout(2000);
- await screenshot(page, 'dan-scene3-result');
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 4] 家长购买测评服务 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/apply`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene4-apply');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- // 确认页面加载
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 5] 测评服务商录入测评结果 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/record`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene5-record');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 6] AI 自动生成解读报告 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/ai-report`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene6-ai-report');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 7] 解读服务商人录入解读补充 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/manual-review`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene7-manual');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 8] 规划服务商制定成长方案 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/growth-plan`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene8-growth');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 9] 家长查看完整报告和方案 - 期望页面可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/report`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene9-report');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- test('[场景 10] DAN 测评服务商完整流程 - 期望首页可加载', async ({ page }) => {
- const url = `${BASE}/#/pages/assessment/index`;
- const resp = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }).catch(() => null);
- await screenshot(page, 'dan-scene10-index');
- if (!resp || resp.status() >= 400) {
- test.skip();
- return;
- }
- const bodyText = await page.textContent('body').catch(() => '');
- expect(bodyText.length).toBeGreaterThan(0);
- });
- });
|