/** * 수주관리 화면(68) 검증 스크립트 * - 로그인 상태 확인 후 필요시 로그인 * - /screens/68 접속 * - 테이블, 검색 필터, 버튼 확인 */ import { chromium } from "playwright"; import * as path from "path"; import * as fs from "fs"; const BASE_URL = "http://localhost:9771"; const SCREENSHOT_DIR = path.join(__dirname, "../verification-screenshots"); async function main() { const browser = await chromium.launch({ headless: true }); const context = await browser.newContext({ viewport: { width: 1280, height: 900 }, storageState: undefined, // 새 세션 (쿠키 유지 안 함 - 이전 세션 로그인 상태 확인용) }); const page = await context.newPage(); const steps: { step: string; success: boolean; message?: string }[] = []; try { // Step 1: 로그인 페이지 접속 및 로그인 (Playwright는 매번 새 브라우저이므로 항상 로그인 필요) console.log("Step 1: 로그인..."); await page.goto(`${BASE_URL}/login`, { waitUntil: "domcontentloaded", timeout: 15000 }); await page.waitForTimeout(1000); await page.screenshot({ path: path.join(SCREENSHOT_DIR, "s68-01-login-page.png"), fullPage: true }); await page.fill("#userId", "wace"); await page.fill("#password", "qlalfqjsgh11"); await page.screenshot({ path: path.join(SCREENSHOT_DIR, "s68-02-login-filled.png"), fullPage: true }); await page.locator('button[type="submit"]').first().click(); await page.waitForTimeout(3000); steps.push({ step: "로그인", success: true }); // Step 2: /screens/68 접속 console.log("Step 2: /screens/68 접속..."); await page.goto(`${BASE_URL}/screens/68`, { waitUntil: "domcontentloaded", timeout: 15000 }); // 5초 대기 (페이지 완전 로드) console.log("Step 3: 5초 대기 (페이지 완전 로드)..."); await page.waitForTimeout(5000); await page.screenshot({ path: path.join(SCREENSHOT_DIR, "s68-03-screen-loaded.png"), fullPage: true }); steps.push({ step: "/screens/68 접속 및 5초 대기", success: true }); // Step 3: 요소 검증 console.log("Step 3: 요소 검증..."); const hasError = await page.locator('text="화면을 찾을 수 없습니다"').count() > 0; if (hasError) { steps.push({ step: "화면 로드", success: false, message: "404 - 화면을 찾을 수 없습니다" }); } else { // 테이블 (TableListComponent: role=grid, table, thead/tbody) const tableSelectors = [ "table", "[role='grid']", "[role='table']", "thead", "tbody", ".table-mobile-fixed", "[class*='ag-']", "[class*='table-list']", ]; let tableFound = false; for (const sel of tableSelectors) { if ((await page.locator(sel).count()) > 0) { tableFound = true; break; } } // 검색/필터 (input, select, 테이블 툴바 검색/필터 버튼) const filterSelectors = [ "input", "select", 'input[type="text"]', 'input[type="search"]', 'input[placeholder*="검색"]', "button:has-text('검색')", "button:has-text('필터')", "[class*='filter']", "[class*='search']", ]; let filterFound = false; for (const sel of filterSelectors) { if ((await page.locator(sel).count()) > 0) { filterFound = true; break; } } // 버튼 const buttonCount = await page.locator("button, [role='button'], input[type='submit']").count(); const buttonsFound = buttonCount > 0; steps.push({ step: "화면 요소 검증", success: tableFound && filterFound && buttonsFound, message: `테이블: ${tableFound ? "O" : "X"}, 검색: ${filterFound ? "O" : "X"}, 버튼: ${buttonsFound ? "O" : "X"}`, }); await page.screenshot({ path: path.join(SCREENSHOT_DIR, "s68-04-verified.png"), fullPage: true }); const finalSuccess = tableFound && filterFound && buttonsFound && !hasError; console.log("\n=== 검증 결과 ==="); steps.forEach((s) => console.log(`${s.step}: ${s.success ? "성공" : "실패"}${s.message ? ` - ${s.message}` : ""}`)); console.log(`\n최종 판정: ${finalSuccess ? "성공" : "실패"}`); fs.writeFileSync( path.join(SCREENSHOT_DIR, "s68-result.json"), JSON.stringify( { steps, checks: { table: tableFound, filter: filterFound, buttons: buttonsFound }, finalSuccess: finalSuccess ? "성공" : "실패", }, null, 2 ) ); } } catch (error: any) { console.error("오류:", error.message); await page.screenshot({ path: path.join(SCREENSHOT_DIR, "s68-99-error.png"), fullPage: true }).catch(() => {}); steps.push({ step: "오류", success: false, message: error.message }); } finally { await browser.close(); } } main();