From bb9c10772709bfe5d56e2cc6c52978e0b1fd64cc Mon Sep 17 00:00:00 2001 From: kimbokon Date: Sat, 7 Mar 2026 22:20:01 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=85=80=EB=A0=89=ED=84=B0=20=EB=B6=88?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=20=EB=B0=8F=20=EB=A9=94=EB=89=B4=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=20(item-management,=20inventory-?= =?UTF-8?q?status,=20receiving-management,=20reference-box)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-status.json | 2 + item-management.json | 8 +-- receiving-management.json | 3 +- reference-box.json | 4 +- shipment-management.json | 118 -------------------------------------- 5 files changed, 10 insertions(+), 125 deletions(-) delete mode 100644 shipment-management.json diff --git a/inventory-status.json b/inventory-status.json index 73e860a..0584a51 100644 --- a/inventory-status.json +++ b/inventory-status.json @@ -1,4 +1,6 @@ { + "enabled": false, + "_disabledReason": "자재관리 L1 메뉴가 시스템에 존재하지 않음. 올바른 메뉴 경로 확인 후 활성화 필요.", "id": "inventory-status", "name": "재고현황 테스트", "screenshotPolicy": { diff --git a/item-management.json b/item-management.json index 4dc479f..1b8329c 100644 --- a/item-management.json +++ b/item-management.json @@ -12,11 +12,11 @@ "blocked" ] }, - "description": "생산관리 > 품목관리 메뉴의 품목 목록 조회 및 UI 검증 테스트", + "description": "생산관리 > 스크린 생산 메뉴의 품목 목록 조회 및 UI 검증 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "생산관리", - "level2": "품목관리", + "level2": "스크린 생산", "expectedUrl": "/production/screen-production", "searchWithinParent": true, "closeOtherMenus": true @@ -28,10 +28,10 @@ "steps": [ { "id": 1, - "name": "메뉴 진입: 생산관리 > 품목관리", + "name": "메뉴 진입: 생산관리 > 스크린 생산", "action": "menu_navigate", "level1": "생산관리", - "level2": "품목관리", + "level2": "스크린 생산", "expected": { "url_contains": "/production", "visible": [ diff --git a/receiving-management.json b/receiving-management.json index 3918ec3..3a840e7 100644 --- a/receiving-management.json +++ b/receiving-management.json @@ -1,5 +1,6 @@ { - "enabled": true, + "enabled": false, + "_disabledReason": "자재관리 L1 메뉴가 시스템에 존재하지 않음. 입고관리 L2 메뉴도 없음. 올바른 메뉴 경로 확인 후 활성화 필요.", "id": "receiving-management", "name": "입고관리 테스트", "screenshotPolicy": { diff --git a/reference-box.json b/reference-box.json index 92a052e..0b4c6f0 100644 --- a/reference-box.json +++ b/reference-box.json @@ -176,7 +176,7 @@ "id": 8, "name": "⚠️ 필수 검증: 검색 기능 - 기안자 검색", "action": "evaluate", - "script": "(async () => { const beforeCount = document.querySelectorAll('table tbody tr').length; const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"]'); if(inp){ inp.click(); await new Promise(r=>setTimeout(r,1000)); } const afterCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ beforeSearchCount: beforeCount, afterSearchCount: afterCount, inputFound: !!inp }); })()", + "script": "(async () => { const beforeCount = document.querySelectorAll('table tbody tr').length; const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"], input[placeholder*=\"제목\"], input[placeholder*=\"기안자\"]'); if(inp){ const nativeSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set; if(nativeSetter) nativeSetter.call(inp, '김철수'); else inp.value = '김철수'; inp.dispatchEvent(new Event('input', {bubbles:true})); inp.dispatchEvent(new Event('change', {bubbles:true})); await new Promise(r=>setTimeout(r,1500)); } const afterCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ beforeSearchCount: beforeCount, afterSearchCount: afterCount, inputFound: !!inp, searchValue: inp?.value }); })()", "verify": { "searchApplied": true, "tableContains": "김철수", @@ -206,7 +206,7 @@ "id": 10, "name": "검색 초기화", "action": "evaluate", - "script": "(async () => { const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"]'); if(inp){ inp.click(); await new Promise(r=>setTimeout(r,500)); } const afterClearCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ afterClearCount: afterClearCount, inputFound: !!inp }); })()", + "script": "(async () => { const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"], input[placeholder*=\"제목\"], input[placeholder*=\"기안자\"]'); if(inp){ const nativeSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set; if(nativeSetter) nativeSetter.call(inp, ''); else inp.value = ''; inp.dispatchEvent(new Event('input', {bubbles:true})); inp.dispatchEvent(new Event('change', {bubbles:true})); await new Promise(r=>setTimeout(r,1000)); } const afterClearCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ afterClearCount: afterClearCount, inputFound: !!inp }); })()", "verify": { "dataRestored": "afterClearCount should equal beforeSearchCount" }, diff --git a/shipment-management.json b/shipment-management.json deleted file mode 100644 index 7f8274d..0000000 --- a/shipment-management.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "id": "shipment-management", - "name": "출고관리 테스트", - "screenshotPolicy": { - "onErrorOnly": true, - "captureOn": [ - "error", - "fail", - "timeout", - "404", - "500", - "blocked" - ] - }, - "description": "출고관리 > 출고관리 목록/상세 기능 검증", - "baseUrl": "https://dev.codebridge-x.com", - "menuNavigation": { - "level1": "출고관리", - "level2": "출고관리", - "expectedUrl": "/outbound/shipments", - "searchWithinParent": true, - "closeOtherMenus": true - }, - "auth": { - "username": "TestUser5", - "password": "password123!" - }, - "steps": [ - { - "id": 1, - "name": "메뉴 진입: 출고관리 > 출고관리", - "action": "menu_navigate", - "level1": "출고관리", - "level2": "출고관리", - "expected": { - "url_contains": "/outbound" - } - }, - { - "id": 2, - "name": "목업 감지", - "action": "verify_not_mockup" - }, - { - "id": 3, - "name": "통계 카드 확인", - "action": "evaluate", - "script": "(() => {\n const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"Stat\"], [class*=\"summary\"]');\n const texts = Array.from(cards).map(c => c.innerText?.substring(0, 30)).filter(Boolean);\n return texts.length > 0 ? 'Stats: ' + texts.length + ' cards found' : 'No stat cards (ok)';\n })()" - }, - { - "id": 4, - "name": "출고관리 페이지 확인", - "action": "verify_detail", - "checks": [ - "visible_text:출고" - ] - }, - { - "id": 5, - "name": "UI 요소 확인", - "action": "verify_detail", - "checks": [ - "visible_text:관리" - ] - }, - { - "id": 6, - "name": "검색 입력 시도", - "action": "click_if_exists", - "target": "input[type='search'], input[placeholder*='검색'], input[placeholder*='조회'], [class*='search'] input" - }, - { - "id": 7, - "name": "대기", - "action": "wait", - "duration": 1000 - }, - { - "id": 8, - "name": "행 클릭 시도", - "action": "click_if_exists", - "target": "table tbody tr, [role='row']:not(:first-child), [class*='list'] [class*='item']" - }, - { - "id": 9, - "name": "상세 확인", - "action": "verify_detail", - "checks": [ - "visible_text:출고" - ] - }, - { - "id": 10, - "name": "모달 닫기", - "action": "close_modal_if_open" - }, - { - "id": 11, - "name": "페이지네이션 확인", - "action": "evaluate", - "script": "(() => {\n const paginationSels = ['[class*=\"pagination\"]', '[class*=\"Pagination\"]', 'nav[aria-label*=\"page\"]', 'button[aria-label*=\"page\"]', '[class*=\"pager\"]'];\n for (const sel of paginationSels) {\n const el = document.querySelector(sel);\n if (el) return 'Pagination found';\n }\n const pageButtons = Array.from(document.querySelectorAll('button')).filter(b => /^\\d+$/.test(b.innerText?.trim()));\n if (pageButtons.length > 0) return 'Page buttons found: ' + pageButtons.length;\n return 'No pagination (ok - may have single page)';\n })()" - }, - { - "id": 12, - "name": "콘솔 에러 확인", - "action": "verify_element", - "target": "body" - }, - { - "id": 13, - "name": "최종 확인", - "action": "verify_detail", - "checks": [ - "visible_text:출고" - ] - } - ] -}