import { chromium } from "playwright"; async function debugApp() { console.log("πŸš€ Playwright 디버깅 μ‹œμž‘..."); const browser = await chromium.launch({ headless: false }); const context = await browser.newContext({ viewport: { width: 1280, height: 720 }, }); const page = await context.newPage(); // μ½˜μ†” λ©”μ‹œμ§€ 캐치 page.on("console", (msg) => { const type = msg.type(); const text = msg.text(); console.log(`[CONSOLE ${type.toUpperCase()}] ${text}`); }); // μ—λŸ¬ 캐치 page.on("pageerror", (error) => { console.log(`[PAGE ERROR] ${error.message}`); console.log(`[STACK] ${error.stack}`); }); // λ„€νŠΈμ›Œν¬ μš”μ²­ λͺ¨λ‹ˆν„°λ§ page.on("request", (request) => { console.log(`[REQUEST] ${request.method()} ${request.url()}`); }); page.on("response", (response) => { const status = response.status(); const url = response.url(); if (status >= 400) { console.log(`[RESPONSE ERROR] ${status} ${url}`); } }); try { console.log("πŸ“± localhost:3000 접속 쀑..."); await page.goto("http://localhost:3000", { waitUntil: "networkidle" }); // νŽ˜μ΄μ§€ 타이틀 확인 const title = await page.title(); console.log(`πŸ“„ νŽ˜μ΄μ§€ 타이틀: ${title}`); // Root μ—˜λ¦¬λ¨ΌνŠΈ 확인 const rootContent = await page.evaluate(() => { const root = document.getElementById("root"); return { exists: !!root, innerHTML: root ? root.innerHTML.substring(0, 200) : null, children: root ? root.children.length : 0, }; }); console.log(`🎯 Root μ—˜λ¦¬λ¨ΌνŠΈ:`, rootContent); // ν™˜κ²½ λ³€μˆ˜ 확인 (λ‹¨μˆœν™”) const envVars = await page.evaluate(() => { return { hasGlobalVars: typeof window !== "undefined", location: window.location.href, }; }); console.log(`πŸ”‘ ν™˜κ²½ λ³€μˆ˜:`, envVars); // React μ•± μƒνƒœ 확인 const reactStatus = await page.evaluate(() => { return { reactExists: !!window.React, hasErrors: window.__REACT_ERROR__ || false, querySelector: !!document.querySelector("[data-reactroot]"), }; }); console.log(`βš›οΈ React μƒνƒœ:`, reactStatus); // 슀크립트 νƒœκ·Έ 확인 const scripts = await page.evaluate(() => { const scriptTags = Array.from(document.querySelectorAll("script[src]")); return scriptTags.map((script) => ({ src: script.src, type: script.type || "text/javascript", })); }); console.log(`πŸ“œ λ‘œλ“œλœ 슀크립트:`, scripts.length, "개"); scripts.forEach((script, i) => { console.log(` ${i + 1}. ${script.src}`); }); // 5초 λŒ€κΈ°ν•˜μ—¬ React μ•± λ‘œλ”© 확인 console.log("⏳ 5초 λŒ€κΈ° 쀑..."); await page.waitForTimeout(5000); // μ΅œμ’… μƒνƒœ 확인 const finalStatus = await page.evaluate(() => { const root = document.getElementById("root"); return { rootHTML: root ? root.innerHTML.substring(0, 500) : null, bodyClasses: document.body.className, hasVisibleContent: document.body.children.length > 1, }; }); console.log(`🎬 μ΅œμ’… μƒνƒœ:`, finalStatus); // μŠ€ν¬λ¦°μƒ· 촬영 await page.screenshot({ path: "debug-screenshot.png", fullPage: true }); console.log("πŸ“Έ μŠ€ν¬λ¦°μƒ· μ €μž₯됨: debug-screenshot.png"); } catch (error) { console.error("❌ μ—λŸ¬ λ°œμƒ:", error.message); console.error("μŠ€νƒ:", error.stack); } // λΈŒλΌμš°μ €λ₯Ό 5μ΄ˆκ°„ 열어두고 μˆ˜λ™ 확인 κ°€λŠ₯ν•˜κ²Œ 함 console.log("πŸ” λΈŒλΌμš°μ €λ₯Ό 5μ΄ˆκ°„ μ—΄μ–΄λ‘‘λ‹ˆλ‹€..."); await page.waitForTimeout(5000); await browser.close(); console.log("βœ… 디버깅 μ™„λ£Œ"); } debugApp().catch(console.error);