auto-test.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Playwright 自动测试 - 真实模拟用户操作
  2. // 用 click/fill 真实触发按钮,不用 page.evaluate
  3. const { chromium } = require('playwright');
  4. const fs = require('fs');
  5. const out = (msg) => fs.appendFileSync('test-output.log', msg + '\n');
  6. (async () => {
  7. fs.writeFileSync('test-output.log', '');
  8. out('🚀 真实模拟用户操作测试\n');
  9. const browser = await chromium.launch({
  10. headless: false,
  11. args: ['--use-fake-ui-for-media-stream', '--use-fake-device-for-media-stream'],
  12. });
  13. const context = await browser.newContext({
  14. permissions: ['microphone'],
  15. });
  16. const page = await context.newPage();
  17. page.on('console', msg => {
  18. const text = msg.text();
  19. if (!text.includes('KeyVault') && !text.includes('favicon')) {
  20. out(`[${msg.type()}] ${text}`);
  21. }
  22. });
  23. page.on('pageerror', err => out(`[PAGE ERROR] ${err.message}`));
  24. // 访问页面
  25. await page.goto('http://localhost:3000/test/', { waitUntil: 'networkidle' });
  26. await page.waitForTimeout(2000);
  27. out('📄 页面加载\n');
  28. // ========== 测试 1:点录音按钮 ==========
  29. out('\n━━━━━━━━━ 测试 1: 录音按钮 ━━━━━━━━━');
  30. await page.click('#br');
  31. await page.waitForTimeout(2000);
  32. await page.click('#bs');
  33. await page.waitForTimeout(1000);
  34. out('✅ 录音按钮测试完成');
  35. // ========== 测试 2:手动输入 ASR ==========
  36. out('\n━━━━━━━━━ 测试 2: 手动输入 ASR ━━━━━━━━━');
  37. // 直接修改 ASR 文本框内容(模拟用户填了文字)
  38. await page.evaluate(() => {
  39. const at = document.getElementById('at');
  40. at.textContent = '你好世界';
  41. at.classList.remove('e');
  42. });
  43. await page.waitForTimeout(500);
  44. const asrValue = await page.locator('#at').textContent();
  45. out(`📝 ASR 文本框: "${asrValue}"`);
  46. // ========== 测试 3:点完整流程按钮 ==========
  47. out('\n━━━━━━━━━ 测试 3: 点完整流程按钮 ━━━━━━━━━');
  48. // 重要:用 click 触发真实 onclick
  49. await page.click('#bf');
  50. out('🖱️ 按钮已点击');
  51. // 立即检查状态
  52. await page.waitForTimeout(500);
  53. const status1 = await page.locator('#ts').textContent();
  54. out(`状态 1: "${status1}"`);
  55. await page.waitForTimeout(2000);
  56. const status2 = await page.locator('#ts').textContent();
  57. out(`状态 2: "${status2}"`);
  58. await page.waitForTimeout(5000);
  59. const status3 = await page.locator('#ts').textContent();
  60. out(`状态 3: "${status3}"`);
  61. // 检查 LLM 文本框
  62. const llmValue = await page.locator('#lt').textContent();
  63. out(`🤖 LLM 文本框: "${llmValue.substring(0, 100)}${llmValue.length > 100 ? '...' : ''}"`);
  64. // 等待 TTS 完成
  65. await page.waitForTimeout(20000);
  66. // 最终状态
  67. const finalStatus = await page.locator('#ts').textContent();
  68. const audioSrc = await page.locator('#ta').getAttribute('src');
  69. const ttsUrl = await page.locator('#tu').textContent();
  70. out(`\n最终状态: "${finalStatus}"`);
  71. out(`音频 src: "${audioSrc}"`);
  72. out(`URL 显示: "${ttsUrl}"`);
  73. // 截图
  74. await page.screenshot({ path: 'test-result-final.png', fullPage: true });
  75. // 获取页面日志
  76. const pageLog = await page.locator('#log').textContent();
  77. out(`\n📋 完整页面日志:\n${pageLog}`);
  78. await browser.close();
  79. out('\n✅ 测试完成');
  80. })().catch(err => {
  81. out('❌ 测试失败: ' + err.message);
  82. out(err.stack);
  83. });