{ "scenarioId": "item-management", "scenarioName": "품목관리 (Item Management)", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "description": "생산관리 - 품목관리 메뉴의 전체 기능 테스트: 품목 조회, 검색, 필터, 등록(제품/부품/소모품), 상세보기, 수정, 삭제, 페이지네이션", "priority": "High", "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": ["품목관리", "품목 관리", "생산관리"] }, "menuNavigation": { "level1": "생산관리", "level2": "품목관리", "expectedUrl": "/ko/production/screen-production" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "생산관리", "level2": "품목관리", "alternativeLevel1Names": ["생산관리", "생산 관리", "Production", "제조관리"], "alternativeLevel2Names": ["품목관리", "품목 관리", "Item Management", "품목", "자재관리"], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "testData": { "testProduct": { "상품명": "테스트 프리미엄 스크린", "품목명": "TEST-SCREEN-001", "로트약자": "TSC", "품목상태": "활성", "비고": "E2E 테스트용 제품", "인정번호": "TEST-CERT-2026-001" }, "testConsumable": { "품목명": "테스트 라벨", "규격": "100x50mm", "단위": "EA", "비고": "E2E 테스트용 소모품" }, "searchKeyword": "CS-001000" }, "expectedAPIs": [ { "method": "GET", "endpoint": "/api/items", "description": "품목 목록 조회", "expectedStatus": 200 }, { "method": "POST", "endpoint": "/api/items", "description": "품목 등록", "expectedStatus": 201 }, { "method": "GET", "endpoint": "/api/items/:id", "description": "품목 상세 조회", "expectedStatus": 200 }, { "method": "PATCH", "endpoint": "/api/items/:id", "description": "품목 수정", "expectedStatus": 200 }, { "method": "DELETE", "endpoint": "/api/items/:id", "description": "품목 삭제", "expectedStatus": 200 } ], "steps": [ { "step": 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 } ] }, { "step": 1, "name": "2단계 메뉴 진입: 생산관리 > 품목관리", "description": "사이드바를 스크롤하며 생산관리 > 품목관리 메뉴를 찾아 클릭", "actions": [ { "type": "scrollAndFind", "target": "생산관리", "alternativeTexts": ["생산관리", "생산 관리", "Production", "제조관리"], "scrollContainer": "sidebar", "maxAttempts": 10, "description": "스크롤하며 생산관리 메뉴 찾기" }, { "type": "click", "target": "생산관리", "description": "생산관리 메뉴 클릭" }, { "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" }, { "type": "scrollAndFind", "target": "품목관리", "alternativeTexts": ["품목관리", "품목 관리", "Item Management", "품목"], "scrollContainer": "submenu", "maxAttempts": 5, "description": "서브메뉴에서 품목관리 찾기" }, { "type": "click", "target": "품목관리", "description": "품목관리 메뉴 클릭" }, { "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 } ], "expected": { "url": "/ko/production/screen-production", "title": "품목 관리", "authenticated": true }, "validation": { "pageTitle": "품목 관리", "pageDescription": "제품, 부품, 부자재, 원자재, 소모품 등록 및 관리" }, "verification": [ "생산관리 메뉴가 펼쳐졌는지 확인", "품목관리 서브메뉴 클릭 성공", "404 에러 없이 페이지 로드 완료" ] }, { "step": 2, "name": "통계 카드 표시 확인", "action": "verify", "target": "statistics-cards", "expected": "6개 통계 카드가 올바른 데이터와 함께 표시됨", "validation": { "cards": [ "전체 품목", "제품", "부품", "부자재", "원자재", "소모품" ], "hasNumbers": true } }, { "step": 3, "name": "품목 등록 버튼 표시 확인", "action": "verify", "target": "button:품목 등록", "expected": "품목 등록 버튼이 표시됨" }, { "step": 4, "name": "검색 입력 필드 표시 확인", "action": "verify", "target": "textbox:품목코드, 품목명, 규격 검색...", "expected": "검색 입력 필드가 표시됨" }, { "step": 5, "name": "탭 필터 버튼 표시 확인", "action": "verify", "target": "tab-buttons", "expected": "6개 탭 필터 버튼이 표시됨", "validation": { "tabs": [ "전체", "제품", "부품", "부자재", "원자재", "소모품" ] } }, { "step": 6, "name": "데이터 테이블 헤더 확인", "action": "verify", "target": "table-headers", "expected": "테이블 헤더가 올바르게 표시됨", "validation": { "columns": [ "체크박스", "번호", "품목코드", "품목유형", "품목명", "규격", "단위", "품목상태", "액션" ] } }, { "step": 7, "name": "데이터 행 표시 확인", "action": "verify", "target": "table-rows", "expected": "20개 데이터 행이 표시됨", "validation": { "minRows": 20, "maxRows": 20 } }, { "step": 8, "name": "페이지네이션 표시 확인", "action": "verify", "target": "pagination", "expected": "페이지네이션 정보가 표시됨: '전체 10425개 중 1-20개 표시'" }, { "step": 9, "name": "액션 버튼 표시 확인 (첫 번째 행)", "action": "verify", "target": "row[1]:action-buttons", "expected": "각 행에 '상세 보기', '수정', '삭제' 버튼이 표시됨" }, { "step": 10, "name": "⚠️ 필수 검증: 검색 기능 테스트", "critical": true, "actions": [ { "type": "capture", "variable": "beforeSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 전 행 수 저장" }, { "type": "fill", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "{testData.searchKeyword}", "description": "검색어 CS-001000 입력" }, { "type": "wait", "duration": 1000, "description": "검색 결과 로딩 대기" }, { "type": "capture", "variable": "afterSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 후 행 수 저장" } ], "verify": { "searchApplied": true, "tableContains": "{testData.searchKeyword}", "dataChanged": "beforeSearchCount may differ from afterSearchCount" }, "expected": "검색어가 입력되고 필터링됨" }, { "step": 11, "name": "검색 결과 확인", "action": "wait", "duration": 1000, "expected": "검색 결과가 필터링되어 표시됨 (자동 검색 또는 Enter 키)" }, { "step": 12, "name": "검색 결과 데이터 검증", "critical": true, "description": "검색 결과의 모든 행이 검색어를 포함하는지 확인", "action": "verify", "target": "table-rows", "expected": "검색어와 일치하는 품목만 표시됨", "validation": { "containsKeyword": "CS-001000" }, "verify": { "allRowsContain": "{testData.searchKeyword}", "columnToCheck": "품목코드" } }, { "step": 13, "name": "검색 초기화", "actions": [ { "type": "clear", "target": "textbox:품목코드, 품목명, 규격 검색..." }, { "type": "wait", "duration": 500 }, { "type": "capture", "variable": "afterClearCount", "selector": "table tbody tr", "extract": "count" } ], "verify": { "dataRestored": "afterClearCount should equal beforeSearchCount" }, "expected": "검색어가 지워지고 전체 목록이 다시 표시됨" }, { "step": 14, "name": "탭 필터 테스트 - 제품 탭 클릭", "action": "click", "target": "button:제품", "expected": "제품 탭이 활성화됨" }, { "step": 15, "name": "제품 탭 필터 결과 확인", "action": "verify", "target": "table-rows", "expected": "품목유형이 '제품'인 항목만 표시됨", "validation": { "itemType": "제품" } }, { "step": 16, "name": "탭 필터 테스트 - 소모품 탭 클릭", "action": "click", "target": "button:소모품", "expected": "소모품 탭이 활성화됨" }, { "step": 17, "name": "소모품 탭 필터 결과 확인", "action": "verify", "target": "table-rows", "expected": "품목유형이 '소모품'인 항목만 표시됨", "validation": { "itemType": "소모품" } }, { "step": 18, "name": "탭 필터 초기화 - 전체 탭 클릭", "action": "click", "target": "button:전체", "expected": "전체 탭이 활성화되고 모든 품목이 표시됨" }, { "step": 19, "name": "페이지네이션 테스트 - 2페이지 이동", "action": "click", "target": "button:2", "expected": "2페이지로 이동됨" }, { "step": 20, "name": "2페이지 데이터 확인", "action": "verify", "target": "pagination", "expected": "페이지네이션 정보가 '전체 10425개 중 21-40개 표시'로 변경됨" }, { "step": 21, "name": "다음 페이지 버튼 클릭", "action": "click", "target": "button:다음", "expected": "3페이지로 이동됨" }, { "step": 22, "name": "3페이지 데이터 확인", "action": "verify", "target": "pagination", "expected": "페이지네이션 정보가 '전체 10425개 중 41-60개 표시'로 변경됨" }, { "step": 23, "name": "1페이지로 복귀", "action": "click", "target": "button:1", "expected": "1페이지로 복귀됨" }, { "step": 24, "name": "품목 등록 페이지 이동", "action": "click", "target": "button:품목 등록", "expected": "품목 등록 페이지(/items/create)로 이동됨" }, { "step": 25, "name": "품목 등록 페이지 로딩 확인", "action": "verify", "target": "heading:품목 등록", "expected": "품목 등록 페이지가 표시됨", "validation": { "pageTitle": "품목 등록", "pageDescription": "품목 정보를 입력하세요" } }, { "step": 26, "name": "초기 버튼 상태 확인", "action": "verify", "target": "buttons", "expected": "'취소' 버튼은 활성화, '저장' 버튼은 비활성화 상태", "validation": { "cancelEnabled": true, "saveDisabled": true } }, { "step": 27, "name": "품목 유형 선택 전 경고 메시지 확인", "action": "verify", "target": "alert", "expected": "'⚠️ 품목 유형을 먼저 선택해주세요' 경고 메시지가 표시됨" }, { "step": 28, "name": "품목 유형 필드 확인", "action": "verify", "target": "combobox:품목 유형", "expected": "품목 유형 콤보박스가 필수 필드(*)로 표시됨" }, { "step": 29, "name": "제품(Finished Goods) 등록 테스트 시작", "action": "click", "target": "combobox:품목 유형", "expected": "품목 유형 드롭다운이 열림" }, { "step": 30, "name": "제품 옵션 선택", "action": "click", "target": "option:제품 (Finished Goods)", "expected": "제품 유형이 선택되고 제품 전용 입력 필드가 표시됨" }, { "step": 31, "name": "제품 입력 필드 표시 확인", "action": "verify", "target": "form-fields", "expected": "제품 유형에 맞는 입력 필드들이 표시됨", "validation": { "fields": [ "상품명*", "품목명*", "품목코드(자동생성)", "로트 약자", "품목상태", "비고", "인정번호", "인정 유효기간 시작일", "인정 유효기간 종료일", "시방서 (PDF)", "인정서 (PDF)", "부품구성 (BOM) 필요" ] } }, { "step": 32, "name": "상품명 입력", "action": "type", "target": "textbox:상품명", "value": "테스트 프리미엄 스크린", "expected": "상품명이 입력됨" }, { "step": 33, "name": "품목명 입력", "action": "type", "target": "textbox:품목명", "value": "TEST-SCREEN-001", "expected": "품목명이 입력됨" }, { "step": 34, "name": "품목코드 자동생성 확인", "action": "verify", "target": "textbox:품목코드", "expected": "품목코드가 품목명과 동일하게 'TEST-SCREEN-001'로 자동 생성됨", "validation": { "isDisabled": true, "value": "TEST-SCREEN-001" } }, { "step": 35, "name": "로트 약자 입력", "action": "type", "target": "textbox:로트 약자", "value": "TSC", "expected": "로트 약자가 입력됨" }, { "step": 36, "name": "품목상태 선택", "action": "click", "target": "combobox:품목상태", "expected": "품목상태 드롭다운이 열림" }, { "step": 37, "name": "품목상태 '활성' 선택", "action": "click", "target": "option:활성", "expected": "'활성' 상태가 선택됨" }, { "step": 38, "name": "비고 입력", "action": "type", "target": "textbox:비고", "value": "E2E 테스트용 제품", "expected": "비고가 입력됨" }, { "step": 39, "name": "인정번호 입력", "action": "type", "target": "textbox:인정번호", "value": "TEST-CERT-2026-001", "expected": "인정번호가 입력됨" }, { "step": 40, "name": "저장 버튼 활성화 확인", "action": "verify", "target": "button:저장", "expected": "필수 필드 입력 완료 후 저장 버튼이 활성화됨", "validation": { "isEnabled": true } }, { "step": 41, "name": "제품 등록 - URL 저장 (라우팅 오류 감지용)", "action": "getCurrentUrl", "expected": "현재 URL 저장: /items/create" }, { "step": 42, "name": "제품 등록 - 저장 버튼 클릭", "action": "click", "target": "button:저장", "expected": "제품 등록 API 호출 및 성공 메시지 표시" }, { "step": 43, "name": "제품 등록 - URL 변경 여부 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 44, "name": "제품 등록 - 에러 페이지 텍스트 감지 (필수 검증 #2)", "action": "verifyNoErrorPage", "expected": "에러 텍스트가 없음", "validation": { "noErrorText": [ "페이지를 찾을 수 없습니다", "404", "Not Found", "서버 에러", "500" ] } }, { "step": 45, "name": "제품 등록 - 성공 토스트 메시지 확인 (필수 검증 #2)", "action": "verify", "target": "toast-message", "expected": "'등록되었습니다' 또는 유사한 성공 메시지가 표시됨" }, { "step": 46, "name": "제품 등록 - 목록 페이지 복귀 확인", "action": "verify", "target": "heading:품목 관리", "expected": "품목 관리 목록 페이지로 정상 복귀됨" }, { "step": 47, "name": "제품 등록 - 신규 품목 검색", "action": "type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "TEST-SCREEN-001", "expected": "등록한 제품 검색" }, { "step": 48, "name": "제품 등록 - 신규 품목 표시 확인", "action": "wait", "duration": 1000, "expected": "등록한 제품이 목록에 표시됨" }, { "step": 49, "name": "제품 등록 - 데이터 검증", "action": "verify", "target": "table-row:TEST-SCREEN-001", "expected": "등록한 제품 정보가 올바르게 표시됨", "validation": { "품목코드": "TEST-SCREEN-001", "품목유형": "제품", "품목상태": "활성" } }, { "step": 50, "name": "소모품(Consumables) 등록 테스트 시작", "action": "click", "target": "button:품목 등록", "expected": "품목 등록 페이지로 이동됨" }, { "step": 51, "name": "품목 유형에서 소모품 선택", "action": "click", "target": "combobox:품목 유형", "expected": "품목 유형 드롭다운이 열림" }, { "step": 52, "name": "소모품 옵션 선택", "action": "click", "target": "option:소모품 (Consumables)", "expected": "소모품 유형이 선택되고 소모품 전용 입력 필드가 표시됨" }, { "step": 53, "name": "소모품 입력 필드 표시 확인", "action": "verify", "target": "form-fields", "expected": "소모품 유형에 맞는 입력 필드들이 표시됨", "validation": { "fields": [ "품목명*", "규격(사양)*", "품목코드(자동생성)", "단위*", "비고" ] } }, { "step": 54, "name": "소모품 품목명 입력", "action": "type", "target": "textbox:품목명", "value": "테스트 라벨", "expected": "품목명이 입력됨" }, { "step": 55, "name": "소모품 규격 입력", "action": "type", "target": "textbox:규격(사양)", "value": "100x50mm", "expected": "규격이 입력됨" }, { "step": 56, "name": "소모품 품목코드 자동생성 확인", "action": "verify", "target": "textbox:품목코드", "expected": "품목코드가 '테스트 라벨-100x50mm' 형식으로 자동 생성됨", "validation": { "isDisabled": true, "contains": "테스트 라벨-100x50mm" } }, { "step": 57, "name": "소모품 단위 선택", "action": "click", "target": "combobox:단위", "expected": "단위 드롭다운이 열림" }, { "step": 58, "name": "단위 'EA' 선택", "action": "click", "target": "option:EA", "expected": "'EA' 단위가 선택됨" }, { "step": 59, "name": "소모품 비고 입력", "action": "type", "target": "textbox:비고", "value": "E2E 테스트용 소모품", "expected": "비고가 입력됨" }, { "step": 60, "name": "소모품 등록 - URL 저장 (라우팅 오류 감지용)", "action": "getCurrentUrl", "expected": "현재 URL 저장: /items/create" }, { "step": 61, "name": "소모품 등록 - 저장 버튼 클릭", "action": "click", "target": "button:저장", "expected": "소모품 등록 API 호출 및 성공 메시지 표시" }, { "step": 62, "name": "소모품 등록 - URL 변경 여부 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 63, "name": "소모품 등록 - 에러 페이지 텍스트 감지 (필수 검증 #2)", "action": "verifyNoErrorPage", "expected": "에러 텍스트가 없음" }, { "step": 64, "name": "소모품 등록 - 성공 토스트 메시지 확인", "action": "verify", "target": "toast-message", "expected": "'등록되었습니다' 성공 메시지가 표시됨" }, { "step": 65, "name": "소모품 등록 - 신규 품목 검색", "action": "type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "테스트 라벨", "expected": "등록한 소모품 검색" }, { "step": 66, "name": "소모품 등록 - 신규 품목 표시 확인", "action": "wait", "duration": 1000, "expected": "등록한 소모품이 목록에 표시됨" }, { "step": 67, "name": "상세 보기 기능 테스트 - 첫 번째 품목 선택", "action": "clearSearch", "target": "textbox:품목코드, 품목명, 규격 검색...", "expected": "검색어 초기화 및 전체 목록 표시" }, { "step": 68, "name": "상세 보기 버튼 클릭 (첫 번째 행)", "action": "click", "target": "button:상세 보기[row=1]", "expected": "품목 상세 모달 또는 페이지가 열림" }, { "step": 69, "name": "상세 정보 표시 확인", "action": "verify", "target": "detail-modal-or-page", "expected": "품목 상세 정보가 표시됨", "validation": { "hasItemCode": true, "hasItemType": true, "hasItemName": true } }, { "step": 70, "name": "상세 보기 닫기", "action": "click", "target": "button:닫기 or ESC", "expected": "상세 모달/페이지가 닫히고 목록으로 복귀" }, { "step": 71, "name": "수정 기능 테스트 - 등록한 제품 검색", "action": "type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "TEST-SCREEN-001", "expected": "등록한 제품 검색" }, { "step": 72, "name": "수정 버튼 클릭", "action": "click", "target": "button:수정[row=TEST-SCREEN-001]", "expected": "품목 수정 페이지(/items/:id?mode=edit)로 이동됨" }, { "step": 73, "name": "수정 페이지 로딩 확인", "action": "verify", "target": "heading:품목 수정", "expected": "품목 수정 페이지가 표시되고 기존 데이터가 로드됨" }, { "step": 74, "name": "기존 데이터 로드 확인", "action": "verify", "target": "form-fields", "expected": "등록했던 데이터가 폼에 채워져 있음", "validation": { "상품명": "테스트 프리미엄 스크린", "품목명": "TEST-SCREEN-001", "로트약자": "TSC" } }, { "step": 75, "name": "비고 필드 수정", "action": "clear-and-type", "target": "textbox:비고", "value": "E2E 테스트용 제품 - 수정됨", "expected": "비고 내용이 수정됨" }, { "step": 76, "name": "수정 저장 - URL 저장", "action": "getCurrentUrl", "expected": "현재 URL 저장: /items/:id?mode=edit" }, { "step": 77, "name": "수정 저장 버튼 클릭", "action": "click", "target": "button:저장", "expected": "수정 API 호출 및 성공 메시지 표시" }, { "step": 78, "name": "수정 저장 - URL 변경 여부 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/screen-production으로 복귀", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 79, "name": "수정 저장 - 성공 토스트 메시지 확인", "action": "verify", "target": "toast-message", "expected": "'수정되었습니다' 성공 메시지가 표시됨" }, { "step": 80, "name": "수정된 데이터 확인 - 제품 검색", "action": "type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "TEST-SCREEN-001", "expected": "수정한 제품 검색" }, { "step": 81, "name": "수정된 데이터 확인 - 상세보기", "action": "click", "target": "button:상세 보기[row=TEST-SCREEN-001]", "expected": "상세 정보 표시" }, { "step": 82, "name": "수정된 비고 내용 확인", "action": "verify", "target": "detail-modal:비고", "expected": "비고가 'E2E 테스트용 제품 - 수정됨'으로 변경되었음을 확인" }, { "step": 83, "name": "상세 모달 닫기", "action": "click", "target": "button:닫기", "expected": "상세 모달이 닫힘" }, { "step": 84, "name": "삭제 기능 테스트 - 소모품 검색", "action": "clear-and-type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "테스트 라벨", "expected": "등록한 소모품 검색" }, { "step": 85, "name": "삭제 버튼 클릭", "action": "click", "target": "button:삭제[row=테스트 라벨]", "expected": "삭제 확인 다이얼로그가 표시됨" }, { "step": 86, "name": "삭제 확인 다이얼로그 검증", "action": "verify", "target": "dialog:confirm-delete", "expected": "'정말 삭제하시겠습니까?' 메시지가 표시됨" }, { "step": 87, "name": "삭제 취소 테스트 - 취소 버튼 클릭", "action": "click", "target": "button:취소[dialog]", "expected": "다이얼로그가 닫히고 삭제되지 않음" }, { "step": 88, "name": "삭제 취소 확인 - 품목이 여전히 존재함", "action": "verify", "target": "table-row:테스트 라벨", "expected": "소모품이 목록에 여전히 존재함" }, { "step": 89, "name": "삭제 재시도 - 삭제 버튼 클릭", "action": "click", "target": "button:삭제[row=테스트 라벨]", "expected": "삭제 확인 다이얼로그가 다시 표시됨" }, { "step": 90, "name": "삭제 확인 버튼 클릭", "action": "click", "target": "button:확인[dialog]", "expected": "삭제 API 호출 및 성공 메시지 표시" }, { "step": 91, "name": "소모품 삭제 - URL 변경 여부 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/screen-production 유지", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 92, "name": "소모품 삭제 - 성공 토스트 메시지 확인", "action": "verify", "target": "toast-message", "expected": "'삭제되었습니다' 성공 메시지가 표시됨" }, { "step": 93, "name": "소모품 삭제 확인 - 목록에서 사라짐", "action": "verify", "target": "table-rows", "expected": "삭제한 소모품이 목록에서 사라짐", "validation": { "notContains": "테스트 라벨" } }, { "step": 94, "name": "제품 삭제 - 제품 검색", "action": "clear-and-type", "target": "textbox:품목코드, 품목명, 규격 검색...", "value": "TEST-SCREEN-001", "expected": "등록한 제품 검색" }, { "step": 95, "name": "제품 삭제 버튼 클릭", "action": "click", "target": "button:삭제[row=TEST-SCREEN-001]", "expected": "삭제 확인 다이얼로그가 표시됨" }, { "step": 96, "name": "제품 삭제 확인", "action": "click", "target": "button:확인[dialog]", "expected": "삭제 API 호출 및 성공 메시지 표시" }, { "step": 97, "name": "제품 삭제 - URL 변경 여부 확인", "action": "verifyUrl", "expected": "URL이 /production/screen-production 유지" }, { "step": 98, "name": "제품 삭제 - 성공 토스트 메시지 확인", "action": "verify", "target": "toast-message", "expected": "'삭제되었습니다' 성공 메시지가 표시됨" }, { "step": 99, "name": "제품 삭제 확인 - 목록에서 사라짐", "action": "verify", "target": "table-rows", "expected": "삭제한 제품이 목록에서 사라짐", "validation": { "notContains": "TEST-SCREEN-001" } }, { "step": 100, "name": "최종 테스트 완료 확인", "action": "verify", "target": "page", "expected": "품목 관리 페이지가 정상 상태로 유지됨", "validation": { "pageTitle": "품목 관리", "hasStatistics": true, "hasTable": true, "hasPagination": true } } ] }