const { chromium } = require("playwright"); async function testVercelDeployment() { console.log("πŸš€ Vercel 배포 μƒνƒœ ν…ŒμŠ€νŠΈ μ‹œμž‘"); const browser = await chromium.launch({ headless: true }); const page = await browser.newPage(); try { console.log("πŸ“‘ https://zellyy-finance.vercel.app/ 접속 쀑..."); // νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œκ°„ μΈ‘μ • const startTime = Date.now(); // νŽ˜μ΄μ§€ λ‘œλ“œ - 30초 νƒ€μž„μ•„μ›ƒ μ„€μ • await page.goto("https://zellyy-finance.vercel.app/", { waitUntil: "networkidle", timeout: 30000, }); const loadTime = Date.now() - startTime; console.log(`⏱️ νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œκ°„: ${loadTime}ms`); // νŽ˜μ΄μ§€ λ‚΄μš© 확인 const title = await page.title(); console.log(`πŸ“„ νŽ˜μ΄μ§€ 제λͺ©: "${title}"`); // HTML λ‚΄μš© 확인 const htmlContent = await page.content(); console.log(`πŸ“ HTML 길이: ${htmlContent.length} 문자`); // BasicApp κ΄€λ ¨ μš”μ†Œ 확인 const hasBasicApp = htmlContent.includes("BasicApp") || htmlContent.includes("Zellyy Finance - κΈ°λ³Έ ν…ŒμŠ€νŠΈ"); console.log( `πŸ” BasicApp 컨텐츠 감지: ${hasBasicApp ? "βœ… 찾음" : "❌ μ—†μŒ"}` ); // React 앱이 λ Œλ”λ§λ˜μ—ˆλŠ”μ§€ 확인 const hasReactContent = htmlContent.includes("React 앱이 μ •μƒμ μœΌλ‘œ") || htmlContent.includes("ν™˜κ²½ 정보"); console.log( `βš›οΈ React 컨텐츠 감지: ${hasReactContent ? "βœ… 찾음" : "❌ μ—†μŒ"}` ); // μ—λŸ¬ μš”μ†Œ 확인 const errorElements = await page.$$('[class*="error"], [id*="error"]'); console.log(`🚨 μ—λŸ¬ μš”μ†Œ 수: ${errorElements.length}`); // μ½˜μ†” λ©”μ‹œμ§€ 확인 const consoleLogs = []; page.on("console", (msg) => { consoleLogs.push(`${msg.type()}: ${msg.text()}`); }); // νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ λ‘œλ“œν•΄μ„œ μ½˜μ†” λ©”μ‹œμ§€ 캑처 await page.reload({ waitUntil: "networkidle" }); console.log("\nπŸ“Š μ½˜μ†” λ©”μ‹œμ§€:"); consoleLogs.forEach((log) => console.log(` ${log}`)); // μŠ€ν¬λ¦°μƒ· 찍기 await page.screenshot({ path: "vercel-deployment-test.png", fullPage: true, }); console.log("πŸ“Έ μŠ€ν¬λ¦°μƒ· μ €μž₯: vercel-deployment-test.png"); // DOM λ‚΄μš© κ°„λ‹¨νžˆ 확인 const bodyText = await page.locator("body").textContent(); console.log(`\nπŸ“‹ νŽ˜μ΄μ§€ λ‚΄μš© 미리보기 (첫 200자):`); console.log(bodyText.substring(0, 200) + "..."); // ν™˜κ²½ λ³€μˆ˜ 정보 확인 (νŽ˜μ΄μ§€μ— ν‘œμ‹œλ˜λŠ” 경우) const hasEnvInfo = bodyText.includes("ν™˜κ²½:") || bodyText.includes("Clerk Key:"); console.log(`πŸ”§ ν™˜κ²½ 정보 ν‘œμ‹œ: ${hasEnvInfo ? "βœ… 있음" : "❌ μ—†μŒ"}`); } catch (error) { console.error("❌ ν…ŒμŠ€νŠΈ 쀑 였λ₯˜ λ°œμƒ:", error.message); // λ„€νŠΈμ›Œν¬ 였λ₯˜μΈμ§€ 확인 if (error.message.includes("net::") || error.message.includes("TIMEOUT")) { console.log("🌐 λ„€νŠΈμ›Œν¬ μ—°κ²° 문제둜 λ³΄μž…λ‹ˆλ‹€."); } // μŠ€ν¬λ¦°μƒ· 찍기 (였λ₯˜ 상황) try { await page.screenshot({ path: "vercel-deployment-error.png", fullPage: true, }); console.log("πŸ“Έ 였λ₯˜ μŠ€ν¬λ¦°μƒ· μ €μž₯: vercel-deployment-error.png"); } catch (screenshotError) { console.log("πŸ“Έ μŠ€ν¬λ¦°μƒ· μ €μž₯ μ‹€νŒ¨"); } } finally { await browser.close(); console.log("🏁 ν…ŒμŠ€νŠΈ μ™„λ£Œ"); } } // ν…ŒμŠ€νŠΈ μ‹€ν–‰ testVercelDeployment().catch(console.error);