refactor: 초정밀 시나리오 강화 (1060→1381 steps, 68/68 PASS)

This commit is contained in:
김보곤
2026-02-09 15:05:03 +09:00
parent 15ad1d9758
commit f5dffe2ee7
135 changed files with 23040 additions and 1652 deletions

View File

@@ -3,14 +3,25 @@
"name": "거래처관리 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
},
"description": "회계관리 > 거래처관리 메뉴의 목록 조회, 필터, 검색, 상세 페이지 진입, 수정 및 저장 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com",
"navigation": {
"targetUrl": "/accounting/vendors",
"urlPattern": "/accounting/vendors",
"menuHints": ["거래처관리", "거래처 관리", "회계관리"]
"menuHints": [
"거래처관리",
"거래처 관리",
"회계관리"
]
},
"menuNavigation": {
"level1": "회계관리",
@@ -24,8 +35,16 @@
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "회계관리",
"level2": "거래처관리",
"alternativeLevel1Names": ["회계관리", "회계 관리", "Accounting"],
"alternativeLevel2Names": ["거래처관리", "거래처 관리", "Vendors"],
"alternativeLevel1Names": [
"회계관리",
"회계 관리",
"Accounting"
],
"alternativeLevel2Names": [
"거래처관리",
"거래처 관리",
"Vendors"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
@@ -39,8 +58,15 @@
"password": "password123!"
},
"notes": {
"skip": ["등록 버튼 (추후 구현 예정)", "삭제 기능 (보류)"],
"focus": ["테이블 행 클릭 → 상세 페이지", "수정 모드 진입", "수정 후 저장"],
"skip": [
"등록 버튼 (추후 구현 예정)",
"삭제 기능 (보류)"
],
"focus": [
"테이블 행 클릭 → 상세 페이지",
"수정 모드 진입",
"수정 후 저장"
],
"uiNotes": [
"필터 드롭다운: Radix UI Select (button[role='combobox'])",
"체크박스: Radix UI Checkbox (button[role='checkbox'])",
@@ -49,7 +75,7 @@
},
"steps": [
{
"id": "step-0",
"id": 1,
"name": "사이드바 메뉴 전체 펼치기",
"description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비",
"actions": [
@@ -57,44 +83,78 @@
"type": "evaluate",
"script": "document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'})"
},
{ "type": "wait", "duration": 300 },
{
"type": "wait",
"duration": 300
},
{
"type": "evaluate",
"script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()"
},
{ "type": "wait", "duration": 2000 }
{
"type": "wait",
"duration": 2000
}
]
},
{
"id": "step-1",
"id": 2,
"name": "2단계 메뉴 진입: 회계관리 > 거래처관리",
"description": "사이드바를 스크롤하며 회계관리 > 거래처관리 메뉴를 찾아 클릭",
"actions": [
{
"type": "scrollAndFind",
"target": "회계관리",
"alternativeTexts": ["회계관리", "회계 관리", "Accounting"],
"alternativeTexts": [
"회계관리",
"회계 관리",
"Accounting"
],
"scrollContainer": "sidebar",
"maxAttempts": 10,
"description": "스크롤하며 회계관리 메뉴 찾기"
},
{ "type": "click_if_exists", "target": "회계관리", "description": "회계관리 메뉴 클릭" },
{ "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" },
{
"type": "click_if_exists",
"target": "회계관리",
"description": "회계관리 메뉴 클릭"
},
{
"type": "wait",
"duration": 500,
"description": "서브메뉴 펼쳐지기 대기"
},
{
"type": "scrollAndFind",
"target": "거래처관리",
"alternativeTexts": ["거래처관리", "거래처 관리", "Vendors"],
"alternativeTexts": [
"거래처관리",
"거래처 관리",
"Vendors"
],
"scrollContainer": "submenu",
"maxAttempts": 5,
"description": "서브메뉴에서 거래처관리 찾기"
},
{ "type": "click_if_exists", "target": "거래처관리", "description": "거래처관리 메뉴 클릭" },
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 }
{
"type": "click_if_exists",
"target": "거래처관리",
"description": "거래처관리 메뉴 클릭"
},
{
"type": "wait",
"target": "페이지 로드 완료",
"timeout": 10000
}
],
"expect": {
"url": "/accounting/vendors",
"pageTitle": "거래처관리",
"elements": ["통계 카드", "테이블", "검색창"]
"elements": [
"통계 카드",
"테이블",
"검색창"
]
},
"verification": [
"회계관리 메뉴가 펼쳐졌는지 확인",
@@ -153,8 +213,17 @@
"script": "(() => { const c = document.querySelectorAll('table tbody tr').length; window.__e2e_beforeSearch = c; return 'beforeSearch=' + c; })()",
"description": "검색 전 행 수 저장"
},
{ "type": "fill", "target": "input[placeholder*='검색']", "value": "가우스", "description": "검색어 '가우스' 입력" },
{ "type": "wait", "duration": 1000, "description": "검색 결과 대기" },
{
"type": "fill",
"target": "input[placeholder*='검색']",
"value": "가우스",
"description": "검색어 '가우스' 입력"
},
{
"type": "wait",
"duration": 1000,
"description": "검색 결과 대기"
},
{
"type": "evaluate",
"script": "(() => { const c = document.querySelectorAll('table tbody tr').length; return 'afterSearch=' + c + ', filtered=' + (c < (window.__e2e_beforeSearch||999)); })()",
@@ -194,7 +263,11 @@
"script": "(() => { const inp = document.querySelector('input[placeholder*=\"검색\"]'); if(inp){ const nset = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set; nset.call(inp,''); inp.dispatchEvent(new Event('input',{bubbles:true})); inp.dispatchEvent(new Event('change',{bubbles:true})); return 'cleared'; } return 'not found'; })()",
"description": "검색어 삭제"
},
{ "type": "wait", "duration": 1000, "description": "목록 복원 대기" },
{
"type": "wait",
"duration": 1000,
"description": "목록 복원 대기"
},
{
"type": "evaluate",
"script": "(() => { const c = document.querySelectorAll('table tbody tr').length; return 'restored rows=' + c + ', restored=' + (c >= (window.__e2e_beforeSearch||1)); })()",
@@ -275,74 +348,74 @@
{
"id": 14,
"name": "상세 페이지 - 기본 정보 카드 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"사업자등록번호 필드",
"거래처코드 필드",
"거래처명 필드",
"대표자명 필드",
"업태 필드",
"업종 필드"
"visible_text:사업자등록번호",
"visible_text:거래처코드",
"visible_text:거래처명",
"visible_text:대표자명",
"visible_text:업태",
"visible_text:업종"
],
"expected": "기본 정보 모두 표시 (읽기 전용)"
},
{
"id": 15,
"name": "상세 페이지 - 연락처 정보 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"주소 필드",
"전화번호 필드",
"모바일 필드",
"팩스 필드",
"이메일 필드"
"visible_text:주소",
"visible_text:전화번호",
"visible_text:모바일",
"visible_text:팩스",
"visible_text:이메일"
],
"expected": "연락처 정보 모두 표시"
},
{
"id": 16,
"name": "상세 페이지 - 담당자 정보 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"담당자명 필드",
"담당자 전화 필드",
"시스템 관리자 필드"
"visible_text:담당자명",
"visible_text:담당자 전화",
"visible_text:시스템 관리자"
],
"expected": "담당자 정보 모두 표시"
},
{
"id": 17,
"name": "상세 페이지 - 회사 정보 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"회사 로고 영역",
"매입 결제일 필드",
"매출 결제일 필드"
"visible_text:회사 로고 영역",
"visible_text:매입 결제일",
"visible_text:매출 결제일"
],
"expected": "회사 정보 모두 표시"
},
{
"id": 18,
"name": "상세 페이지 - 신용/거래 정보 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"신용등급 필드",
"거래등급 필드",
"세금계산서 이메일 필드",
"입금계좌 은행 필드",
"계좌 필드",
"예금주 필드"
"visible_text:신용등급",
"visible_text:거래등급",
"visible_text:세금계산서 이메일",
"visible_text:입금계좌 은행",
"visible_text:계좌",
"visible_text:예금주"
],
"expected": "신용/거래 정보 모두 표시"
},
{
"id": 19,
"name": "상세 페이지 - 추가 정보 확인",
"action": "verify_detail_info",
"action": "verify_detail",
"checks": [
"미수금 필드",
"악성채권 금액 필드",
"악성채권 상태 필드"
"visible_text:미수금",
"visible_text:악성채권 금액",
"visible_text:악성채권 상태"
],
"expected": "추가 정보 모두 표시"
},
@@ -410,8 +483,16 @@
"script": "(() => { window.__e2e_urlBeforeSave = window.location.href; return 'saved url: ' + window.__e2e_urlBeforeSave; })()",
"description": "저장 전 URL 기록"
},
{ "type": "click_if_exists", "target": "저장", "description": "저장 버튼 클릭" },
{ "type": "wait", "duration": 2000, "description": "저장 처리 대기" }
{
"type": "click_if_exists",
"target": "저장",
"description": "저장 버튼 클릭"
},
{
"type": "wait",
"duration": 2000,
"description": "저장 처리 대기"
}
],
"expected": "저장 완료 후 목록 페이지로 리다이렉트"
},
@@ -524,7 +605,10 @@
{
"id": 1,
"name": "등록/저장 버튼",
"steps": [25, 26],
"steps": [
25,
26
],
"criteria": "저장 클릭 → 목록 리다이렉트 + 에러 없음 + 데이터 반영"
},
{
@@ -536,7 +620,13 @@
{
"id": 3,
"name": "검색/필터",
"steps": [6, 7, 8, 9, 10],
"steps": [
6,
7,
8,
9,
10
],
"criteria": "검색 및 필터 시 데이터 변화 확인"
},
{
@@ -548,7 +638,9 @@
{
"id": 5,
"name": "목업 페이지 감지",
"steps": [3],
"steps": [
3
],
"criteria": "입력 필드, 동작 버튼, API 호출 확인"
}
],