import {chromium} from 'playwright'; const url = process.argv[2] || 'http://localhost/s/stay'; const b = await chromium.launch({channel: 'chrome'}); const page = await b.newPage({viewport: {width: 1280, height: 900}}); await page.goto(url, {waitUntil: 'domcontentloaded'}); await page.waitForTimeout(5000); // 일정 레일을 화면 안에 둔다 await page.evaluate(() => document.querySelector('#itinerary').scrollIntoView({block: 'center'})); await page.waitForTimeout(1500); // 스크롤 이벤트가 언제 오는지 센다 await page.evaluate(() => { window.__log = []; window.addEventListener('scroll', (e) => { window.__log.push({t: Date.now(), trusted: e.isTrusted, tag: e.target === document ? 'document' : (e.target.className || '').toString().slice(0, 30)}); }, true); const rail = document.querySelector('#itinerary .slider-viewport'); window.__rail = rail; window.__pos = () => { const c = rail.firstElementChild; return Math.round(new DOMMatrix(getComputedStyle(c).transform).m41); }; window.__t0 = Date.now(); }); const pos0 = await page.evaluate(() => window.__pos()); // 손으로 세로 스크롤 한 번 await page.mouse.move(640, 500); await page.mouse.wheel(0, 200); const marks = []; for (let i = 1; i <= 20; i++) { await page.waitForTimeout(1000); marks.push(await page.evaluate((p0) => ({s: Math.round((Date.now() - window.__t0) / 1000), d: window.__pos() - p0}), pos0)); } const log = await page.evaluate(() => window.__log.map((l) => ({s: +((l.t - window.__t0) / 1000).toFixed(1), tr: l.trusted, tag: l.tag}))); console.log('이동:', marks.map((m) => `${m.s}s:${m.d}`).join(' ')); console.log('scroll 이벤트 수:', log.length, '· 마지막 5건:', JSON.stringify(log.slice(-5))); await b.close();