{ "id": "receivables-status", "name": "미수금현황 테스트", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "description": "회계관리 > 미수금현황 메뉴의 연도 선택, 정렬, 검색, 뷰 전환, 버튼 동작, 메모 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "회계관리", "level2": "미수금현황", "alternativeLevel1Names": ["회계관리", "회계 관리", "Accounting", "재무관리", "재무/회계"], "alternativeLevel2Names": ["미수금현황", "미수금 현황", "Receivables", "미수금", "미수금관리", "채권현황"], "fallbackUrls": [ "/ko/accounting/receivables", "/ko/accounting/receivables-status", "/ko/accounting/accounts-receivable", "/accounting/receivables", "/ko/finance/receivables" ], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "testFocus": { "primary": "필터/정렬/뷰 전환 및 메모 저장 기능 검증", "description": "연도 선택, 정렬, 거래처 검색, 거래처/연체 뷰 전환, 저장/새로고침/엑셀다운로드 버튼, 메모 기록 저장 확인" }, "prerequisites": { "authentication": true, "testData": { "searchKeyword": "테스트", "memoText": "테스트 메모 입력" } }, "steps": [ { "id": 0, "name": "사이드바 메뉴 전체 펼치기", "description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비", "actions": [ { "type": "evaluate", "script": "document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'})" }, { "type": "wait", "duration": 300 }, { "type": "evaluate", "script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()" }, { "type": "wait", "duration": 2000 } ], "verification": [ "사이드바가 화면에 보이는지 확인", "메뉴 항목들이 렌더링되었는지 확인" ] }, { "id": 1, "name": "1차 메뉴 찾기: 회계관리 (스크롤 포함)", "description": "사이드바를 스크롤하며 '회계관리' 메뉴를 찾아 클릭", "actions": [ { "type": "scrollAndFind", "target": "회계관리", "alternativeTexts": ["회계관리", "회계 관리", "Accounting", "재무관리"], "scrollContainer": "sidebar", "maxAttempts": 10, "description": "스크롤하며 회계관리 메뉴 찾기" }, { "type": "wait", "duration": 300 }, { "type": "click", "target": "회계관리", "description": "회계관리 메뉴 클릭" }, { "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" }, { "type": "screenshot", "name": "accounting_menu_expanded" } ], "verification": [ "회계관리 메뉴가 클릭되었는지 확인", "서브메뉴가 펼쳐졌는지 확인", "하위 메뉴 항목들이 보이는지 확인" ], "fallback": { "if": "메뉴를 찾을 수 없음", "then": "사이드바 전체를 스크롤하며 재탐색" } }, { "id": 2, "name": "2차 메뉴 찾기: 미수금현황 (스크롤 포함)", "description": "서브메뉴에서 '미수금현황'을 찾아 클릭", "actions": [ { "type": "scrollAndFind", "target": "미수금현황", "alternativeTexts": ["미수금현황", "미수금 현황", "Receivables", "미수금", "채권현황"], "scrollContainer": "submenu", "maxAttempts": 5, "description": "서브메뉴에서 미수금현황 찾기" }, { "type": "wait", "duration": 200 }, { "type": "click", "target": "미수금현황", "description": "미수금현황 메뉴 클릭" }, { "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 }, { "type": "screenshot", "name": "receivables_status_page" } ], "verification": [ "미수금현황 메뉴 클릭 성공", "페이지 이동 또는 컨텐츠 로드" ] }, { "id": 3, "name": "404 에러 감지 및 대체 경로 시도", "description": "페이지 로드 후 404 에러 여부 확인, 404시 대체 경로 탐색", "actions": [ { "type": "wait", "duration": 1000 }, { "type": "checkFor404", "indicators": [ "페이지를 찾을 수 없습니다", "404", "Not Found", "존재하지 않거나" ]}, { "type": "screenshot", "name": "page_load_result" } ], "verification": [ "현재 페이지가 404인지 확인" ], "onError404": { "description": "404 에러 발생 시 대체 URL 시도", "actions": [ { "type": "log", "message": "404 감지 - 대체 경로 탐색 시작" }, { "type": "tryAlternativeUrls", "urls": [ "/ko/accounting/receivables", "/ko/accounting/receivables-status", "/ko/accounting/accounts-receivable" ], "stopOnSuccess": true }, { "type": "ifStillFailed", "action": "navigateViaMenuClick", "description": "URL 직접 접근 실패 시 메뉴 클릭으로 재시도" } ] } }, { "id": 4, "name": "페이지 정상 로드 확인", "description": "미수금현황 페이지가 정상적으로 로드되었는지 확인", "actions": [ { "type": "verify", "target": "pageTitle", "contains": ["미수금현황", "미수금", "Receivables"] }, { "type": "verify", "target": "pageContent", "notContains": ["404", "찾을 수 없습니다", "Not Found"] } ], "verification": [ "페이지 제목 '미수금현황' 또는 관련 텍스트 표시", "404 에러 메시지 미표시", "콘텐츠가 정상 렌더링됨" ], "successCriteria": { "urlPattern": "/accounting/receivables", "requiredElements": ["미수금", "거래처", "연도"] } }, { "id": "step-5", "name": "목록 페이지 구조 확인", "description": "통계 카드, 필터, 테이블 컬럼, 버튼 구조 확인", "actions": [ { "type": "verify", "target": "페이지 구조" } ], "expected": { "filters": ["연도 선택", "검색", "정렬"], "buttons": ["저장", "새로고침", "엑셀 다운로드"], "viewSwitch": ["거래처", "연체"], "tableColumns": ["체크박스", "거래처명", "미수금액", "메모", "기타"] } }, { "id": "step-6", "name": "연도 선택 드롭다운 옵션 확인", "description": "연도 선택 드롭다운의 옵션 목록 확인", "actions": [ { "type": "click", "target": "연도 선택 드롭다운" }, { "type": "verify", "target": "드롭다운 옵션" } ], "expected": { "options": ["2024", "2025", "2026", "기타 연도"] } }, { "id": "step-7", "name": "정렬 드롭다운 옵션 확인", "description": "정렬 드롭다운의 옵션 목록 확인", "actions": [ { "type": "click", "target": "정렬 드롭다운" }, { "type": "verify", "target": "드롭다운 옵션" } ], "expected": { "options": ["미수금액 높은순", "미수금액 낮은순", "거래처명 가나다순", "최신순"] } }, { "id": "step-8", "name": "⚠️ 필수 검증: 거래처 검색 기능 테스트", "critical": true, "description": "검색창에 거래처명 입력 후 필터링 확인", "actions": [ { "type": "capture", "variable": "beforeSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 전 행 수 저장" }, { "type": "clear", "target": "검색 입력 필드" }, { "type": "type", "target": "검색 입력 필드", "value": "{prerequisites.testData.searchKeyword}" }, { "type": "wait", "duration": 1000, "description": "검색 결과 로딩 대기" }, { "type": "capture", "variable": "afterSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 후 행 수 저장" } ], "verify": { "searchApplied": true, "tableContains": "{prerequisites.testData.searchKeyword}", "dataChanged": "beforeSearchCount may differ from afterSearchCount" }, "expected": { "searchApplied": true, "filteredResults": "검색어 포함 거래처만 표시" } }, { "id": "step-8-1", "name": "검색 결과 데이터 검증", "critical": true, "description": "검색 결과의 모든 행이 검색어를 포함하는지 확인", "verify": { "allRowsContain": "{prerequisites.testData.searchKeyword}", "columnToCheck": "거래처명" } }, { "id": "step-8-2", "name": "검색 초기화 확인", "actions": [ { "type": "clear", "target": "검색 입력 필드" }, { "type": "wait", "duration": 500 }, { "type": "capture", "variable": "afterClearCount", "selector": "table tbody tr", "extract": "count" } ], "verify": { "dataRestored": "afterClearCount should equal beforeSearchCount" } }, { "id": "step-9", "name": "거래처/연체 Switch 버튼 전환 테스트", "description": "Switch 버튼 클릭하여 뷰 전환 확인", "actions": [ { "type": "click", "target": "Switch 버튼" }, { "type": "wait", "target": "뷰 전환 완료" } ], "expected": { "viewChanged": true, "tableColumnsChanged": "뷰에 맞는 컬럼 표시" } }, { "id": "step-10", "name": "새로고침 버튼 동작 확인", "description": "새로고침 버튼 클릭 시 데이터 리로드 확인", "actions": [ { "type": "click", "target": "새로고침 버튼" }, { "type": "wait", "target": "데이터 리로드" } ], "expected": { "buttonClicked": true, "dataReloaded": true } }, { "id": "step-11", "name": "엑셀 다운로드 버튼 동작 확인", "description": "엑셀 다운로드 버튼 클릭 시 파일 다운로드 확인", "actions": [ { "type": "click", "target": "엑셀 다운로드 버튼" }, { "type": "wait", "target": "다운로드 처리" }, { "type": "verify", "target": "Network Request 또는 다운로드 이벤트" } ], "expected": { "buttonClicked": true, "apiCall": "GET/POST export API", "downloadEvent": "파일 다운로드 발생" } }, { "id": "step-12", "name": "메모 기록 입력 및 저장", "description": "첫 번째 행의 메모 필드에 테스트 메모 입력 후 저장", "actions": [ { "type": "click", "target": "첫 번째 행 메모 필드" }, { "type": "clear", "target": "메모 필드" }, { "type": "type", "target": "메모 필드", "value": "테스트 메모 입력" }, { "type": "click", "target": "저장 버튼" }, { "type": "wait", "target": "저장 처리 완료" } ], "expected": { "memoEntered": "테스트 메모 입력", "apiCall": "POST/PUT /accounting/receivables", "successMessage": "저장 완료 토스트" } } ], "cleanup": { "description": "테스트 후 입력된 메모 원복 (필요시)", "actions": [] }, "notes": [ "직접 URL 접근 금지: 반드시 메뉴 클릭으로 페이지 진입 (404 방지)", "스크롤 필수: 사이드바가 길 경우 메뉴가 화면 밖에 있을 수 있음", "대체 경로: 메뉴명이 변경되었을 수 있으므로 다양한 이름으로 탐색", "메뉴 계층: 회계관리 > 미수금현황", "엑셀 다운로드는 Network Request 및 실제 다운로드 이벤트 확인 필수" ] }