{ "id": "deposit-management", "name": "입금관리 테스트", "screenshotPolicy": { "onErrorOnly": true, "captureOn": [ "error", "fail", "timeout", "404", "500", "blocked" ] }, "description": "입금관리 목록 조회, 계정과목명 일괄변경, 상세 수정 기능 E2E 테스트", "baseUrl": "https://dev.codebridge-x.com", "url": "/ko/accounting/deposits", "navigation": { "targetUrl": "/accounting/deposits", "urlPattern": "/accounting/deposits|/ko/accounting/deposits", "menuHints": [ "입금관리", "입금 관리", "회계관리" ] }, "menuNavigation": { "level1": "회계관리", "level2": "입금관리", "expectedUrl": "/ko/accounting/deposits", "searchWithinParent": true, "closeOtherMenus": true }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "회계관리", "level2": "입금관리", "alternativeLevel1Names": [ "회계관리", "회계 관리", "Accounting" ], "alternativeLevel2Names": [ "입금관리", "입금 관리", "Deposits" ], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "timeout": 60000, "tags": [ "accounting", "deposit", "crud" ], "auth": { "username": "TestUser5", "password": "password123!" }, "steps": [ { "id": 1, "name": "사이드바 메뉴 전체 펼치기", "description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비", "action": "evaluate", "script": "(async()=>{document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'});await new Promise(r=>setTimeout(r,300));Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.includes('모두 펼치기'))?.click();await new Promise(r=>setTimeout(r,2000));return 'sidebar expanded';})()" }, { "id": 2, "name": "2단계 메뉴 진입: 회계관리 > 입금관리", "description": "사이드바를 스크롤하며 회계관리 > 입금관리 메뉴를 찾아 클릭", "action": "menu_navigate", "level1": "회계관리", "level2": "입금관리", "expect": { "url": "/accounting/deposits", "visible": [ "입금관리", "총 입금" ] }, "verification": [ "회계관리 메뉴가 펼쳐졌는지 확인", "입금관리 서브메뉴 클릭 성공", "404 에러 없이 페이지 로드 완료" ] }, { "id": 3, "name": "목록 페이지 구조 확인", "description": "테이블 및 필터 요소 확인", "action": "verify_element", "target": "body", "expect": { "visible": [ "입금일", "입금계좌", "입금자명", "입금금액", "거래처", "적요", "입금유형" ], "elements": { "statisticsCards": [ "총 입금", "당월 입금", "거래처 미설정", "입금유형 미설정" ], "filters": [ "계정과목명", "저장", "새로고침" ], "pagination": true } } }, { "id": 4, "name": "계정과목명 드롭다운 옵션 확인", "description": "계정과목명 일괄변경 드롭다운 옵션 검증", "action": "click_if_exists", "target": "계정과목명 드롭다운", "expect": { "options": [ "미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타" ] } }, { "id": 5, "name": "체크박스 선택 후 계정과목명 일괄변경", "description": "테이블 행 선택 후 계정과목명 일괄변경 저장", "action": "evaluate", "script": "(async()=>{const cb=document.querySelector('table tbody tr input[type=\"checkbox\"]');if(cb){cb.click();await new Promise(r=>setTimeout(r,500));}const dd=Array.from(document.querySelectorAll('button,select,[role=\"combobox\"]')).find(el=>el.innerText?.includes('계정과목명')||el.getAttribute('aria-label')?.includes('계정과목명'));if(dd){dd.click();await new Promise(r=>setTimeout(r,500));}const opt=Array.from(document.querySelectorAll('[role=\"option\"],li,button')).find(el=>el.innerText?.trim()==='매출대금');if(opt){opt.click();await new Promise(r=>setTimeout(r,500));}const saveBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='저장');if(saveBtn){saveBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'batch update attempted';})()", "expect": { "dialog": "확인 다이얼로그 표시", "toast": "변경 완료 메시지" } }, { "id": 6, "name": "필수 검증: 계정과목명 변경 데이터 반영 확인", "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 테이블에서 변경된 입금유형 값 확인", "action": "verify_element", "target": "body", "expect": { "tableCell": { "row": 1, "column": "입금유형", "value": "매출대금" } }, "knownBugReference": "BUG-SALES-20260115-001 (매출관리 동일 버그 확인 필요)" }, { "id": 7, "name": "입금 상세 페이지 이동", "description": "테이블 행 클릭하여 상세 페이지로 이동", "action": "click_first_row", "expect": { "url": "/accounting/deposits/{id}", "visible": [ "입금 상세", "기본 정보", "목록", "삭제", "수정" ] } }, { "id": 8, "name": "상세 페이지 읽기 모드 필드 확인", "description": "수정 전 필드들이 비활성화 상태인지 확인", "action": "verify_element", "target": "body", "expect": { "fields": [ { "name": "입금일", "disabled": true }, { "name": "입금계좌", "disabled": true }, { "name": "입금자명", "disabled": true }, { "name": "입금금액", "disabled": true }, { "name": "적요", "disabled": true }, { "name": "거래처", "disabled": true }, { "name": "입금 유형", "disabled": true } ] } }, { "id": 9, "name": "수정 모드 전환", "description": "수정 버튼 클릭하여 편집 모드로 전환", "action": "click_if_exists", "target": "수정", "expect": { "url": "/accounting/deposits/{id}?mode=edit", "visible": [ "입금 수정", "취소", "저장" ], "notVisible": [ "목록", "삭제", "수정" ] } }, { "id": 10, "name": "수정 모드 필드 활성화 검증", "description": "수정 가능한 필드와 불가능한 필드 확인", "action": "verify_element", "target": "body", "expect": { "fields": [ { "name": "입금일", "disabled": true, "note": "은행데이터 - 수정 불가" }, { "name": "입금계좌", "disabled": true, "note": "은행데이터 - 수정 불가" }, { "name": "입금자명", "disabled": true, "note": "은행데이터 - 수정 불가" }, { "name": "입금금액", "disabled": true, "note": "은행데이터 - 수정 불가" }, { "name": "적요", "disabled": false, "editable": true }, { "name": "거래처", "disabled": false, "type": "combobox", "editable": true }, { "name": "입금 유형", "disabled": false, "type": "combobox", "editable": true } ] } }, { "id": 11, "name": "거래처 드롭다운 옵션 확인", "description": "거래처 선택 드롭다운 옵션 검증", "action": "click_if_exists", "target": "거래처 드롭다운", "expect": { "options": [ "거래처테스트", "아크더레드", "코브라브릿지", "가우스전자", "아크아크" ] } }, { "id": 12, "name": "입금 유형 드롭다운 옵션 확인", "description": "입금 유형 선택 드롭다운 옵션 검증", "action": "click_if_exists", "target": "입금 유형 드롭다운", "expect": { "options": [ "미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타" ] } }, { "id": 13, "name": "수정 데이터 입력", "description": "수정 가능한 필드에 테스트 데이터 입력", "action": "evaluate", "script": "(async()=>{const inputs=document.querySelectorAll('input,textarea');const memo=Array.from(inputs).find(el=>el.getAttribute('name')?.includes('적요')||el.getAttribute('placeholder')?.includes('적요')||el.closest('[class*=\"memo\"],label')?.innerText?.includes('적요'));if(memo){memo.focus();memo.value='';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.value='테스트 적요 수정';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.dispatchEvent(new Event('change',{bubbles:true}));await new Promise(r=>setTimeout(r,500));}const vendorDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('거래처')||el.getAttribute('aria-label')?.includes('거래처'));if(vendorDD){vendorDD.click();await new Promise(r=>setTimeout(r,500));const vendorOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='거래처테스트');if(vendorOpt){vendorOpt.click();await new Promise(r=>setTimeout(r,500));}}const typeDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('입금 유형')||el.getAttribute('aria-label')?.includes('입금'));if(typeDD){typeDD.click();await new Promise(r=>setTimeout(r,500));const typeOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='매출대금');if(typeOpt){typeOpt.click();await new Promise(r=>setTimeout(r,500));}}return 'form filled';})()" }, { "id": 14, "name": "저장 및 결과 확인", "description": "저장 버튼 클릭 후 데이터 반영 확인", "action": "click_if_exists", "target": "저장", "expect": { "toast": "저장 완료 메시지", "url": "/accounting/deposits/{id}", "mode": "view" } }, { "id": 15, "name": "필수 검증: 수정 데이터 반영 확인", "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 상세 페이지에서 변경된 값 확인", "action": "verify_detail", "checks": [ "적요: 테스트 적요 수정", "거래처: 거래처테스트", "입금 유형: 매출대금" ], "expect": { "fields": [ { "name": "적요", "value": "테스트 적요 수정" }, { "name": "거래처", "value": "거래처테스트" }, { "name": "입금 유형", "value": "매출대금" } ] } }, { "id": 16, "name": "취소 버튼 동작 확인", "description": "수정 모드에서 취소 버튼 동작 검증", "action": "evaluate", "script": "(async()=>{const editBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='수정');if(editBtn){editBtn.click();await new Promise(r=>setTimeout(r,1000));}const cancelBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='취소');if(cancelBtn){cancelBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'cancel tested';})()", "expect": { "url": "/accounting/deposits/{id}", "mode": "view", "visible": [ "입금 상세", "목록", "삭제", "수정" ] } }, { "id": 17, "name": "목록 버튼 동작 확인", "description": "목록 버튼 클릭하여 목록 페이지로 이동", "action": "click_if_exists", "target": "목록", "expect": { "url": "/accounting/deposits", "visible": [ "입금관리", "총 입금" ] } }, { "id": 18, "name": "필터 드롭다운 검증", "description": "목록 페이지 필터 드롭다운 옵션 확인", "note": "3개의 필터 드롭다운 존재 (거래처, 입금유형, 정렬)", "action": "verify_element", "target": "body", "expect": { "filters": [ { "name": "거래처 필터", "default": "전체" }, { "name": "입금유형 필터", "default": "전체" }, { "name": "정렬", "default": "최신순", "options": [ "최신순", "등록순", "금액 높은순", "금액 낮은순" ] } ] } }, { "id": 19, "name": "날짜 필터 검증", "description": "날짜 필터 버튼 동작 확인", "action": "click_if_exists", "target": "당해년도", "expect": { "dateRange": { "start": "2026-01-01", "end": "2026-12-31" } } }, { "id": 20, "name": "페이지네이션 동작 확인", "description": "페이지네이션 버튼 동작 검증", "action": "click_if_exists", "target": "다음", "expect": { "pagination": { "totalItems": 60, "itemsPerPage": 20, "currentPage": 1, "totalPages": 3 } }, "expectAfterAction": { "currentPage": 2, "displayText": "전체 60개 중 21-40개 표시" } }, { "id": 21, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } ], "deleteTest": { "note": "삭제 테스트 - 이전에 스킵되었으나 CRUD 완전성을 위해 추가", "steps": [ { "id": "step-delete-1", "name": "삭제 버튼 클릭", "description": "상세 페이지에서 삭제 버튼 클릭", "action": "click_if_exists", "target": "삭제", "expect": { "confirmDialog": true, "dialogText": [ "삭제", "하시겠습니까" ] } }, { "id": "step-delete-2", "name": "삭제 확인", "description": "삭제 확인 다이얼로그에서 확인 클릭", "action": "click_dialog_confirm", "target": "확인", "waitFor": { "type": "navigation", "url": "/accounting/deposits", "timeout": 5000 }, "expect": { "toast": [ "삭제", "완료", "성공" ], "url": "/accounting/deposits" } }, { "id": "step-delete-3", "name": "필수 검증: 삭제 데이터 반영 확인", "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 삭제 확인 필수!", "description": "목록에서 삭제된 입금 내역이 없어졌는지 확인", "action": "verify_element", "target": "body", "expect": { "tableNotContains": "테스트 적요 수정" } } ] }, "knownBugs": [ { "id": "BUG-SALES-20260115-001", "description": "계정과목명 일괄변경 시 토스트 성공 표시되나 실제 데이터 미변경 (매출관리)", "relatedSteps": [ "step-4-1" ], "note": "입금관리에서도 동일한 버그가 존재할 수 있으므로 step-4-1에서 검증 필수" } ], "testData": { "sampleDeposit": { "date": "2025-12-28", "account": "운영계좌", "depositor": "CJ대한통운", "amount": "8,209,677", "vendor": "CJ대한통운", "description": "CJ대한통운 입금", "depositType": "미설정" }, "modifiedData": { "description": "테스트 적요 수정", "vendor": "거래처테스트", "depositType": "매출대금" } }, "pageStructure": { "listPage": { "url": "/accounting/deposits", "title": "입금관리", "statistics": [ "총 입금", "당월 입금", "거래처 미설정", "입금유형 미설정" ], "tableColumns": [ "checkbox", "입금일", "입금계좌", "입금자명", "입금금액", "거래처", "적요", "입금유형", "action" ], "batchUpdate": { "label": "계정과목명", "saveButton": "저장" }, "filters": [ "거래처", "입금유형", "정렬" ], "dateFilters": [ "당해년도", "전전월", "전월", "당월", "어제", "오늘" ] }, "detailPage": { "url": "/accounting/deposits/{id}", "title": "입금 상세", "buttons": [ "목록", "삭제", "수정" ], "fields": { "readOnly": [ "입금일", "입금계좌", "입금자명", "입금금액" ], "editable": [ "적요", "거래처", "입금 유형" ] } }, "editPage": { "url": "/accounting/deposits/{id}?mode=edit", "title": "입금 수정", "buttons": [ "취소", "저장" ] } }, "dropdownOptions": { "accountSubject": { "label": "계정과목명", "options": [ "미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타" ] }, "depositType": { "label": "입금 유형", "options": [ "미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타" ] }, "vendor": { "label": "거래처", "options": [ "거래처테스트", "아크더레드", "코브라브릿지", "가우스전자", "아크아크" ] }, "sortOrder": { "label": "정렬", "options": [ "최신순", "등록순", "금액 높은순", "금액 낮은순" ] } }, "assertions": [ { "type": "url", "expected": "/accounting/deposits", "message": "목록 페이지 URL 확인" }, { "type": "text", "target": "body", "expected": "입금관리", "message": "페이지 타이틀 확인" } ] }