import puppeteer from 'puppeteer-core' import path from 'path' const browser = await puppeteer.launch({ executablePath: 'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe', headless: 'new', args: ['--window-size=1440,900', '--enable-unsafe-swiftshader'], defaultViewport: { width: 1440, height: 900 }, }) const page = await browser.newPage() const errs = [] page.on('pageerror', e => errs.push(String(e).slice(0, 120))) const token = process.argv[2] const sketch = process.argv[3] await page.goto(`http://localhost:8000/ai_render?token=${encodeURIComponent(token)}`, { waitUntil: 'networkidle2' }) await new Promise(r => setTimeout(r, 2000)) await page.evaluate(() => { [...document.querySelectorAll('.el-radio-button')].find(b => b.textContent.includes('工程大样图'))?.querySelector('input')?.click() }) await new Promise(r => setTimeout(r, 800)) // 1) 上传草图 const input = await page.$('.el-upload input[type=file]') await input.uploadFile(path.resolve(sketch)) await new Promise(r => setTimeout(r, 1500)) await page.screenshot({ path: '../shots/opt-1-upload.png' }) // 2) 旋转 90°(验证转正) await page.evaluate(() => { const btn = [...document.querySelectorAll('.el-dialog button, button')].find(b => b.textContent.includes('↻ 旋转')) btn?.click() }) await new Promise(r => setTimeout(r, 800)) await page.screenshot({ path: '../shots/opt-2-rot.png' }) // 3) 框选左上窗区域(canvas 显示坐标前 1/3) const box = await page.evaluate(() => { const cv = document.querySelector('.bp-cv') if (!cv) return null const b = cv.getBoundingClientRect() return { x: b.x, y: b.y, w: b.width, h: b.height } }) if (!box) { console.log('无草图 canvas'); process.exit(1) } await page.mouse.move(box.x + box.w * 0.05, box.y + box.h * 0.05) await page.mouse.down() await page.mouse.move(box.x + box.w * 0.42, box.y + box.h * 0.95, { steps: 8 }) await page.mouse.up() await new Promise(r => setTimeout(r, 600)) await page.screenshot({ path: '../shots/opt-3-crop.png' }) // 4) 生成(框选生效→裁剪底图) await page.evaluate(() => { [...document.querySelectorAll('button')].find(b => b.textContent.includes('AI 生成大样图'))?.click() }) let done = false for (let i = 0; i < 110; i++) { await new Promise(r => setTimeout(r, 2000)) done = await page.evaluate(() => { const cmp = document.querySelector('.bp-compare') return !!(cmp && cmp.querySelectorAll('img').length >= 2) }) if (done) break } await new Promise(r => setTimeout(r, 800)) await page.screenshot({ path: '../shots/opt-4-result.png' }) console.log(done ? '全流程成功(上传→旋转→框选→生成→并排对比)' : '超时', '| 异常:', errs.length ? errs.join('|') : '无') await browser.close()