/**
* Agent 对话功能全面验证测试
*
* 测试范围:
* 1. Agent 对话初始化
* 2. 消息发送与接收
* 3. 对话历史记录
* 4. 上下文保持
* 5. 功能按钮交互
* 6. 异常状态处理
* 7. 边界条件测试
* 8. 异常输入测试
* 9. 错误流程测试
*
* 使用 Chrome DevTools Protocol 进行深度验证
*/
import { test, expect, Page, CDPSession } from '@playwright/test';
import { execSync } from 'child_process';
// 测试配置
const TEST_CONFIG = {
baseURL: 'http://localhost:3000',
timeouts: {
navigation: 30000,
element: 10000,
message: 60000,
stream: 120000,
},
};
// 测试数据
const TEST_MESSAGES = {
normal: [
'你好,请介绍一下自己',
'你能帮我做什么?',
'请用 Python 写一个快速排序算法',
],
boundary: {
empty: '',
whitespace: ' ',
long: 'a'.repeat(5000),
special: '!@#$%^&*()_+-=[]{}|;\':",./<>?',
multiline: '第一行\n第二行\n第三行',
unicode: '你好世界 🌍 Привет мир こんにちは世界',
code: '```python\ndef hello():\n print("Hello")\n```',
},
edge: {
sqlInjection: "'; DROP TABLE users; --",
xss: '',
json: '{"key": "value", "nested": {"array": [1,2,3]}}',
xml: '- test
',
},
};
// 辅助函数:等待指定时间
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
// 辅助函数:获取 CDP Session
async function getCDPSession(page: Page): Promise {
return await page.context().newCDPSession(page);
}
// 辅助函数:清除浏览器存储
async function clearBrowserStorage(page: Page) {
await page.evaluate(() => {
localStorage.clear();
sessionStorage.clear();
indexedDB.databases().then(dbs => {
dbs.forEach(db => {
if (db.name) indexedDB.deleteDatabase(db.name);
});
});
});
}
// 辅助函数:获取控制台日志
async function getConsoleLogs(page: Page): Promise {
const logs: string[] = [];
page.on('console', msg => {
logs.push(`[${msg.type()}] ${msg.text()}`);
});
return logs;
}
// 辅助函数:获取网络请求
async function getNetworkRequests(page: Page): Promise {
const requests: any[] = [];
page.on('request', request => {
requests.push({
url: request.url(),
method: request.method(),
headers: request.headers(),
});
});
return requests;
}
test.describe('Agent 对话功能全面验证', () => {
let page: Page;
let cdp: CDPSession;
let consoleLogs: string[] = [];
let networkRequests: any[] = [];
test.beforeEach(async ({ browser }) => {
// 创建新页面
const context = await browser.newContext({
viewport: { width: 1280, height: 720 },
deviceScaleFactor: 1,
});
page = await context.newPage();
// 获取 CDP Session
cdp = await getCDPSession(page);
// 启用 CDP 域
await cdp.send('Console.enable');
await cdp.send('Network.enable');
await cdp.send('Runtime.enable');
await cdp.send('Page.enable');
// 收集控制台日志
consoleLogs = [];
page.on('console', msg => {
consoleLogs.push(`[${msg.type()}] ${msg.text()}`);
});
// 收集网络请求
networkRequests = [];
page.on('request', request => {
networkRequests.push({
url: request.url(),
method: request.method(),
timestamp: Date.now(),
});
});
// 收集页面错误
page.on('pageerror', error => {
consoleLogs.push(`[PAGE_ERROR] ${error.message}`);
});
// 清除存储并导航到应用
await clearBrowserStorage(page);
await page.goto(TEST_CONFIG.baseURL, {
timeout: TEST_CONFIG.timeouts.navigation,
waitUntil: 'networkidle',
});
// 等待应用初始化
await wait(2000);
});
test.afterEach(async () => {
// 输出收集的日志
if (consoleLogs.length > 0) {
console.log('\n=== 控制台日志 ===');
consoleLogs.forEach(log => console.log(log));
}
if (networkRequests.length > 0) {
console.log('\n=== 网络请求 ===');
console.log(`总请求数: ${networkRequests.length}`);
}
await page.close();
});
// ============================================
// 测试套件 1: Agent 对话初始化
// ============================================
test.describe('1. Agent 对话初始化', () => {
test('1.1 页面加载后应显示初始界面', async () => {
// 验证页面标题
const title = await page.title();
expect(title).toBeTruthy();
// 验证主要元素存在
const chatArea = await page.locator('[data-testid="chat-area"], .chat-area, [class*="ChatArea"]').first();
const inputArea = await page.locator('textarea, input[type="text"], [data-testid="chat-input"]').first();
// 截图记录初始状态
await page.screenshot({
path: 'test-results/agent-chat-init.png',
fullPage: true,
});
// 验证至少有一个输入区域
const hasInput = await inputArea.isVisible().catch(() => false);
expect(hasInput || await chatArea.isVisible().catch(() => false)).toBeTruthy();
});
test('1.2 应正确加载默认 Agent 配置', async () => {
// 使用 CDP 检查 localStorage
const localStorage = await cdp.send('Runtime.evaluate', {
expression: 'JSON.stringify(localStorage)',
});
console.log('LocalStorage 内容:', localStorage.result.value);
// 检查 IndexedDB
const indexedDBData = await cdp.send('Runtime.evaluate', {
expression: `
(async () => {
const dbs = await indexedDB.databases();
return JSON.stringify(dbs.map(db => db.name));
})()
`,
awaitPromise: true,
});
console.log('IndexedDB 数据库:', indexedDBData.result.value);
});
test('1.3 网络连接状态应正确显示', async () => {
// 检查连接状态指示器
const connectionIndicators = await page.locator(
'[data-testid="connection-status"], .connection-status, [class*="Connection"], [class*="connection"]'
).all();
console.log(`找到 ${connectionIndicators.length} 个连接状态指示器`);
// 验证没有连接错误
const errorLogs = consoleLogs.filter(log =>
log.includes('error') || log.includes('Error') || log.includes('failed')
);
// 允许初始连接尝试的错误
const criticalErrors = errorLogs.filter(log =>
!log.includes('WebSocket') && !log.includes('connection')
);
expect(criticalErrors.length).toBeLessThan(5);
});
test('1.4 首次加载应显示欢迎界面或引导', async () => {
// 检查是否有欢迎消息或引导
const welcomeElements = await page.locator(
'text=/欢迎|Welcome|开始|Start|你好|Hello/i'
).all();
console.log(`找到 ${welcomeElements.length} 个欢迎元素`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-welcome.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 2: 消息发送与接收
// ============================================
test.describe('2. 消息发送与接收', () => {
test('2.1 正常消息发送应成功', async () => {
const testMessage = TEST_MESSAGES.normal[0];
// 找到输入框
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(testMessage);
// 找到发送按钮
const sendButton = await page.locator(
'button[type="submit"], button:has-text("发送"), button:has-text("Send"), [data-testid="send-button"]'
).first();
// 点击发送或按回车
if (await sendButton.isVisible().catch(() => false)) {
await sendButton.click();
} else {
await input.press('Enter');
}
// 等待消息发送
await wait(1000);
// 验证消息出现在对话中
const messages = await page.locator(
'[data-testid="message"], .message, [class*="Message"], [class*="message"]'
).all();
console.log(`找到 ${messages.length} 条消息`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-message-sent.png',
fullPage: true,
});
});
test('2.2 流式响应应正确显示', async () => {
const testMessage = '请详细介绍一下人工智能的发展历程';
// 发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(testMessage);
await input.press('Enter');
// 等待流式响应开始
await wait(2000);
// 使用 CDP 监控 DOM 变化
const initialDOM = await cdp.send('Runtime.evaluate', {
expression: 'document.body.innerHTML.length',
});
console.log('初始 DOM 长度:', initialDOM.result.value);
// 等待一段时间观察流式更新
await wait(5000);
const updatedDOM = await cdp.send('Runtime.evaluate', {
expression: 'document.body.innerHTML.length',
});
console.log('更新后 DOM 长度:', updatedDOM.result.value);
// 截图记录流式响应状态
await page.screenshot({
path: 'test-results/agent-chat-streaming.png',
fullPage: true,
});
});
test('2.3 多轮对话应保持上下文', async () => {
const messages = [
'我的名字叫张三',
'我叫什么名字?',
'请用我的名字写一首短诗',
];
for (const message of messages) {
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(message);
await input.press('Enter');
// 等待响应
await wait(3000);
// 截图记录每轮对话
await page.screenshot({
path: `test-results/agent-chat-context-${messages.indexOf(message)}.png`,
fullPage: true,
});
}
// 验证所有消息都存在于对话中
const allMessages = await page.locator(
'[data-testid="message"], .message, [class*="Message"]'
).all();
console.log(`对话中共有 ${allMessages.length} 条消息`);
expect(allMessages.length).toBeGreaterThanOrEqual(messages.length * 2);
});
test('2.4 代码块应正确渲染', async () => {
const codeMessage = '请写一个 Python 函数来计算斐波那契数列';
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(codeMessage);
await input.press('Enter');
// 等待响应
await wait(8000);
// 检查代码块
const codeBlocks = await page.locator(
'pre, code, [class*="code"], [class*="Code"]'
).all();
console.log(`找到 ${codeBlocks.length} 个代码块元素`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-code-block.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 3: 对话历史记录
// ============================================
test.describe('3. 对话历史记录', () => {
test('3.1 对话列表应正确显示', async () => {
// 查找对话列表
const conversationList = await page.locator(
'[data-testid="conversation-list"], .conversation-list, [class*="Conversation"], [class*="conversation"]'
).all();
console.log(`找到 ${conversationList.length} 个对话列表元素`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-conversation-list.png',
fullPage: true,
});
});
test('3.2 新建对话应创建新会话', async () => {
// 查找新建对话按钮
const newChatButton = await page.locator(
'button:has-text("新对话"), button:has-text("New Chat"), [data-testid="new-conversation"], button:has([svg])'
).first();
if (await newChatButton.isVisible().catch(() => false)) {
await newChatButton.click();
await wait(1000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-new-conversation.png',
fullPage: true,
});
}
});
test('3.3 切换对话应加载正确内容', async () => {
// 先发送一条消息创建对话
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('这是测试对话 1');
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-switch-conversation.png',
fullPage: true,
});
});
test('3.4 对话标题应正确生成', async () => {
// 发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('讨论机器学习算法');
await input.press('Enter');
await wait(2000);
// 检查对话标题
const titles = await page.locator(
'[class*="title"], [class*="Title"], h1, h2, h3'
).allInnerTexts();
console.log('找到的对话标题:', titles);
});
});
// ============================================
// 测试套件 4: 上下文保持
// ============================================
test.describe('4. 上下文保持', () => {
test('4.1 页面刷新后应恢复对话状态', async () => {
// 发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('记住这个数字:42');
await input.press('Enter');
await wait(3000);
// 刷新页面
await page.reload({ waitUntil: 'networkidle' });
await wait(2000);
// 验证对话恢复
const messages = await page.locator(
'[data-testid="message"], .message, [class*="Message"]'
).all();
console.log(`刷新后找到 ${messages.length} 条消息`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-refresh-recovery.png',
fullPage: true,
});
});
test('4.2 长对话上下文应正确处理', async () => {
// 发送多条消息建立长对话
for (let i = 0; i < 5; i++) {
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(`消息 ${i + 1}: 这是测试消息`);
await input.press('Enter');
await wait(2000);
}
// 询问关于之前的内容
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('我发送的第一条消息是什么?');
await input.press('Enter');
await wait(5000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-long-context.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 5: 功能按钮交互
// ============================================
test.describe('5. 功能按钮交互', () => {
test('5.1 聊天模式切换应正常工作', async () => {
// 查找模式切换按钮
const modeButtons = await page.locator(
'button:has-text("闪速"), button:has-text("思考"), button:has-text("Pro"), button:has-text("Ultra"), [data-testid="chat-mode"]'
).all();
console.log(`找到 ${modeButtons.length} 个模式按钮`);
if (modeButtons.length > 0) {
await modeButtons[0].click();
await wait(500);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-mode-switch.png',
fullPage: true,
});
}
});
test('5.2 文件上传按钮应可点击', async () => {
// 查找文件上传按钮
const fileButton = await page.locator(
'button:has([name="paperclip"]), button:has-text("附件"), [data-testid="file-upload"], input[type="file"]'
).first();
const isVisible = await fileButton.isVisible().catch(() => false);
console.log('文件上传按钮可见:', isVisible);
if (isVisible) {
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-file-button.png',
fullPage: true,
});
}
});
test('5.3 停止生成按钮应在流式响应时显示', async () => {
// 发送长消息触发流式响应
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('请详细解释量子计算的原理和应用,包括量子比特、量子纠缠等概念');
await input.press('Enter');
// 等待流式响应开始
await wait(1000);
// 查找停止按钮
const stopButton = await page.locator(
'button:has-text("停止"), button:has-text("Stop"), [data-testid="stop-generation"], button:has([name="square"])'
).first();
const isVisible = await stopButton.isVisible().catch(() => false);
console.log('停止按钮可见:', isVisible);
if (isVisible) {
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-stop-button.png',
fullPage: true,
});
}
});
test('5.4 重新生成按钮应在响应完成后显示', async () => {
// 发送消息并等待完成
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('你好');
await input.press('Enter');
await wait(5000);
// 查找重新生成按钮
const regenerateButton = await page.locator(
'button:has-text("重新生成"), button:has-text("Regenerate"), [data-testid="regenerate"], button:has([name="refresh"])'
).first();
const isVisible = await regenerateButton.isVisible().catch(() => false);
console.log('重新生成按钮可见:', isVisible);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-regenerate-button.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 6: 异常状态处理
// ============================================
test.describe('6. 异常状态处理', () => {
test('6.1 网络断开时应显示离线提示', async () => {
// 模拟网络断开
await cdp.send('Network.emulateNetworkConditions', {
offline: true,
latency: 0,
downloadThroughput: 0,
uploadThroughput: 0,
});
await wait(1000);
// 检查离线提示
const offlineIndicator = await page.locator(
'text=/离线|Offline|网络|Network/i, [class*="offline"], [class*="Offline"]'
).first();
const isVisible = await offlineIndicator.isVisible().catch(() => false);
console.log('离线提示可见:', isVisible);
// 恢复网络
await cdp.send('Network.emulateNetworkConditions', {
offline: false,
latency: 0,
downloadThroughput: -1,
uploadThroughput: -1,
});
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-offline.png',
fullPage: true,
});
});
test('6.2 发送空消息应被阻止或提示', async () => {
const input = await page.locator('textarea, input[type="text"]').first();
// 尝试发送空消息
await input.fill('');
await input.press('Enter');
await wait(500);
// 检查是否有错误提示
const errorMessages = await page.locator(
'text=/不能为空|Cannot be empty|请输入|Please enter/i, [class*="error"], [class*="Error"]'
).all();
console.log(`找到 ${errorMessages.length} 个错误提示`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-empty-message.png',
fullPage: true,
});
});
test('6.3 快速连续发送应被正确处理', async () => {
const input = await page.locator('textarea, input[type="text"]').first();
// 快速发送多条消息
for (let i = 0; i < 5; i++) {
await input.fill(`快速消息 ${i + 1}`);
await input.press('Enter');
}
await wait(2000);
// 检查消息数量
const messages = await page.locator(
'[data-testid="message"], .message, [class*="Message"]'
).all();
console.log(`快速发送后找到 ${messages.length} 条消息`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-rapid-send.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 7: 边界条件测试
// ============================================
test.describe('7. 边界条件测试', () => {
test('7.1 超长消息应被正确处理', async () => {
const longMessage = TEST_MESSAGES.boundary.long;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(longMessage);
// 检查输入框内容
const inputValue = await input.inputValue();
console.log(`输入框内容长度: ${inputValue.length}`);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-long-message.png',
fullPage: true,
});
});
test('7.2 特殊字符应正确显示', async () => {
const specialMessage = TEST_MESSAGES.boundary.special;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(specialMessage);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-special-chars.png',
fullPage: true,
});
});
test('7.3 Unicode 字符应正确显示', async () => {
const unicodeMessage = TEST_MESSAGES.boundary.unicode;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(unicodeMessage);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-unicode.png',
fullPage: true,
});
});
test('7.4 多行消息应正确渲染', async () => {
const multilineMessage = TEST_MESSAGES.boundary.multiline;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(multilineMessage);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-multiline.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 8: 异常输入测试
// ============================================
test.describe('8. 异常输入测试', () => {
test('8.1 SQL 注入尝试应被安全处理', async () => {
const sqlInjection = TEST_MESSAGES.edge.sqlInjection;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(sqlInjection);
await input.press('Enter');
await wait(2000);
// 检查控制台是否有错误
const securityErrors = consoleLogs.filter(log =>
log.includes('SQL') || log.includes('injection') || log.includes('security')
);
console.log('安全相关日志:', securityErrors);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-sql-injection.png',
fullPage: true,
});
});
test('8.2 XSS 尝试应被安全处理', async () => {
const xssAttempt = TEST_MESSAGES.edge.xss;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(xssAttempt);
await input.press('Enter');
await wait(2000);
// 检查页面是否执行了脚本
const alertTriggered = consoleLogs.some(log =>
log.includes('alert') || log.includes('xss')
);
expect(alertTriggered).toBe(false);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-xss.png',
fullPage: true,
});
});
test('8.3 JSON 数据应被正确格式化', async () => {
const jsonMessage = TEST_MESSAGES.edge.json;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(jsonMessage);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-json.png',
fullPage: true,
});
});
test('8.4 XML 数据应被正确处理', async () => {
const xmlMessage = TEST_MESSAGES.edge.xml;
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(xmlMessage);
await input.press('Enter');
await wait(2000);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-xml.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 9: 错误流程测试
// ============================================
test.describe('9. 错误流程测试', () => {
test('9.1 后端服务不可用时应有降级处理', async () => {
// 模拟后端服务不可用
await cdp.send('Network.setBlockedURLs', {
urls: ['*localhost*', '*127.0.0.1*'],
});
await wait(1000);
// 尝试发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('测试消息');
await input.press('Enter');
await wait(2000);
// 检查错误提示
const errorMessages = await page.locator(
'text=/错误|Error|失败|Failed|连接|Connection/i, [class*="error"], [class*="Error"]'
).all();
console.log(`找到 ${errorMessages.length} 个错误提示`);
// 恢复网络
await cdp.send('Network.setBlockedURLs', {
urls: [],
});
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-backend-down.png',
fullPage: true,
});
});
test('9.2 超时情况应有正确处理', async () => {
// 发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('这是一个测试');
await input.press('Enter');
// 等待较长时间
await wait(10000);
// 检查是否有超时提示
const timeoutMessages = await page.locator(
'text=/超时|Timeout|等待|Waiting/i'
).all();
console.log(`找到 ${timeoutMessages.length} 个超时相关提示`);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-timeout.png',
fullPage: true,
});
});
test('9.3 内存使用情况监控', async () => {
// 使用 CDP 获取内存信息
const memoryInfo = await cdp.send('Runtime.getHeapUsage');
console.log('堆内存使用:', memoryInfo);
// 发送多条消息
for (let i = 0; i < 10; i++) {
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(`内存测试消息 ${i + 1}`);
await input.press('Enter');
await wait(1000);
}
// 再次获取内存信息
const memoryInfoAfter = await cdp.send('Runtime.getHeapUsage');
console.log('发送消息后堆内存使用:', memoryInfoAfter);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-memory.png',
fullPage: true,
});
});
});
// ============================================
// 测试套件 10: 性能测试
// ============================================
test.describe('10. 性能测试', () => {
test('10.1 首屏加载时间', async () => {
// 使用 CDP 测量性能
const metrics = await cdp.send('Performance.getMetrics');
console.log('性能指标:', metrics);
// 使用 Navigation Timing API
const timing = await cdp.send('Runtime.evaluate', {
expression: `
JSON.stringify({
navigationStart: performance.timing.navigationStart,
loadEventEnd: performance.timing.loadEventEnd,
domContentLoaded: performance.timing.domContentLoadedEventEnd,
firstPaint: performance.getEntriesByType('paint')[0]?.startTime,
firstContentfulPaint: performance.getEntriesByType('paint')[1]?.startTime,
})
`,
});
console.log('页面加载时间:', timing.result.value);
});
test('10.2 消息渲染性能', async () => {
const startTime = Date.now();
// 发送消息
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill('性能测试消息');
await input.press('Enter');
// 等待响应
await wait(5000);
const endTime = Date.now();
console.log(`消息响应时间: ${endTime - startTime}ms`);
// 使用 CDP 获取渲染性能
const renderMetrics = await cdp.send('Runtime.evaluate', {
expression: `
JSON.stringify(performance.getEntriesByType('measure'))
`,
});
console.log('渲染性能指标:', renderMetrics.result.value);
});
test('10.3 大量消息滚动性能', async () => {
// 发送大量消息
for (let i = 0; i < 20; i++) {
const input = await page.locator('textarea, input[type="text"]').first();
await input.fill(`滚动性能测试消息 ${i + 1}`);
await input.press('Enter');
await wait(500);
}
// 滚动到顶部
await page.evaluate(() => {
window.scrollTo(0, 0);
});
await wait(500);
// 滚动到底部
await page.evaluate(() => {
window.scrollTo(0, document.body.scrollHeight);
});
await wait(500);
// 截图记录
await page.screenshot({
path: 'test-results/agent-chat-scroll-performance.png',
fullPage: true,
});
});
});
});
// 测试总结报告
test.describe('测试总结', () => {
test('生成测试报告', async () => {
console.log('\n');
console.log('==============================================');
console.log('Agent 对话功能全面验证测试完成');
console.log('==============================================');
console.log('测试范围:');
console.log(' 1. Agent 对话初始化');
console.log(' 2. 消息发送与接收');
console.log(' 3. 对话历史记录');
console.log(' 4. 上下文保持');
console.log(' 5. 功能按钮交互');
console.log(' 6. 异常状态处理');
console.log(' 7. 边界条件测试');
console.log(' 8. 异常输入测试');
console.log(' 9. 错误流程测试');
console.log(' 10. 性能测试');
console.log('==============================================');
});
});