Files
sam-scenarios/production-dashboard.json
light 8580c891eb fix: 시나리오 URL 및 메뉴 존재 여부 수정
- announcement-board.json 삭제 (공지사항 메뉴 미존재)
- bank-account-management.json URL 수정: /settings/bank-account → /settings/accounts
- company-info.json URL 수정: /settings/company → /company-info

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:26:52 +09:00

721 lines
20 KiB
JSON

{
"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",
"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초 대기 필요 (데이터 비동기 로딩)",
"작업자 화면 버튼은 별도 작업자 전용 화면으로 이동",
"작업지시 목록 버튼은 작업지시 관리 페이지로 이동"
]
}