171 lines
6.8 KiB
JavaScript
171 lines
6.8 KiB
JavaScript
const { chromium } = require('playwright');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// 测试配置
|
|
const BASE_URL = 'https://gch3n.online/pindou';
|
|
const TEST_IMAGE_PATH = '/Users/guchen/.openclaw/workspace/pindou-test-image.jpg';
|
|
|
|
// 创建测试用的简单图片
|
|
function createTestImage() {
|
|
// 使用 ImageMagick 或 canvas 创建一个简单测试图
|
|
// 这里我们先检查是否存在测试图
|
|
if (!fs.existsSync(TEST_IMAGE_PATH)) {
|
|
console.log('⚠️ 测试图片不存在,需要创建或使用现有图片');
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
async function runTests() {
|
|
console.log('🧪 Pindou 应用测试开始\n');
|
|
|
|
const browser = await chromium.launch({
|
|
headless: true,
|
|
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
|
});
|
|
|
|
try {
|
|
const context = await browser.newContext({
|
|
viewport: { width: 375, height: 812 }, // iPhone 尺寸
|
|
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15'
|
|
});
|
|
|
|
const page = await context.newPage();
|
|
|
|
// 启用控制台日志收集
|
|
const consoleLogs = [];
|
|
page.on('console', msg => {
|
|
const log = `[${msg.type()}] ${msg.text()}`;
|
|
consoleLogs.push(log);
|
|
console.log(log);
|
|
});
|
|
|
|
page.on('pageerror', error => {
|
|
console.error('❌ 页面错误:', error.message);
|
|
});
|
|
|
|
// ========== 测试 1: 首页加载 ==========
|
|
console.log('📱 测试 1: 首页加载');
|
|
await page.goto(BASE_URL, { waitUntil: 'networkidle', timeout: 30000 });
|
|
await page.screenshot({ path: '/tmp/pindou-test-1-home.png' });
|
|
|
|
const title = await page.title();
|
|
console.log(` 标题: ${title}`);
|
|
console.log(` 截图: /tmp/pindou-test-1-home.png`);
|
|
|
|
// 检查首页关键元素
|
|
const heroExists = await page.locator('.hero, .intro, [class*="hero"], [class*="intro"]').count() > 0;
|
|
console.log(` Hero 区域: ${heroExists ? '✅ 存在' : '⚠️ 未找到'}`);
|
|
|
|
// ========== 测试 2: 编辑器页面 ==========
|
|
console.log('\n📱 测试 2: 编辑器页面');
|
|
await page.goto(`${BASE_URL}/#/pages/editor/editor`, { waitUntil: 'networkidle' });
|
|
await page.waitForTimeout(2000);
|
|
await page.screenshot({ path: '/tmp/pindou-test-2-editor.png' });
|
|
console.log(` 截图: /tmp/pindou-test-2-editor.png`);
|
|
|
|
// 检查编辑器关键元素
|
|
const canvasPreview = await page.locator('canvas, .canvas-container, [class*="preview"]').count();
|
|
console.log(` Canvas/预览区域数量: ${canvasPreview}`);
|
|
|
|
// ========== 测试 3: 处理页面 ==========
|
|
console.log('\n📱 测试 3: 处理页面');
|
|
await page.goto(`${BASE_URL}/#/pages/processing/processing`, { waitUntil: 'networkidle' });
|
|
await page.waitForTimeout(2000);
|
|
await page.screenshot({ path: '/tmp/pindou-test-3-processing.png' });
|
|
console.log(` 截图: /tmp/pindou-test-3-processing.png`);
|
|
|
|
// ========== 测试 4: 结果页面(关键测试) ==========
|
|
console.log('\n📱 测试 4: 结果页面 - 检查 Canvas 空白问题');
|
|
await page.goto(`${BASE_URL}/#/pages/result/result`, { waitUntil: 'networkidle' });
|
|
|
|
// 等待可能的异步渲染
|
|
await page.waitForTimeout(3000);
|
|
|
|
// 检查 canvas 元素
|
|
const canvasElements = await page.locator('canvas').count();
|
|
console.log(` Canvas 元素数量: ${canvasElements}`);
|
|
|
|
// 获取 canvas 尺寸
|
|
const canvasInfo = await page.evaluate(() => {
|
|
const canvases = document.querySelectorAll('canvas');
|
|
return Array.from(canvases).map((c, i) => ({
|
|
index: i,
|
|
width: c.width,
|
|
height: c.height,
|
|
clientWidth: c.clientWidth,
|
|
clientHeight: c.clientHeight,
|
|
display: window.getComputedStyle(c).display,
|
|
visibility: window.getComputedStyle(c).visibility
|
|
}));
|
|
});
|
|
console.log(' Canvas 详细信息:', JSON.stringify(canvasInfo, null, 2));
|
|
|
|
// 截图结果页
|
|
await page.screenshot({ path: '/tmp/pindou-test-4-result.png', fullPage: true });
|
|
console.log(` 截图: /tmp/pindou-test-4-result.png`);
|
|
|
|
// 检查结果页关键元素
|
|
const resultElements = await page.evaluate(() => {
|
|
return {
|
|
beadPattern: document.querySelector('.bead-pattern, [class*="bead"], [class*="pattern"]') !== null,
|
|
gridContainer: document.querySelector('.grid-container, [class*="grid"]') !== null,
|
|
legend: document.querySelector('.legend, [class*="legend"]') !== null,
|
|
hasContent: document.body.innerText.length > 100
|
|
};
|
|
});
|
|
console.log(' 结果页元素检查:', resultElements);
|
|
|
|
// ========== 测试 5: 桌面端布局 ==========
|
|
console.log('\n💻 测试 5: 桌面端布局');
|
|
await context.setViewportSize({ width: 1280, height: 800 });
|
|
await page.goto(BASE_URL, { waitUntil: 'networkidle' });
|
|
await page.screenshot({ path: '/tmp/pindou-test-5-desktop.png' });
|
|
console.log(` 截图: /tmp/pindou-test-5-desktop.png`);
|
|
|
|
// ========== 控制台日志汇总 ==========
|
|
console.log('\n📋 控制台日志汇总:');
|
|
if (consoleLogs.length === 0) {
|
|
console.log(' (无控制台输出)');
|
|
} else {
|
|
consoleLogs.slice(-20).forEach(log => console.log(` ${log}`));
|
|
}
|
|
|
|
// ========== 测试报告 ==========
|
|
console.log('\n' + '='.repeat(50));
|
|
console.log('📊 测试报告');
|
|
console.log('='.repeat(50));
|
|
console.log(`✅ 首页加载: ${title.includes('拼豆') ? '通过' : '需检查'}`);
|
|
console.log(`✅ 编辑器页: ${canvasPreview > 0 ? '通过' : '需检查'}`);
|
|
console.log(`⚠️ 结果页 Canvas: ${canvasElements > 0 ? `发现 ${canvasElements} 个 canvas` : '未发现 canvas!'}`);
|
|
console.log(` Canvas 尺寸: ${canvasInfo.map(c => `${c.width}x${c.height}`).join(', ') || 'N/A'}`);
|
|
console.log(` 有内容: ${resultElements.hasContent ? '是' : '否'}`);
|
|
|
|
if (canvasElements === 0) {
|
|
console.log('\n❌ 关键问题: 结果页没有 canvas 元素!');
|
|
console.log(' 可能原因:');
|
|
console.log(' 1. 组件未正确渲染');
|
|
console.log(' 2. 条件渲染 (v-if) 阻止了 canvas 创建');
|
|
console.log(' 3. 路由跳转时数据丢失');
|
|
} else if (canvasInfo.some(c => c.width === 0 || c.height === 0)) {
|
|
console.log('\n⚠️ Canvas 尺寸为 0,可能是渲染时机问题');
|
|
}
|
|
|
|
console.log('\n📁 截图文件:');
|
|
console.log(' /tmp/pindou-test-1-home.png');
|
|
console.log(' /tmp/pindou-test-2-editor.png');
|
|
console.log(' /tmp/pindou-test-3-processing.png');
|
|
console.log(' /tmp/pindou-test-4-result.png (关键)');
|
|
console.log(' /tmp/pindou-test-5-desktop.png');
|
|
|
|
} catch (error) {
|
|
console.error('\n❌ 测试失败:', error.message);
|
|
console.error(error.stack);
|
|
} finally {
|
|
await browser.close();
|
|
console.log('\n🏁 测试结束');
|
|
}
|
|
}
|
|
|
|
runTests(); |