// 3D 开合对比验证 v2(真实点击滑轨): node scripts/open-compare.mjs <开度0-100> import puppeteer from 'puppeteer-core' const EDGE = 'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe' const token = process.argv[2] const target = Math.min(100, Math.max(0, parseInt(process.argv[3] || '100'))) const browser = await puppeteer.launch({ executablePath: EDGE, headless: 'new', args: ['--window-size=1440,900', '--enable-unsafe-swiftshader', '--use-gl=angle', '--use-angle=swiftshader'], defaultViewport: { width: 1440, height: 900 }, }) const page = await browser.newPage() await page.goto(`http://localhost:8000/threed?token=${encodeURIComponent(token)}`, { waitUntil: 'networkidle2' }) await new Promise(r => setTimeout(r, 2200)) const cv = await (await page.$('.threed-wrap canvas')).boundingBox() await page.screenshot({ path: 'D:/Code/huamenchuang/shots/open-0.png', clip: cv }) // 真实按压-移动-释放驱动 el-slider(滑块手柄为 div, 需完整按压序列) const handle = await page.$('.ctrl .el-slider__button') const hr = await handle.boundingBox() await page.mouse.move(hr.x + hr.width / 2, hr.y + hr.height / 2) await page.mouse.down() const runway = await page.$('.ctrl .el-slider__runway') const rr = await runway.boundingBox() const steps = 12 for (let i = 1; i <= steps; i++) { const t = i / steps await page.mouse.move(rr.x + rr.width * target / 100 * 1, hr.y + hr.height / 2, { steps: 1 }) await new Promise(r2 => setTimeout(r2, 40)) } await page.mouse.up() await new Promise(r => setTimeout(r, 1500)) await page.screenshot({ path: 'D:/Code/huamenchuang/shots/open-100.png', clip: cv }) console.log(`✓ 开合 ${target}% 两态截图完成`) await browser.close()