Files
sam-scenarios/receivables-status.json
light 8580c891eb fix: 시나리오 URL 및 메뉴 존재 여부 수정
- announcement-board.json 삭제 (공지사항 메뉴 미존재)
- bank-account-management.json URL 수정: /settings/bank-account → /settings/accounts
- company-info.json URL 수정: /settings/company → /company-info

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:26:52 +09:00

351 lines
13 KiB
JSON

{
"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 및 실제 다운로드 이벤트 확인 필수"
]
}