{ "scenarioId": "production-dashboard", "scenarioName": "생산 현황판 (Production Dashboard)", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "description": "생산관리 - 생산 현황판 메뉴의 전체 기능 테스트: 통계 카드 확인, 공장별 탭 필터, 긴급/지연 작업 표시, 작업지시 상세보기, 작업자 화면 및 작업지시 목록 이동", "baseUrl": "https://dev.codebridge-x.com", "url": "/production/dashboard", "navigation": { "targetUrl": "/production/dashboard", "urlPattern": "/production/dashboard|/ko/production/dashboard", "menuHints": ["생산 현황판", "생산현황판", "생산관리"] }, "menuNavigation": { "level1": "생산관리", "level2": "생산 현황판", "expectedUrl": "/production/dashboard" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "sidebarSelector": ".sidebar-scroll, [class*='sidebar'], nav[role='navigation']", "scrollConfig": { "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 }, "level1": { "text": "생산관리", "fallbackSelectors": [ "span:has-text('생산관리')", "[data-menu='production']", "a[href*='production']" ] }, "level2": { "text": "생산 현황판", "fallbackSelectors": [ "span:has-text('생산 현황판')", "[data-submenu='dashboard']", "a[href*='dashboard']" ] }, "scrollAndFind": { "enabled": true, "scrollToTopFirst": true, "searchWhileScrolling": true } }, "testData": { "existingWorkOrder": { "작업지시번호": "WO202601150001", "작업상태": "대기", "발주처": "코브라브릿지", "현장명": "테스트현장2", "지연일수": "+2일 지연" } }, "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 } ], "expected": { "sidebarReady": true } }, { "step": 1, "name": "2단계 메뉴 진입: 생산관리 > 생산 현황판", "description": "생산관리 > 생산 현황판 메뉴로 이동하여 페이지 로드 확인 (scrollAndFind 패턴 사용)", "menuNavigation": { "useEnhanced": true, "pattern": "scrollAndFind" }, "actions": [ { "type": "scrollAndFind", "target": "생산관리", "scrollContainer": ".sidebar-scroll", "scrollStep": 200, "maxAttempts": 10 }, { "type": "click", "target": "생산관리" }, { "type": "wait", "duration": 500 }, { "type": "scrollAndFind", "target": "생산 현황판", "scrollContainer": ".sidebar-scroll", "scrollStep": 200, "maxAttempts": 10 }, { "type": "click", "target": "생산 현황판" }, { "type": "wait", "target": "페이지 로드 완료" } ], "expected": { "url": "/ko/production/dashboard", "title": "생산 현황판", "authenticated": true } }, { "step": 2, "name": "페이지 로딩 대기", "action": "wait", "duration": 3, "expected": "데이터 로딩 완료" }, { "step": 3, "name": "페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "생산 현황판" }, { "step": 4, "name": "페이지 설명 확인", "action": "verifyText", "expected": "공장별 작업 현황을 확인합니다." }, { "step": 5, "name": "작업자 화면 버튼 존재 확인", "action": "verifyElement", "selector": "button", "text": "작업자 화면", "expected": "버튼 표시됨" }, { "step": 6, "name": "작업지시 목록 버튼 존재 확인", "action": "verifyElement", "selector": "button", "text": "작업지시 목록", "expected": "버튼 표시됨" }, { "step": 7, "name": "공장 탭 필터 확인 - 전체 탭", "action": "verifyElement", "selector": "tab", "text": "전체", "expected": "전체 탭 표시 및 선택됨" }, { "step": 8, "name": "공장 탭 필터 확인 - 스크린 탭", "action": "verifyElement", "selector": "tab", "text": "스크린", "expected": "스크린 탭 표시됨" }, { "step": 9, "name": "통계 카드 6개 확인", "action": "verifyCount", "selector": "통계 카드", "expected": "6개의 통계 카드 표시 (전체 작업, 작업 대기, 작업중, 작업 완료, 긴급, 지연)" }, { "step": 10, "name": "전체 작업 통계 카드 확인", "action": "verifyElement", "text": "전체 작업", "expected": "전체 작업 카드 표시 및 숫자 확인" }, { "step": 11, "name": "작업 대기 통계 카드 확인", "action": "verifyElement", "text": "작업 대기", "expected": "작업 대기 카드 표시 및 숫자 확인" }, { "step": 12, "name": "작업중 통계 카드 확인", "action": "verifyElement", "text": "작업중", "expected": "작업중 카드 표시 및 숫자 확인" }, { "step": 13, "name": "작업 완료 통계 카드 확인", "action": "verifyElement", "text": "작업 완료", "expected": "작업 완료 카드 표시 및 숫자 확인" }, { "step": 14, "name": "긴급 통계 카드 확인", "action": "verifyElement", "text": "긴급", "expected": "긴급 카드 표시 및 숫자 확인" }, { "step": 15, "name": "지연 통계 카드 확인", "action": "verifyElement", "text": "지연", "expected": "지연 카드 표시 및 숫자 확인 (1개)" }, { "step": 16, "name": "긴급 작업 섹션 제목 확인", "action": "verifyElement", "selector": "h4", "text": "긴급 작업", "expected": "긴급 작업 섹션 표시" }, { "step": 17, "name": "긴급 작업 개수 확인", "action": "verifyText", "expected": "긴급 작업 0 또는 긴급 작업이 없습니다." }, { "step": 18, "name": "지연 작업 섹션 제목 확인", "action": "verifyElement", "selector": "h4", "text": "지연 작업", "expected": "지연 작업 섹션 표시" }, { "step": 19, "name": "지연 작업 개수 확인", "action": "verifyText", "expected": "지연 작업 1" }, { "step": 20, "name": "지연 작업 카드 존재 확인", "action": "verifyElement", "text": "WO202601150001", "expected": "작업지시번호가 표시된 지연 작업 카드 확인" }, { "step": 21, "name": "지연 작업 카드 - 작업상태 확인", "action": "verifyElement", "text": "대기", "expected": "작업상태 표시" }, { "step": 22, "name": "지연 작업 카드 - 발주처 확인", "action": "verifyElement", "text": "코브라브릿지", "expected": "발주처 표시" }, { "step": 23, "name": "지연 작업 카드 - 지연일수 확인", "action": "verifyElement", "text": "+2일 지연", "expected": "지연일수 표시" }, { "step": 24, "name": "작업자별 현황 섹션 제목 확인", "action": "verifyElement", "selector": "h4", "text": "작업자별 현황", "expected": "작업자별 현황 섹션 표시" }, { "step": 25, "name": "스크린 탭 클릭", "action": "click", "selector": "tab", "text": "스크린", "expected": "스크린 공장 필터 적용" }, { "step": 26, "name": "스크린 탭 선택 확인", "action": "verifyAttribute", "selector": "tab[text='스크린']", "attribute": "selected", "expected": "스크린 탭이 선택됨" }, { "step": 27, "name": "스크린 공장 - 통계 변경 확인", "action": "verifyStatChange", "expected": "통계 카드 숫자가 스크린 공장 데이터로 변경 (전체 0개)" }, { "step": 28, "name": "스크린 공장 - 지연 작업 확인", "action": "verifyText", "expected": "지연 작업이 없습니다." }, { "step": 29, "name": "전체 탭으로 복귀", "action": "click", "selector": "tab", "text": "전체", "expected": "전체 필터로 복귀" }, { "step": 30, "name": "전체 탭 선택 확인", "action": "verifyAttribute", "selector": "tab[text='전체']", "attribute": "selected", "expected": "전체 탭이 선택됨" }, { "step": 31, "name": "전체 필터 - 통계 복귀 확인", "action": "verifyText", "expected": "전체 작업 1개 복귀" }, { "step": 32, "name": "전체 필터 - 지연 작업 복귀 확인", "action": "verifyText", "expected": "지연 작업 1개 복귀" }, { "step": 33, "name": "지연 작업 카드 클릭", "action": "click", "text": "WO202601150001", "expected": "작업지시 상세 페이지로 이동" }, { "step": 34, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders/1로 변경 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 35, "name": "작업지시 상세 페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "작업지시 상세" }, { "step": 36, "name": "수정 버튼 존재 확인", "action": "verifyElement", "selector": "button", "text": "수정", "expected": "수정 버튼 표시" }, { "step": 37, "name": "작업일지 버튼 존재 확인", "action": "verifyElement", "selector": "button", "text": "작업일지", "expected": "작업일지 버튼 표시" }, { "step": 38, "name": "목록 버튼 존재 확인", "action": "verifyElement", "selector": "button", "text": "목록", "expected": "목록 버튼 표시" }, { "step": 39, "name": "기본 정보 섹션 확인", "action": "verifyElement", "selector": "h3", "text": "기본 정보", "expected": "기본 정보 섹션 표시" }, { "step": 40, "name": "작업지시번호 확인", "action": "verifyData", "field": "작업지시번호", "expected": "WO202601150001" }, { "step": 41, "name": "로트번호 확인", "action": "verifyData", "field": "로트번호", "expected": "ORD202601150001" }, { "step": 42, "name": "작업상태 확인", "action": "verifyData", "field": "작업상태", "expected": "승인대기" }, { "step": 43, "name": "발주처 확인", "action": "verifyData", "field": "발주처", "expected": "코브라브릿지" }, { "step": 44, "name": "현장명 확인", "action": "verifyData", "field": "현장명", "expected": "테스트현장2" }, { "step": 45, "name": "납기일 확인", "action": "verifyData", "field": "납기일", "expected": "2026-01-14" }, { "step": 46, "name": "우선순위 확인", "action": "verifyData", "field": "우선순위", "expected": "5 (일반)" }, { "step": 47, "name": "공정 진행 섹션 확인", "action": "verifyElement", "selector": "h3", "text": "공정 진행 (5단계)", "expected": "공정 진행 섹션 표시" }, { "step": 48, "name": "공정 단계 1 - 원단절단 확인", "action": "verifyElement", "text": "원단절단", "expected": "원단절단 공정 표시" }, { "step": 49, "name": "공정 단계 2 - 미싱 확인", "action": "verifyElement", "text": "미싱", "expected": "미싱 공정 표시" }, { "step": 50, "name": "공정 단계 3 - 앤드락작업 확인", "action": "verifyElement", "text": "앤드락작업", "expected": "앤드락작업 공정 표시" }, { "step": 51, "name": "공정 단계 4 - 중간검사 확인", "action": "verifyElement", "text": "중간검사", "expected": "중간검사 공정 표시" }, { "step": 52, "name": "공정 단계 5 - 포장 확인", "action": "verifyElement", "text": "포장", "expected": "포장 공정 표시" }, { "step": 53, "name": "작업 품목 섹션 확인", "action": "verifyElement", "selector": "h3", "text": "작업 품목 (0건)", "expected": "작업 품목 섹션 표시" }, { "step": 54, "name": "작업 품목 없음 메시지 확인", "action": "verifyText", "expected": "등록된 품목이 없습니다." }, { "step": 55, "name": "목록 버튼 클릭", "action": "click", "selector": "button", "text": "목록", "expected": "작업지시 목록 페이지로 이동" }, { "step": 56, "name": "URL 변경 확인 - 작업지시 목록", "action": "verifyUrl", "expected": "URL이 /production/work-orders로 변경", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 57, "name": "작업지시 목록 페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "작업지시 목록" }, { "step": 58, "name": "작업지시 목록 - 등록 버튼 확인", "action": "verifyElement", "selector": "button", "text": "등록", "expected": "등록 버튼 표시" }, { "step": 59, "name": "작업지시 목록 - 통계 카드 확인", "action": "verifyCount", "expected": "4개의 통계 카드 (전체, 작업대기, 작업중, 작업완료)" }, { "step": 60, "name": "작업지시 목록 - 검색창 확인", "action": "verifyElement", "selector": "textbox", "placeholder": "작업지시번호, 발주처, 현장명 검색...", "expected": "검색창 표시" }, { "step": 61, "name": "작업지시 목록 - 상태 탭 확인", "action": "verifyElement", "selector": "button", "text": "전체", "expected": "상태 필터 탭 표시" }, { "step": 62, "name": "작업지시 목록 - 테이블 확인", "action": "verifyElement", "selector": "table", "expected": "작업지시 테이블 표시" }, { "step": 63, "name": "작업지시 목록 - 테이블 헤더 확인", "action": "verifyTableHeaders", "expected": "번호, 작업지시번호, 공정, 로트번호, 지시일, 배정, 작업, 시작, 작업상태, 현장순위, 작업자, 현장명, 출고예정일" }, { "step": 64, "name": "작업지시 목록 - 데이터 행 확인", "action": "verifyElement", "text": "WO202601150001", "expected": "테스트 작업지시 데이터 표시" }, { "step": 65, "name": "생산 현황판으로 복귀", "action": "navigate", "url": "/production/dashboard", "expected": "생산 현황판 페이지로 이동" }, { "step": 66, "name": "페이지 로딩 대기", "action": "wait", "duration": 3, "expected": "데이터 로딩 완료" }, { "step": 67, "name": "작업자 화면 버튼 클릭", "action": "click", "selector": "button", "text": "작업자 화면", "expected": "작업자 화면 페이지로 이동" }, { "step": 68, "name": "URL 변경 확인 - 작업자 화면", "action": "verifyUrl", "expected": "URL이 작업자 화면 URL로 변경 (404 에러 페이지 아님)", "validation": { "contains": ["work", "worker", "operator"], "notContains": ["404", "not-found", "error"] } }, { "step": 69, "name": "작업자 화면 페이지 확인", "action": "verifyPage", "expected": "작업자 화면 페이지 정상 로딩" }, { "step": 70, "name": "생산 현황판으로 재복귀", "action": "navigate", "url": "/production/dashboard", "expected": "생산 현황판 페이지로 이동" }, { "step": 71, "name": "페이지 로딩 대기", "action": "wait", "duration": 3, "expected": "데이터 로딩 완료" }, { "step": 72, "name": "작업지시 목록 버튼 클릭", "action": "click", "selector": "button", "text": "작업지시 목록", "expected": "작업지시 목록 페이지로 이동" }, { "step": 73, "name": "URL 변경 확인 - 작업지시 목록", "action": "verifyUrl", "expected": "URL이 /production/work-orders로 변경", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 74, "name": "작업지시 목록 페이지 재확인", "action": "verifyText", "selector": "h1", "expected": "작업지시 목록" }, { "step": 75, "name": "최종 검증 - 생산 현황판 복귀", "action": "navigate", "url": "/production/dashboard", "expected": "생산 현황판 페이지로 최종 복귀" }, { "step": 76, "name": "페이지 로딩 대기", "action": "wait", "duration": 3, "expected": "데이터 로딩 완료" }, { "step": 77, "name": "최종 검증 - 페이지 제목", "action": "verifyText", "selector": "h1", "expected": "생산 현황판" }, { "step": 78, "name": "최종 검증 - 전체 탭 선택", "action": "verifyAttribute", "selector": "tab[text='전체']", "attribute": "selected", "expected": "전체 탭이 선택됨" }, { "step": 79, "name": "최종 검증 - 통계 카드", "action": "verifyElement", "text": "전체 작업", "expected": "통계 카드 정상 표시" }, { "step": 80, "name": "최종 검증 - 지연 작업", "action": "verifyElement", "text": "지연 작업", "expected": "지연 작업 섹션 정상 표시" } ], "expectedAPIs": [ { "description": "생산 현황 데이터 조회", "method": "GET", "endpoint": "/api/production/dashboard", "expectedStatus": 200 }, { "description": "공장별 필터 데이터 조회", "method": "GET", "endpoint": "/api/production/dashboard?factory=screen", "expectedStatus": 200 }, { "description": "작업지시 상세 조회", "method": "GET", "endpoint": "/api/production/work-orders/1", "expectedStatus": 200 }, { "description": "작업지시 목록 조회", "method": "GET", "endpoint": "/api/production/work-orders", "expectedStatus": 200 } ], "notes": [ "생산 현황판은 실시간 데이터를 표시하므로 통계 숫자는 변동될 수 있음", "공장 탭은 현재 '전체'와 '스크린' 2개만 존재", "지연 작업 카드 클릭 시 작업지시 상세 페이지로 이동해야 함", "페이지 로딩 시 3초 대기 필요 (데이터 비동기 로딩)", "작업자 화면 버튼은 별도 작업자 전용 화면으로 이동", "작업지시 목록 버튼은 작업지시 관리 페이지로 이동" ] }