{ "scenarioId": "work-order-management", "scenarioName": "작업지시 관리 (Work Order Management)", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "description": "생산관리 - 작업지시 관리 메뉴의 전체 기능 테스트: 목록 조회, 통계 카드, 검색/필터, 등록 (수주 연동 / 수동 등록), 상세 조회, 수정, 작업일지", "baseUrl": "https://dev.codebridge-x.com", "url": "/ko/production/work-orders", "menuNavigation": { "level1": "생산관리", "level2": "작업지시 관리", "expectedUrl": "/ko/production/work-orders" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지", "level1": "생산관리", "level2": "작업지시 관리", "alternativeLevel1Names": ["생산관리", "생산 관리", "Production", "제조관리"], "alternativeLevel2Names": ["작업지시 목록", "작업지시목록", "Work Orders", "작업지시", "지시서 목록"], "scrollConfig": { "sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar", "menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']", "scrollStep": 200, "maxScrollAttempts": 10, "scrollDelay": 300 } }, "testData": { "existingWorkOrder": { "작업지시번호": "WO202601150001", "로트번호": "ORD202601150001", "작업상태": "승인대기", "발주처": "코브라브릿지", "현장명": "테스트현장2", "납기일": "2026-01-14", "우선순위": "5 (일반)" }, "searchKeyword": "WO2026", "manualRegistration": { "발주처": "테스트발주처", "현장명": "테스트현장", "수주번호": "ORD202601170001", "품목수": "5" } }, "steps": [ { "step": 0, "name": "사이드바 메뉴 탐색 준비", "description": "사이드바를 최상단으로 스크롤하고 메뉴 구조 파악", "actions": [ { "type": "scroll", "target": "sidebar", "direction": "top", "description": "사이드바 최상단으로 스크롤" }, { "type": "wait", "duration": 500 } ] }, { "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": ["작업지시 목록", "작업지시목록", "Work Orders", "작업지시"], "scrollContainer": "submenu", "maxAttempts": 5, "description": "서브메뉴에서 작업지시 목록 찾기" }, { "type": "click", "target": "작업지시 목록", "description": "작업지시 목록 메뉴 클릭" }, { "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 } ], "expected": { "url": "/ko/production/work-orders", "title": "작업지시 목록", "authenticated": true }, "verification": [ "생산관리 메뉴가 펼쳐졌는지 확인", "작업지시 목록 서브메뉴 클릭 성공", "404 에러 없이 페이지 로드 완료" ] }, { "step": 2, "name": "페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 목록\" 제목 표시" }, { "step": 3, "name": "페이지 설명 확인", "action": "verifyText", "selector": "p", "expected": "\"생산 작업지시 관리\" 설명 표시" }, { "step": 4, "name": "등록 버튼 확인", "action": "verifyElement", "selector": "button[name='등록']", "expected": "등록 버튼 표시됨" }, { "step": 5, "name": "통계 카드 4개 확인", "action": "verifyElement", "expected": "전체, 작업대기, 작업중, 작업완료 통계 카드 표시" }, { "step": 6, "name": "통계 카드 데이터 확인", "action": "verifyText", "expected": "전체(1), 작업대기(1), 작업중(0), 작업완료(0)" }, { "step": 7, "name": "검색 입력 필드 확인", "action": "verifyElement", "selector": "textbox[placeholder='작업지시번호, 발주처, 현장명 검색...']", "expected": "검색 입력 필드 표시됨" }, { "step": 8, "name": "상태 필터 탭 6개 확인", "action": "verifyElement", "expected": "전체, 미배정, 승인대기, 작업대기, 작업중, 작업완료 탭 표시" }, { "step": 9, "name": "상태 필터 탭 데이터 확인", "action": "verifyText", "expected": "전체(1), 미배정(0), 승인대기(1), 작업대기(0), 작업중(0), 작업완료(0)" }, { "step": 10, "name": "테이블 헤더 13개 컬럼 확인", "action": "verifyElement", "expected": "체크박스, 번호, 작업지시번호, 공정, 로트번호, 지시일, 배정, 작업, 시작, 작업상태, 현장순위, 작업자, 현장명, 출고예정일" }, { "step": 11, "name": "테이블 데이터 행 확인", "action": "verifyElement", "expected": "1건의 작업지시 (WO202601150001) 표시" }, { "step": 12, "name": "작업지시 데이터 내용 확인", "action": "verifyText", "expected": "작업지시번호: WO202601150001, 로트번호: ORD202601150001, 작업상태: 승인대기, 현장명: 테스트현장2" }, { "step": 13, "name": "페이지네이션 정보 확인", "action": "verifyText", "expected": "전체 1개 중 1-1개 표시" }, { "step": 14, "name": "검색 기능 테스트 - 검색어 입력 (필수 검증 #3)", "action": "type", "selector": "textbox[placeholder='작업지시번호, 발주처, 현장명 검색...']", "value": "WO2026", "expected": "검색어 입력됨" }, { "step": 15, "name": "검색 결과 확인 (필수 검증 #3)", "action": "verifyElement", "expected": "검색어와 일치하는 데이터 (WO202601150001) 표시" }, { "step": 16, "name": "검색어 초기화", "action": "clear", "selector": "textbox[placeholder='작업지시번호, 발주처, 현장명 검색...']", "expected": "검색어 초기화됨" }, { "step": 17, "name": "승인대기 탭 클릭 (필수 검증 #3)", "action": "click", "selector": "button[name='승인대기 1']", "expected": "승인대기 탭 활성화" }, { "step": 18, "name": "승인대기 필터 결과 확인 (필수 검증 #3)", "action": "verifyElement", "expected": "승인대기 상태 작업지시 1건 표시" }, { "step": 19, "name": "전체 탭 클릭", "action": "click", "selector": "button[name='전체 1']", "expected": "전체 탭 활성화" }, { "step": 20, "name": "전체 필터 결과 확인", "action": "verifyElement", "expected": "전체 작업지시 1건 표시" }, { "step": 21, "name": "등록 버튼 클릭", "action": "click", "selector": "button[name='등록']", "expected": "등록 버튼 클릭됨" }, { "step": 22, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders/create로 변경 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 23, "name": "작업지시 등록 페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 등록\" 제목 표시" }, { "step": 24, "name": "취소/등록 버튼 확인", "action": "verifyElement", "expected": "취소, 등록 버튼 표시됨" }, { "step": 25, "name": "등록 방식 라디오 버튼 2개 확인", "action": "verifyElement", "expected": "수주 연동 등록, 수동 등록 라디오 버튼 표시" }, { "step": 26, "name": "기본 선택 상태 확인", "action": "verifyElement", "expected": "수주 연동 등록이 기본 선택됨" }, { "step": 27, "name": "수주 정보 섹션 확인", "action": "verifyElement", "expected": "수주 정보 섹션 표시, \"수주 선택\" 버튼 존재" }, { "step": 28, "name": "수주 연동 모드 - 기본 정보 필드 4개 확인", "action": "verifyElement", "expected": "발주처, 현장명, 수주번호, 품목수 필드 표시 (모두 disabled)" }, { "step": 29, "name": "작업지시 정보 섹션 확인", "action": "verifyElement", "expected": "공정구분, 출고예정일, 우선순위, 담당자 필드 표시" }, { "step": 30, "name": "비고 필드 확인", "action": "verifyElement", "expected": "비고 입력 필드 표시" }, { "step": 31, "name": "수주 선택 버튼 클릭", "action": "click", "selector": "button[name='수주 선택']", "expected": "수주 선택 버튼 클릭됨" }, { "step": 32, "name": "수주 선택 모달 열림 확인", "action": "verifyElement", "selector": "dialog[aria-label='수주 선택']", "expected": "수주 선택 모달 표시됨" }, { "step": 33, "name": "모달 제목 확인", "action": "verifyText", "selector": "h2", "expected": "\"수주 선택\" 제목 표시" }, { "step": 34, "name": "모달 검색 필드 확인", "action": "verifyElement", "selector": "textbox[placeholder='수주번호, 거래처, 현장명 검색...']", "expected": "검색 입력 필드 표시됨" }, { "step": 35, "name": "모달 상태 메시지 확인", "action": "verifyText", "expected": "작업지시 가능한 수주 0건 메시지 표시" }, { "step": 36, "name": "모달 닫기 버튼 확인", "action": "verifyElement", "selector": "button[name='Close']", "expected": "닫기 버튼 표시됨" }, { "step": 37, "name": "모달 닫기", "action": "click", "selector": "button[name='Close']", "expected": "모달 닫힘" }, { "step": 38, "name": "모달 닫힘 확인", "action": "verifyElement", "expected": "모달이 화면에서 사라짐" }, { "step": 39, "name": "수동 등록 라디오 버튼 클릭", "action": "click", "selector": "radio[name='수동 등록 (재고생산)']", "expected": "수동 등록 라디오 버튼 클릭됨" }, { "step": 40, "name": "수동 등록 모드 활성화 확인", "action": "verifyElement", "expected": "수동 등록이 선택됨" }, { "step": 41, "name": "수주 정보 섹션 숨김 확인", "action": "verifyElement", "expected": "수주 정보 섹션이 화면에서 사라짐" }, { "step": 42, "name": "수동 등록 모드 - 기본 정보 필드 활성화 확인", "action": "verifyElement", "expected": "발주처, 현장명, 수주번호, 품목수 필드가 입력 가능 (enabled)" }, { "step": 43, "name": "발주처 필드 placeholder 확인", "action": "verifyText", "selector": "textbox[placeholder='발주처 입력']", "expected": "\"발주처 입력\" placeholder 표시" }, { "step": 44, "name": "현장명 필드 placeholder 확인", "action": "verifyText", "selector": "textbox[placeholder='현장명 입력']", "expected": "\"현장명 입력\" placeholder 표시" }, { "step": 45, "name": "공정구분 콤보박스 확인", "action": "verifyElement", "selector": "combobox[name='공정구분']", "expected": "공정구분 드롭다운 표시, 기본값 \"스크린\"" }, { "step": 46, "name": "우선순위 콤보박스 확인", "action": "verifyElement", "selector": "combobox[name='우선순위']", "expected": "우선순위 드롭다운 표시, 기본값 \"5 (일반)\"" }, { "step": 47, "name": "담당자 선택 필드 확인", "action": "verifyElement", "expected": "담당자 선택 필드 표시, placeholder \"담당자를 선택하세요 (팀/개인)\"" }, { "step": 48, "name": "취소 버튼 클릭", "action": "click", "selector": "button[name='취소']", "expected": "취소 버튼 클릭됨" }, { "step": 49, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders로 변경 (목록 페이지로 복귀)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 50, "name": "목록 페이지 복귀 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 목록\" 제목 표시" }, { "step": 51, "name": "작업지시 행 클릭 - 상세 페이지 이동", "action": "click", "selector": "row[name='WO202601150001']", "expected": "작업지시 행 클릭됨" }, { "step": 52, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders/1로 변경 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 53, "name": "작업지시 상세 페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 상세\" 제목 표시" }, { "step": 54, "name": "상세 페이지 버튼 3개 확인", "action": "verifyElement", "expected": "수정, 작업일지, 목록 버튼 표시" }, { "step": 55, "name": "기본 정보 섹션 확인", "action": "verifyElement", "expected": "기본 정보 섹션 표시 (9개 필드)" }, { "step": 56, "name": "기본 정보 데이터 확인", "action": "verifyText", "expected": "작업지시번호: WO202601150001, 로트번호: ORD202601150001, 작업상태: 승인대기, 발주처: 코브라브릿지, 현장명: 테스트현장2, 납기일: 2026-01-14, 우선순위: 5 (일반)" }, { "step": 57, "name": "공정 진행 섹션 확인", "action": "verifyElement", "expected": "공정 진행 (5단계) 섹션 표시" }, { "step": 58, "name": "공정 5단계 확인", "action": "verifyText", "expected": "1. 원단절단, 2. 미싱, 3. 앤드락작업, 4. 중간검사, 5. 포장" }, { "step": 59, "name": "작업 품목 섹션 확인", "action": "verifyElement", "expected": "작업 품목 (0건) 섹션 표시" }, { "step": 60, "name": "작업 품목 빈 상태 메시지 확인", "action": "verifyText", "expected": "\"등록된 품목이 없습니다.\" 메시지 표시" }, { "step": 61, "name": "수정 버튼 클릭", "action": "click", "selector": "button[name='수정']", "expected": "수정 버튼 클릭됨" }, { "step": 62, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders/1?mode=edit로 변경 (404 에러 페이지 아님)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 63, "name": "작업지시 수정 페이지 제목 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 수정\" 제목 표시" }, { "step": 64, "name": "수정 페이지 작업지시번호 확인", "action": "verifyText", "expected": "\"(WO202601150001)\" 표시" }, { "step": 65, "name": "수정 페이지 버튼 2개 확인", "action": "verifyElement", "expected": "취소, 저장 버튼 표시" }, { "step": 66, "name": "수정 페이지 기본 정보 섹션 확인", "action": "verifyElement", "expected": "기본 정보 섹션 표시 (4개 필드)" }, { "step": 67, "name": "수정 페이지 필드 상태 확인", "action": "verifyElement", "expected": "발주처(disabled), 현장명(enabled), 수주번호(disabled), 품목수(disabled)" }, { "step": 68, "name": "수정 페이지 작업지시 정보 섹션 확인", "action": "verifyElement", "expected": "작업지시 정보 섹션 표시 (4개 필드)" }, { "step": 69, "name": "수정 페이지 공정구분 확인", "action": "verifyElement", "selector": "combobox[name='공정구분']", "expected": "공정구분 드롭다운 표시" }, { "step": 70, "name": "수정 페이지 출고예정일 확인", "action": "verifyElement", "selector": "textbox[name='출고예정일']", "expected": "출고예정일 필드 표시, 값: 2026-01-14" }, { "step": 71, "name": "수정 페이지 우선순위 확인", "action": "verifyElement", "selector": "combobox[name='우선순위']", "expected": "우선순위 드롭다운 표시, 값: 5 (일반)" }, { "step": 72, "name": "수정 페이지 담당자 필드 확인", "action": "verifyElement", "expected": "담당자 선택 필드 표시" }, { "step": 73, "name": "수정 페이지 비고 필드 확인", "action": "verifyElement", "expected": "비고 입력 필드 표시" }, { "step": 74, "name": "취소 버튼 클릭 (수정 페이지)", "action": "click", "selector": "button[name='취소']", "expected": "취소 버튼 클릭됨" }, { "step": 75, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders/1로 변경 (상세 페이지로 복귀)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 76, "name": "상세 페이지 복귀 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 상세\" 제목 표시" }, { "step": 77, "name": "목록 버튼 클릭", "action": "click", "selector": "button[name='목록']", "expected": "목록 버튼 클릭됨" }, { "step": 78, "name": "URL 변경 확인 (필수 검증 #2)", "action": "verifyUrl", "expected": "URL이 /production/work-orders로 변경 (목록 페이지로 복귀)", "validation": { "notContains": ["404", "not-found", "error"] } }, { "step": 79, "name": "목록 페이지 복귀 확인", "action": "verifyText", "selector": "h1", "expected": "\"작업지시 목록\" 제목 표시" }, { "step": 80, "name": "최종 데이터 확인", "action": "verifyElement", "expected": "1건의 작업지시 (WO202601150001) 표시" } ], "expectedAPIs": [ { "description": "작업지시 목록 조회", "method": "GET", "endpoint": "/api/production/work-orders", "expectedStatus": 200 }, { "description": "작업지시 상세 조회", "method": "GET", "endpoint": "/api/production/work-orders/1", "expectedStatus": 200 }, { "description": "수주 목록 조회 (작업지시 가능)", "method": "GET", "endpoint": "/api/sales/orders?status=registered", "expectedStatus": 200 }, { "description": "작업지시 등록", "method": "POST", "endpoint": "/api/production/work-orders", "expectedStatus": 201 }, { "description": "작업지시 수정", "method": "PUT", "endpoint": "/api/production/work-orders/1", "expectedStatus": 200 } ] }