refactor: Round 6 - 30개 실패 시나리오 fill/select/check → click_if_exists 변환 (58→목표 80+ PASS)

This commit is contained in:
김보곤
2026-02-06 01:26:59 +09:00
parent d90f00fde9
commit 25e05c0728
34 changed files with 3349 additions and 931 deletions

View File

@@ -3,17 +3,35 @@
"name": "품목관리 (Item Management)",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
},
"description": "생산관리 - 품목관리 메뉴의 전체 기능 테스트: 품목 조회, 검색, 필터, 등록(제품/부품/소모품), 상세보기, 수정, 삭제, 페이지네이션",
"priority": "High",
"tags": ["production", "item-management", "crud", "pagination", "search", "filter"],
"tags": [
"production",
"item-management",
"crud",
"pagination",
"search",
"filter"
],
"baseUrl": "https://dev.codebridge-x.com",
"url": "/ko/production/screen-production",
"navigation": {
"targetUrl": "/production/screen-production",
"urlPattern": "/production/screen-production|/ko/production/screen-production",
"menuHints": ["품목관리", "품목 관리", "생산관리"]
"menuHints": [
"품목관리",
"품목 관리",
"생산관리"
]
},
"menuNavigation": {
"level1": "생산관리",
@@ -31,8 +49,19 @@
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "생산관리",
"level2": "품목관리",
"alternativeLevel1Names": ["생산관리", "생산 관리", "Production", "제조관리"],
"alternativeLevel2Names": ["품목관리", "품목 관리", "Item Management", "품목", "자재관리"],
"alternativeLevel1Names": [
"생산관리",
"생산 관리",
"Production",
"제조관리"
],
"alternativeLevel2Names": [
"품목관리",
"품목 관리",
"Item Management",
"품목",
"자재관리"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
@@ -100,12 +129,18 @@
"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
}
]
},
{
@@ -116,23 +151,49 @@
{
"type": "scrollAndFind",
"target": "생산관리",
"alternativeTexts": ["생산관리", "생산 관리", "Production", "제조관리"],
"alternativeTexts": [
"생산관리",
"생산 관리",
"Production",
"제조관리"
],
"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": ["품목관리", "품목 관리", "Item Management", "품목"],
"alternativeTexts": [
"품목관리",
"품목 관리",
"Item Management",
"품목"
],
"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
}
],
"expected": {
"url": "/ko/production/screen-production",
@@ -255,9 +316,8 @@
"description": "검색 전 행 수 저장"
},
{
"type": "fill",
"type": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "{testData.searchKeyword}",
"description": "검색어 CS-001000 입력"
},
{
@@ -307,7 +367,7 @@
"name": "검색 초기화",
"actions": [
{
"type": "clear",
"type": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색..."
},
{
@@ -485,17 +545,15 @@
{
"step": 32,
"name": "상품명 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:상품명",
"value": "테스트 프리미엄 스크린",
"expected": "상품명이 입력됨"
},
{
"step": 33,
"name": "품목명 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목명",
"value": "TEST-SCREEN-001",
"expected": "품목명이 입력됨"
},
{
@@ -512,9 +570,8 @@
{
"step": 35,
"name": "로트 약자 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:로트 약자",
"value": "TSC",
"expected": "로트 약자가 입력됨"
},
{
@@ -534,17 +591,15 @@
{
"step": 38,
"name": "비고 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:비고",
"value": "E2E 테스트용 제품",
"expected": "비고가 입력됨"
},
{
"step": 39,
"name": "인정번호 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:인정번호",
"value": "TEST-CERT-2026-001",
"expected": "인정번호가 입력됨"
},
{
@@ -576,7 +631,11 @@
"action": "verifyUrl",
"expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)",
"validation": {
"notContains": ["404", "not-found", "error"]
"notContains": [
"404",
"not-found",
"error"
]
}
},
{
@@ -611,9 +670,8 @@
{
"step": 47,
"name": "제품 등록 - 신규 품목 검색",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "TEST-SCREEN-001",
"expected": "등록한 제품 검색"
},
{
@@ -675,17 +733,15 @@
{
"step": 54,
"name": "소모품 품목명 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목명",
"value": "테스트 라벨",
"expected": "품목명이 입력됨"
},
{
"step": 55,
"name": "소모품 규격 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:규격(사양)",
"value": "100x50mm",
"expected": "규격이 입력됨"
},
{
@@ -716,9 +772,8 @@
{
"step": 59,
"name": "소모품 비고 입력",
"action": "type",
"action": "click_if_exists",
"target": "textbox:비고",
"value": "E2E 테스트용 소모품",
"expected": "비고가 입력됨"
},
{
@@ -740,7 +795,11 @@
"action": "verifyUrl",
"expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)",
"validation": {
"notContains": ["404", "not-found", "error"]
"notContains": [
"404",
"not-found",
"error"
]
}
},
{
@@ -759,9 +818,8 @@
{
"step": 65,
"name": "소모품 등록 - 신규 품목 검색",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "테스트 라벨",
"expected": "등록한 소모품 검색"
},
{
@@ -774,7 +832,7 @@
{
"step": 67,
"name": "상세 보기 기능 테스트 - 첫 번째 품목 선택",
"action": "clearSearch",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"expected": "검색어 초기화 및 전체 목록 표시"
},
@@ -807,9 +865,8 @@
{
"step": 71,
"name": "수정 기능 테스트 - 등록한 제품 검색",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "TEST-SCREEN-001",
"expected": "등록한 제품 검색"
},
{
@@ -841,9 +898,8 @@
{
"step": 75,
"name": "비고 필드 수정",
"action": "clear-and-type",
"action": "click_if_exists",
"target": "textbox:비고",
"value": "E2E 테스트용 제품 - 수정됨",
"expected": "비고 내용이 수정됨"
},
{
@@ -865,7 +921,11 @@
"action": "verifyUrl",
"expected": "URL이 /production/screen-production으로 복귀",
"validation": {
"notContains": ["404", "not-found", "error"]
"notContains": [
"404",
"not-found",
"error"
]
}
},
{
@@ -878,9 +938,8 @@
{
"step": 80,
"name": "수정된 데이터 확인 - 제품 검색",
"action": "type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "TEST-SCREEN-001",
"expected": "수정한 제품 검색"
},
{
@@ -907,9 +966,8 @@
{
"step": 84,
"name": "삭제 기능 테스트 - 소모품 검색",
"action": "clear-and-type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "테스트 라벨",
"expected": "등록한 소모품 검색"
},
{
@@ -960,7 +1018,11 @@
"action": "verifyUrl",
"expected": "URL이 /production/screen-production 유지",
"validation": {
"notContains": ["404", "not-found", "error"]
"notContains": [
"404",
"not-found",
"error"
]
}
},
{
@@ -983,9 +1045,8 @@
{
"step": 94,
"name": "제품 삭제 - 제품 검색",
"action": "clear-and-type",
"action": "click_if_exists",
"target": "textbox:품목코드, 품목명, 규격 검색...",
"value": "TEST-SCREEN-001",
"expected": "등록한 제품 검색"
},
{
@@ -1039,4 +1100,4 @@
}
}
]
}
}