143 lines
6.2 KiB
TypeScript
143 lines
6.2 KiB
TypeScript
/**
|
|
* 화면 1244 새로고침 검증 (2차)
|
|
* - 3초 대기 후 스크린샷
|
|
* - data-screen-runtime, 테이블 관련 div width 확인
|
|
* - 가로 스크롤 가능 여부 확인
|
|
*/
|
|
|
|
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 } });
|
|
const page = await context.newPage();
|
|
|
|
try {
|
|
// 로그인
|
|
await page.goto(`${BASE_URL}/login`, { waitUntil: "load", timeout: 30000 });
|
|
await page.waitForTimeout(1000);
|
|
await page.fill("#userId", "wace");
|
|
await page.fill("#password", "qlalfqjsgh11");
|
|
await page.locator('button[type="submit"]').first().click();
|
|
await page.waitForURL((u) => !u.includes("/login"), { timeout: 15000 }).catch(() => {});
|
|
await page.waitForTimeout(2000);
|
|
|
|
// /screens/1244 접속
|
|
await page.goto(`${BASE_URL}/screens/1244`, { waitUntil: "load", timeout: 45000 });
|
|
await page.getByText("로딩중", { exact: false }).waitFor({ state: "hidden", timeout: 10000 }).catch(() => {});
|
|
await page.waitForTimeout(2000);
|
|
|
|
// Step 1: 새로고침 (Ctrl+Shift+R)
|
|
console.log("Step 1: 새로고침 (Ctrl+Shift+R)...");
|
|
await page.keyboard.press("Control+Shift+r");
|
|
await page.waitForLoadState("load");
|
|
console.log("Step 2: 3초 대기...");
|
|
await page.waitForTimeout(3000);
|
|
await page.getByText("로딩중", { exact: false }).waitFor({ state: "hidden", timeout: 8000 }).catch(() => {});
|
|
|
|
// Step 3: 첫 스크린샷
|
|
await page.screenshot({ path: path.join(SCREENSHOT_DIR, "verify-08.png"), fullPage: true });
|
|
console.log("verify-08.png 저장");
|
|
|
|
// Step 4: JavaScript로 width 확인 (순수 함수로 작성)
|
|
const dims = await page.evaluate(() => {
|
|
const screenRuntime = document.querySelector("[data-screen-runtime]");
|
|
const table = document.querySelector("table");
|
|
const tableContainer = table?.closest("[style*='overflow'], [class*='overflow']");
|
|
const overflowHiddenDiv = table?.closest("[style*='overflow-hidden'], [class*='overflow-hidden']");
|
|
|
|
const tableAncestors: Array<{ level: number; tag: string; class: string; offsetWidth: number; scrollWidth: number; clientWidth: number; overflowX: string }> = [];
|
|
let p = table?.parentElement;
|
|
let idx = 0;
|
|
while (p && idx < 6) {
|
|
const s = window.getComputedStyle(p);
|
|
tableAncestors.push({
|
|
level: idx,
|
|
tag: p.tagName,
|
|
class: (p.className && typeof p.className === "string" ? p.className : "").slice(0, 60),
|
|
offsetWidth: p.offsetWidth,
|
|
scrollWidth: p.scrollWidth,
|
|
clientWidth: p.clientWidth,
|
|
overflowX: s.overflowX,
|
|
});
|
|
p = p.parentElement;
|
|
idx++;
|
|
}
|
|
|
|
return {
|
|
screenRuntime: screenRuntime
|
|
? { offsetWidth: (screenRuntime as HTMLElement).offsetWidth, scrollWidth: (screenRuntime as HTMLElement).scrollWidth, clientWidth: (screenRuntime as HTMLElement).clientWidth }
|
|
: null,
|
|
table: table
|
|
? { offsetWidth: (table as HTMLElement).offsetWidth, scrollWidth: (table as HTMLElement).scrollWidth, clientWidth: (table as HTMLElement).clientWidth }
|
|
: null,
|
|
tableContainer: tableContainer
|
|
? { offsetWidth: (tableContainer as HTMLElement).offsetWidth, scrollWidth: (tableContainer as HTMLElement).scrollWidth, clientWidth: (tableContainer as HTMLElement).clientWidth }
|
|
: null,
|
|
overflowHiddenDiv: overflowHiddenDiv
|
|
? { offsetWidth: (overflowHiddenDiv as HTMLElement).offsetWidth, scrollWidth: (overflowHiddenDiv as HTMLElement).scrollWidth, clientWidth: (overflowHiddenDiv as HTMLElement).clientWidth }
|
|
: null,
|
|
tableAncestors,
|
|
viewport: { innerWidth: window.innerWidth },
|
|
};
|
|
});
|
|
|
|
console.log("\n=== JavaScript 실행 결과 ===");
|
|
console.log("data-screen-runtime div:");
|
|
if (dims.screenRuntime) {
|
|
console.log(" offsetWidth:", dims.screenRuntime.offsetWidth);
|
|
console.log(" scrollWidth:", dims.screenRuntime.scrollWidth);
|
|
console.log(" clientWidth:", dims.screenRuntime.clientWidth);
|
|
} else {
|
|
console.log(" (없음)");
|
|
}
|
|
console.log("\n테이블:");
|
|
if (dims.table) {
|
|
console.log(" offsetWidth:", dims.table.offsetWidth);
|
|
console.log(" scrollWidth:", dims.table.scrollWidth);
|
|
}
|
|
console.log("\n테이블 컨테이너 (overflow):");
|
|
if (dims.tableContainer) {
|
|
console.log(" offsetWidth:", dims.tableContainer.offsetWidth);
|
|
console.log(" scrollWidth:", dims.tableContainer.scrollWidth);
|
|
console.log(" clientWidth:", dims.tableContainer.clientWidth);
|
|
}
|
|
console.log("\noverflow-hidden div:");
|
|
if (dims.overflowHiddenDiv) {
|
|
console.log(" offsetWidth:", dims.overflowHiddenDiv.offsetWidth);
|
|
console.log(" scrollWidth:", dims.overflowHiddenDiv.scrollWidth);
|
|
} else {
|
|
console.log(" (없음)");
|
|
}
|
|
console.log("\n테이블 조상 div들 (width):");
|
|
dims.tableAncestors?.forEach((a) => {
|
|
console.log(` L${a.level} ${a.tag} overflow=${a.overflowX} offsetW=${a.offsetWidth} scrollW=${a.scrollWidth} clientW=${a.clientWidth}`);
|
|
});
|
|
|
|
// Step 5: 가로 스크롤 가능 여부
|
|
const canScroll = dims.table && dims.tableContainer && dims.table.scrollWidth > dims.tableContainer.clientWidth;
|
|
console.log("\n가로 스크롤 가능:", canScroll, "(테이블 scrollWidth > 컨테이너 clientWidth)");
|
|
|
|
// Step 6: 최종 스크린샷
|
|
await page.screenshot({ path: path.join(SCREENSHOT_DIR, "verify-09.png"), fullPage: true });
|
|
console.log("\nverify-09.png 저장");
|
|
|
|
fs.writeFileSync(
|
|
path.join(SCREENSHOT_DIR, "verify-refresh2-result.json"),
|
|
JSON.stringify({ ...dims, canScroll }, null, 2)
|
|
);
|
|
} catch (error: any) {
|
|
console.error("오류:", error.message);
|
|
await page.screenshot({ path: path.join(SCREENSHOT_DIR, "verify-99-error.png"), fullPage: true }).catch(() => {});
|
|
} finally {
|
|
await browser.close();
|
|
}
|
|
}
|
|
|
|
main();
|