From e22a0b8d9a423168b84b2560d34f1ebd06f1ede2 Mon Sep 17 00:00:00 2001 From: HZX <2188522595@qq.com> Date: Fri, 7 Nov 2025 07:11:56 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E6=96=87=E4=B9=A6?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=B5=8B=E8=AF=95=E6=9C=80=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 文书管理测试最新 | 470 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 470 insertions(+) create mode 100644 文书管理测试最新 diff --git a/文书管理测试最新 b/文书管理测试最新 new file mode 100644 index 0000000..03fe7c1 --- /dev/null +++ b/文书管理测试最新 @@ -0,0 +1,470 @@ +import { test, expect } from '@playwright/test'; +import * as fs from 'fs'; +import * as path from 'path'; + +test('test', async ({ page }) => { + test.setTimeout(600000); // 设置超时时间为10分钟,因为有多个 AI 生成步骤和长时间等待 + + // 错误收集数组 + const errors: { step: string; error: string; timestamp: string; pageUrl: string }[] = []; + + // 登录信息(用于报告) + const loginInfo = { + email: 'xdf.admin@applify.ai', + password: 'b9#0!;+{Tx4649op' + }; + + // 辅助函数:执行步骤并捕获错误 + const executeStep = async (stepName: string, stepFunction: () => Promise) => { + try { + console.log(`\n[执行] ${stepName}`); + await stepFunction(); + console.log(`[成功] ${stepName}`); + } catch (error) { + // 提取简洁的错误信息,去掉技术细节 + let errorMessage = error instanceof Error ? error.message : String(error); + + // 清理错误信息:只保留第一行主要错误,去掉 Call log 等技术细节 + const firstLine = errorMessage.split('\n')[0]; + const cleanError = firstLine.replace(/\s+\(.*?\)/, '').trim(); + + const timestamp = new Date().toISOString(); + const pageUrl = page.url(); // 获取出错时的页面URL + + errors.push({ step: stepName, error: cleanError, timestamp, pageUrl }); + console.error(`[失败] ${stepName}: ${cleanError}`); + console.error(`[页面URL] ${pageUrl}`); + // 继续执行下一步,不中断测试流程 + } + }; + + // 步骤1: 访问首页并登录 + await executeStep('访问首页', async () => { + await page.goto('https://pre.prodream.cn/en'); + await expect(page.getByRole('button', { name: 'Log in' })).toBeVisible(); + }); + + await executeStep('点击登录按钮', async () => { + await page.getByRole('button', { name: 'Log in' }).click(); + await expect(page.getByRole('textbox', { name: 'Email Address' })).toBeVisible(); + }); + + await executeStep('输入登录信息', async () => { + await page.getByRole('textbox', { name: 'Email Address' }).click(); + await page.getByRole('textbox', { name: 'Email Address' }).fill('xdf.admin@applify.ai'); + await page.getByRole('textbox', { name: 'Psssword' }).click(); + await page.getByRole('textbox', { name: 'Psssword' }).fill('b9#0!;+{Tx4649op'); + await page.getByRole('button', { name: 'Log in' }).click(); + await expect(page.getByRole('link').filter({ hasText: '学生工作台' })).toBeVisible(); + }); + + // 步骤2: 测试 DreamiExplore + await executeStep('进入 DreamiExplore', async () => { + await page.getByRole('link').filter({ hasText: 'DreamiExplore Everything' }).click(); + await expect(page.getByRole('heading', { name: 'Hello, Admin' })).toBeVisible(); + }); + + await executeStep('测试聊天功能', async () => { + await page.getByRole('textbox').click(); + await page.getByRole('textbox').fill('hello'); + await page.getByRole('button', { name: 'send' }).click(); + await expect(page.getByRole('button', { name: '复制' })).toBeVisible({ timeout: 10000 }); + }); + + // 步骤3: 创建新学生 + await executeStep('返回学生工作台', async () => { + await page.getByRole('link').filter({ hasText: '学生工作台' }).click(); + await expect(page.getByText('Student Name')).toBeVisible(); + }); + + await executeStep('创建新学生', async () => { + await page.getByRole('button', { name: 'New Student' }).click(); + await page.getByRole('textbox', { name: 'Name *', exact: true }).click(); + await page.getByRole('textbox', { name: 'Name *', exact: true }).fill('黄子旭测试'); + await page.locator('div').filter({ hasText: /^Please select branch$/ }).nth(2).click(); + await page.locator('div').filter({ hasText: /^1$/ }).nth(1).click(); + await page.getByText('Select counselor').click(); + await page.locator('div').filter({ hasText: /^2-2@2\.com$/ }).nth(1).click(); + await page.locator('svg').nth(5).click(); + await page.getByRole('textbox', { name: 'Contract Category *' }).click(); + await page.getByRole('textbox', { name: 'Contract Category *' }).fill('11'); + await page.getByRole('textbox', { name: 'Contract Name *' }).click(); + await page.getByRole('textbox', { name: 'Contract Name *' }).fill('11'); + await page.getByRole('button', { name: 'Confirm' }).click(); + // 等待学生创建成功,使用 first() 处理多个匹配 + await expect(page.getByText('黄子旭测试').first()).toBeVisible(); + }); + + // 步骤4: Essay Writing 流程 + await executeStep('进入 Essay Writing', async () => { + await page.getByRole('button', { name: 'documents Essay Writing' }).first().click(); + await expect(page.getByText('Notes')).toBeVisible(); + }); + + await executeStep('添加材料', async () => { + await page.getByRole('button', { name: 'Add Material' }).click(); + await page.getByRole('menuitem', { name: 'Manual Add' }).click(); + await expect(page.getByText('ClassificationGeneralGeneralAcademic Interests and AchievementsInternship and')).toBeVisible(); + await page.getByRole('textbox', { name: 'Title' }).click(); + await page.getByRole('textbox', { name: 'Title' }).fill('Community Art & Cultural Education Project(社区艺术与文化教育项目)'); + await page.getByRole('paragraph').filter({ hasText: /^$/ }).click(); + await page.locator('.tiptap').fill('在高二至高三期间,我每周投入约3小时参与社区艺术与文化教育项目,协助为当地儿童开设艺术工作坊。我主要负责示范水彩晕染、湿画法与层次叠加等技法,并教授楷书与行书的基础笔画练习,帮助孩子们理解中西方艺术表现的差异。'); + await page.getByRole('button', { name: 'icon Get Suggestions' }).click(); + await expect(page.getByRole('heading', { name: 'More Suggestions' })).toBeVisible(); + await page.getByRole('button', { name: 'Create', exact: true }).click(); + await expect(page.getByRole('button', { name: 'Community Art' })).toBeVisible({ timeout: 15000 }); + // 等待页面稳定后再点击 + await page.waitForTimeout(1000); + }); + + await executeStep('探索 Essay Idea', async () => { + await page.getByRole('button', { name: 'icon Explore Essay Idea' }).click(); + await expect(page.getByRole('heading', { name: 'Select an essay prompt or' })).toBeVisible(); + }); + + await executeStep('加载 Recommendation', async () => { + // 点击 Recommendation 按钮 + await page.getByRole('button', { name: 'icon Recommendation' }).click(); + await page.waitForTimeout(10000); + console.log('等待 Recommendation 加载完成...'); + await expect(page.getByRole('heading', { name: 'Recommendation Material' })).toBeVisible({ timeout: 120000 }); + console.log('Recommendation Material 已出现'); + }); + + await executeStep('生成 Essay Idea', async () => { + await page.getByRole('button', { name: 'icon Generate Essay Idea' }).click(); + await page.getByRole('button', { name: 'Generate' }).click(); + // AI 生成需要时间,增加超时 + await expect(page.getByRole('heading', { name: 'Essay Idea' })).toBeVisible({ timeout: 60000 }); + }); + + await executeStep('生成 Essay', async () => { + await page.getByRole('button', { name: 'icon Generate Essay' }).click(); + await page.getByRole('button', { name: 'Generate' }).click(); + + console.log('等待 Essay 生成完成...'); + const loadingMessage = page.getByText(/正在生成文书,预计需要30秒,请耐心等待/i); + + // 第一步:先等待加载消息出现(确保生成已开始) + console.log('等待加载消息出现...'); + await loadingMessage.waitFor({ state: 'visible', timeout: 10000 }); + console.log('加载消息已出现,文书正在生成中...'); + + // 第二步:等待加载消息消失(最多等待 3 分钟) + await loadingMessage.waitFor({ state: 'hidden', timeout: 180000 }); + console.log('Essay 生成完成,加载消息已消失'); + + // 第三步:等待 10 秒钟让页面稳定 + console.log('等待 10 秒让页面稳定...'); + await page.waitForTimeout(10000); + console.log('页面已稳定,继续下一步'); + }); + + // 步骤5: 各种检查功能 + await executeStep('语法检查 (Grammar Check)', async () => { + await page.getByRole('img', { name: 'trigger' }).first().click(); + await page.getByRole('button', { name: 'Start Grammar Check' }).click(); + // 语法检查需要时间 + console.log('等待 Start Grammar Check 加载完成...'); + await expect(page.getByRole('heading', { name: 'suggestions' })).toBeVisible({ timeout: 120000 }); + console.log('suggestions 已出现'); + await expect(page.getByLabel('suggestions')).toBeVisible({ timeout: 30000 }); + }); + + await executeStep('查重检查 (Plagiarism Check)', async () => { + await page.getByRole('img', { name: 'trigger' }).nth(1).click(); + await page.getByRole('button', { name: 'Start Plagiarism Check' }).click(); + console.log('等待 Start Plagiarism Check 加载完成...'); + // 查重检查需要较长时间 + await expect(page.getByRole('button', { name: 'Re-check' })).toBeVisible({ timeout: 200000 }); + console.log('Re-check 已出现'); + }); + + await executeStep('AI检测 (AI Detection)', async () => { + await page.getByRole('img', { name: 'trigger' }).nth(2).click(); + await page.getByRole('button', { name: 'Start AI Detection' }).click(); + console.log('等待 Start AI Detection 加载完成...'); + await expect(page.getByRole('heading', { name: 'GPTZero Premium' })).toBeVisible({ timeout: 80000 }); + console.log('GPTZero Premium 已出现'); + }); + + await executeStep('人性化处理 (Humanize)', async () => { + await page.getByRole('img', { name: 'trigger' }).nth(3).click(); + await page.getByRole('button', { name: 'Start Humanize' }).click(); + console.log('等待 Start Humanize 加载完成...'); + await expect(page.getByText('Accept all')).toBeVisible({ timeout: 110000 }); + console.log('Accept all 已出现'); + }); + + await executeStep('润色 (Polish)', async () => { + await page.getByRole('img', { name: 'trigger' }).nth(4).click(); + await page.getByRole('button', { name: 'Start Polish' }).click(); + console.log('等待 Start Polish 加载完成...'); + await expect(page.getByText('All Suggestions')).toBeVisible({ timeout: 110000 }); + console.log('All Suggestions 已出现'); + }); + + await executeStep('评分 (Get Rated)', async () => { + await page.getByRole('img', { name: 'trigger' }).nth(5).click(); + await page.getByRole('button', { name: 'Get Rated' }).click(); + console.log('等待 Get Rated 加载完成...'); + await expect(page.getByRole('heading', { name: 'Your essay rating is:' })).toBeVisible({ timeout: 120000 }); + console.log('Your essay rating is: 已出现'); + }); + + await executeStep('Improvement 检查', async () => { + await page.getByRole('tab', { name: 'Improvement' }).click(); + console.log('等待 Improvement 加载完成...'); + await expect(page.getByText('Accept all')).toBeVisible({ timeout: 110000 }); + console.log('Accept all 已出现)'); + }); + + // 步骤6: 进入 Essay Writing + await executeStep('进入 Essay Writing', async () => { + await page.getByRole('button', { name: 'Essay Writing' }).click(); + await expect(page.getByRole('button', { name: 'icon Explore Essay Idea' })).toBeVisible({ timeout: 15000 }); + }); + + // 步骤7: 探索 Essay Idea + await executeStep('探索 Essay Idea', async () => { + await page.getByRole('button', { name: 'icon Explore Essay Idea' }).click(); + await expect(page.getByRole('heading', { name: 'Prompt Answer Guide' })).toBeVisible({ timeout: 15000 }); + }); + + // 步骤8: 加载 Recommendation + await executeStep('加载 Recommendation', async () => { + await page.getByRole('button', { name: 'icon Recommendation' }).click(); + console.log('等待 Recommendation 加载完成...'); + await page.waitForTimeout(10000); + console.log('Recommendation 加载完成'); + }); + + // 步骤9: 生成 Essay Idea + await executeStep('生成 Essay Idea', async () => { + await page.getByRole('button', { name: 'icon Generate Essay Idea' }).click(); + await page.getByRole('button', { name: 'Generate' }).click(); + console.log('等待 Essay Idea 生成...'); + await expect(page.getByRole('button', { name: 'Student Guide' })).toBeVisible({ timeout: 60000 }); + console.log('Essay Idea 生成完成'); + }); + + console.log('等待 10 秒让页面稳定...'); + await page.waitForTimeout(10000); + console.log('页面已稳定,继续下一步'); + + // 步骤10: 测试 Student Guide 功能 + await executeStep('测试 Student Guide 展开/收起', async () => { + // 展开 Student Guide + await page.getByRole('button', { name: 'Student Guide' }).click(); + console.log('等待 Student Guide 加载完成...'); + await expect(page.getByText('**')).toBeVisible({ timeout: 110000 }); + // 测试复制功能 + await page.getByRole('button', { name: 'Copy' }).click(); + await expect(page.getByText('Copied to clipboard')).toBeVisible({ timeout: 110000 }); + await page.getByLabel('Student Guide').getByRole('button').filter({ hasText: /^$/ }).click(); + console.log('等待 10 秒让页面稳定...'); + await page.waitForTimeout(10000); + console.log('页面已稳定,继续下一步'); + }); + + // 步骤11: 测试翻译功能 + await executeStep('测试翻译功能', async () => { + // 点击翻译按钮,英文 → 中文 + await page.getByRole('button', { name: 'Translate Translate' }).click(); + console.log('点击翻译按钮,等待翻译完成...'); + + // 等待翻译完成(等待按钮重新变为可用状态或等待固定时间) + await page.waitForTimeout(3000); + + // 验证翻译按钮仍然存在(表示功能可用) + await expect(page.getByRole('button', { name: 'Translate Translate' })).toBeVisible({ timeout: 5000 }); + console.log('翻译功能正常(已切换为中文)'); + }); + + // 步骤12: 测试复制功能 + await executeStep('测试复制到剪贴板', async () => { + await page.getByRole('button', { name: 'Copy' }).click(); + await expect(page.getByText('Copied to clipboard')).toBeVisible({ timeout: 5000 }); + console.log('复制功能正常'); + console.log('等待 10 秒让页面稳定...'); + await page.waitForTimeout(10000); + console.log('页面已稳定,继续下一步'); + }); + + // 步骤13: 测试再次翻译 + await executeStep('测试翻译返回英文', async () => { + await page.getByRole('button', { name: 'Translate Translate' }).click(); + await page.waitForTimeout(2000); + console.log('翻译返回英文完成'); + }); + + // 步骤14: 再次测试复制 + await executeStep('再次测试复制功能', async () => { + await page.getByRole('button', { name: 'Copy' }).click(); + await expect(page.getByText('Copied to clipboard')).toBeVisible({ timeout: 5000 }); + }); + + // 步骤15: 测试重新生成 Essay Idea + await executeStep('测试重新生成 Essay Idea', async () => { + await page.getByRole('button', { name: 'Regenerate' }).click(); + console.log('等待重新生成 Essay Idea...'); + await expect(page.getByRole('button', { name: 'Student Guide' })).toBeVisible({ timeout: 60000 }); + console.log('重新生成完成'); + }); + + // 步骤16: 生成 Outline + await executeStep('生成 Outline', async () => { + await page.getByRole('button', { name: 'icon Generate Outline First' }).click(); + await page.getByRole('button', { name: 'Generate' }).click(); + console.log('等待 Outline 生成...'); + await expect(page.getByRole('heading', { name: 'Untitled Document' })).toBeVisible({ timeout: 60000 }); + console.log('Outline 生成完成'); + }); + + // 步骤17: 生成 Draft + await executeStep('生成 Draft', async () => { + await page.getByRole('button', { name: 'icon Generate Draft' }).click(); + await page.getByRole('button', { name: 'Intermediate' }).click(); + await page.getByPlaceholder('Enter the expected length...').click(); + await page.getByPlaceholder('Enter the expected length...').fill('500'); + await page.getByRole('button', { name: 'Generate' }).click(); + console.log('等待 Draft 生成完成...'); + const loadingMessage = page.getByText(/正在生成文书,预计需要30秒,请耐心等待/i); + // 第一步:先等待加载消息出现(确保生成已开始) + console.log('等待加载消息出现...'); + await loadingMessage.waitFor({ state: 'visible', timeout: 10000 }); + console.log('加载消息已出现,文书正在生成中...'); + }); + // 步骤18: 进入 Essay Writing + await executeStep('进入 Essay Writing', async () => { + await page.getByRole('button', { name: 'Essay Writing' }).click(); + await expect(page.getByText('Notes')).toBeVisible({ timeout: 15000 }); + }); + + // 步骤19: 点击 Essay Writing 确认界面 + await executeStep('确认 Essay Writing 界面', async () => { + await page.getByRole('button', { name: 'Essay Writing' }).click(); + await expect(page.getByRole('button', { name: 'Add Material' })).toBeVisible({ timeout: 10000 }); + console.log('Essay Writing 界面已加载'); + }); + + // 步骤20: 测试文件上传功能 + await executeStep('打开文件上传对话框', async () => { + await page.getByRole('button', { name: 'Add Material' }).click(); + await page.getByRole('menuitem', { name: 'Upload File' }).click(); + await expect(page.getByText('Click to upload or drag files')).toBeVisible({ timeout: 10000 }); + console.log('文件上传对话框已打开'); + }); + + await executeStep('上传文件', async () => { + // 检查文件是否存在 - 文件在上级目录 + const filePath = path.join(process.cwd(), '..', 'math.docx'); + if (!fs.existsSync(filePath)) { + console.warn(`⚠️ 警告: 文件 math.docx 不存在,跳过上传测试`); + throw new Error(`文件不存在: ${filePath}`); + } + + console.log(`准备上传文件: ${filePath}`); + await page.locator('input[type="file"]').setInputFiles(filePath); + + // 等待上传状态显示 + console.log('等待文件上传...'); + await page.waitForTimeout(2000); + + // 点击上传按钮 + await page.getByRole('button', { name: 'Upload' }).click(); + console.log('已点击上传按钮'); + + // 等待上传完成 - 验证文件出现在材料列表中 + await expect(page.getByRole('button', { name: 'docx' }).first()).toBeVisible({ timeout: 30000 }); + console.log('文件上传成功'); + + // 生成 Essay + await page.getByRole('button', { name: 'icon Generate Essay' }).click(); + await page.getByRole('menuitem', { name: 'Create Essay Directly' }).click(); + await expect(page.getByRole('button', { name: 'docx (9.79 KB) math.docx math' })).toBeVisible(); + console.log('开始生成 Essay'); + + // 生成 确认文档选择 + await page.getByRole('button', { name: 'docx (9.79 KB) math.docx math' }).click(); + console.log('文档选择已确认'); + + // 生成 Draft + await page.getByRole('button', { name: 'icon Generate Draft' }).click(); + await page.getByRole('button', { name: 'Generate' }).click(); + + //等待 Essay 生成完成 + console.log('等待 Essay 生成完成...'); + const loadingMessage = page.getByText(/正在生成文书,预计需要30秒,请耐心等待/i); + console.log('等待加载消息出现...'); + await loadingMessage.waitFor({ state: 'visible', timeout: 10000 }); + console.log('加载消息已出现,文书正在生成中...'); + await loadingMessage.waitFor({ state: 'hidden', timeout: 180000 }); + console.log('Essay 生成完成,加载消息已消失'); + console.log('等待 10 秒让页面稳定...'); + await page.waitForTimeout(10000); + console.log('页面已稳定'); + }); + + // 最后输出错误汇总 + console.log('\n\n========== 测试执行完成 =========='); + + // 生成错误报告文件 + const generateErrorReport = () => { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const reportPath = path.join(process.cwd(), `test-error-report-${timestamp}.txt`); + + let report = '========== 测试错误报告 ==========\n\n'; + report += `报告生成时间: ${new Date().toLocaleString('zh-CN')}\n\n`; + + // 第一部分:登录账号信息(只显示一次) + report += '【登录账号信息】\n'; + report += `账号: ${loginInfo.email}\n`; + report += `密码: ${loginInfo.password}\n`; + report += `测试环境: https://pre.prodream.cn/en\n\n`; + report += `${'='.repeat(60)}\n\n`; + + if (errors.length === 0) { + report += '✅ 所有功能测试通过,未发现问题!\n'; + } else { + report += `发现 ${errors.length} 个问题,详情如下:\n\n`; + + // 每个错误按照格式:问题功能 + 页面链接 + errors.forEach((err, index) => { + report += `【问题 ${index + 1}】\n`; + report += `问题功能: ${err.step}\n`; + report += `页面链接: ${err.pageUrl}\n`; + report += `错误详情: ${err.error}\n`; + report += `发生时间: ${new Date(err.timestamp).toLocaleString('zh-CN')}\n`; + report += '\n'; + }); + + report += `${'='.repeat(60)}\n`; + report += `\n说明: 测试过程中遇到错误会自动跳过并继续执行后续步骤。\n`; + } + + fs.writeFileSync(reportPath, report, 'utf-8'); + return reportPath; + }; + + if (errors.length === 0) { + console.log('✅ 所有步骤执行成功!'); + } else { + console.log(`\n⚠️ 发现 ${errors.length} 个问题:\n`); + errors.forEach((err, index) => { + console.log(`【问题 ${index + 1}】`); + console.log(` 问题功能: ${err.step}`); + console.log(` 页面链接: ${err.pageUrl}`); + console.log(` 错误详情: ${err.error}`); + console.log(''); + }); + + // 生成并保存错误报告文件 + const reportPath = generateErrorReport(); + console.log(`📄 详细错误报告已保存到: ${reportPath}`); + console.log(`\n账号: ${loginInfo.email}`); + console.log(`密码: ${loginInfo.password}\n`); + + // 不抛出错误,让测试标记为通过,但在日志中记录所有失败步骤 + } +}); \ No newline at end of file