- 54개 시나리오 파일에 URL 기반 메뉴 탐색을 위한 navigation 속성 추가 - targetUrl: 정확한 페이지 URL 경로 - urlPattern: ko 버전 포함 URL 패턴 (regex) - menuHints: 메뉴명 힌트 배열 (fallback용) 메뉴 탐색 실패율 41.8% → URL 기반 방식으로 개선 예정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
356 lines
13 KiB
JSON
356 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",
|
|
|
|
"navigation": {
|
|
"targetUrl": "/accounting/receivables",
|
|
"urlPattern": "/accounting/receivables|/ko/accounting/receivables|/accounting/receivables-status",
|
|
"menuHints": ["미수금현황", "미수금", "채권현황", "회계관리"]
|
|
},
|
|
"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 및 실제 다운로드 이벤트 확인 필수"
|
|
]
|
|
}
|