{ "id": "attendance-settings", "name": "설정 - 근태설정", "screenshotPolicy": { "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, "url": "/ko/settings/attendance-settings", "menuNavigation": { "level1": "설정", "level2": "근태설정", "expectedUrl": "/ko/settings/attendance-settings" }, "menuNavigationEnhanced": { "strategy": "scroll-and-search", "sidebarSelector": ".sidebar-scroll, [data-testid='sidebar'], nav[role='navigation']", "scrollStep": 200, "maxScrollAttempts": 10, "waitAfterScroll": 300, "level1": { "text": "설정", "selectors": [ "button:has-text('설정')", "[data-menu='settings']", "a:has-text('설정')" ] }, "level2": { "text": "출퇴근관리", "selectors": [ "a:has-text('출퇴근관리')", "[href*='attendance-settings']", "button:has-text('출퇴근관리')" ] }, "fallbackUrl": "/ko/settings/attendance-settings" }, "expectedAPIs": [ { "method": "GET", "path": "/api/v1/settings/attendance", "description": "출퇴근 설정 조회" }, { "method": "GET", "path": "/api/v1/departments/tree", "description": "부서 트리 조회" }, { "method": "PUT", "path": "/api/v1/settings/attendance", "description": "출퇴근 설정 저장" } ], "steps": [ { "id": 0, "name": "사이드바 준비", "description": "메뉴 탐색 전 사이드바 스크롤을 최상단으로 초기화", "actions": [ { "type": "evaluate", "script": "document.querySelector('.sidebar-scroll, [data-testid=\"sidebar\"], nav[role=\"navigation\"]')?.scrollTo({top:0,behavior:'instant'})" }, { "type": "wait", "duration": 500 } ], "expected": { "sidebarReady": true } }, { "id": 1, "name": "2단계 메뉴 진입: 설정 > 출퇴근관리", "description": "설정 > 출퇴근관리 메뉴로 이동하여 페이지 로드 확인 (scrollAndFind 패턴 사용)", "actions": [ { "type": "scrollAndFind", "target": "설정", "container": ".sidebar-scroll", "scrollStep": 200, "maxAttempts": 10 }, { "type": "click", "target": "설정" }, { "type": "wait", "duration": 500 }, { "type": "scrollAndFind", "target": "출퇴근관리", "container": ".sidebar-scroll", "scrollStep": 200, "maxAttempts": 10 }, { "type": "click", "target": "출퇴근관리" }, { "type": "wait", "target": "페이지 로드 완료" } ], "expected": { "url": "/ko/settings/attendance-settings", "title": "출퇴근관리", "authenticated": true } }, { "id": 2, "name": "페이지 제목 확인", "action": "verify", "target": "heading", "expected": "'출퇴근관리' 텍스트 표시" }, { "id": 3, "name": "설명 텍스트 확인", "action": "verify", "target": "description", "expected": "'출퇴근 방법을 관리합니다.' 텍스트 표시" }, { "id": 4, "name": "GPS 출퇴근 카드 확인", "action": "verify", "target": "card", "expected": "'GPS 출퇴근' 카드 표시" }, { "id": 5, "name": "자동 출퇴근 카드 확인", "action": "verify", "target": "card", "expected": "'자동 출퇴근' 카드 표시" }, { "id": 6, "name": "저장 버튼 확인", "action": "verify", "target": "button", "expected": "'저장' 버튼 표시 (초기 상태 비활성화 가능)" }, { "id": 7, "name": "초기 설정 상태 확인", "action": "verify", "target": "checkboxes", "expected": "GPS 출퇴근, 자동 출퇴근 체크박스 상태 확인" }, { "id": 8, "name": "GPS 출퇴근 비활성화 상태 - 연동 부서 비활성화 확인", "action": "verify", "target": "combobox", "expected": "GPS 체크박스가 OFF일 때 연동 부서 콤보박스 비활성화" }, { "id": 9, "name": "GPS 출퇴근 비활성화 상태 - 허용 반경 비활성화 확인", "action": "verify", "target": "select", "expected": "GPS 체크박스가 OFF일 때 허용 반경 셀렉트 비활성화" }, { "id": 10, "name": "GPS 출퇴근 활성화", "action": "click", "target": "GPS 출퇴근 체크박스", "expected": "체크박스 선택됨", "critical": true }, { "id": 11, "name": "GPS 활성화 후 - 연동 부서 활성화 확인", "action": "verify", "target": "combobox", "expected": "연동 부서 콤보박스 활성화됨" }, { "id": 12, "name": "GPS 활성화 후 - 허용 반경 활성화 확인", "action": "verify", "target": "select", "expected": "허용 반경 셀렉트 활성화됨" }, { "id": 13, "name": "GPS 연동 부서 콤보박스 클릭", "action": "click", "target": "GPS 연동 부서 콤보박스", "expected": "부서 선택 드롭다운 열림" }, { "id": 14, "name": "GPS 부서 선택 - 첫 번째 부서", "action": "select", "target": "부서 옵션", "expected": "첫 번째 부서 선택됨" }, { "id": 15, "name": "GPS 부서 선택 - 두 번째 부서", "action": "select", "target": "부서 옵션", "expected": "두 번째 부서 추가 선택됨 (다중 선택)" }, { "id": 16, "name": "GPS 연동 부서 드롭다운 닫기", "action": "click", "target": "외부 영역", "expected": "드롭다운 닫힘, 선택된 부서 표시" }, { "id": 17, "name": "허용 반경 드롭다운 클릭", "action": "click", "target": "허용 반경 셀렉트", "expected": "반경 옵션 드롭다운 열림" }, { "id": 18, "name": "허용 반경 변경", "action": "select", "target": "300M 옵션", "expected": "'300M' 선택됨", "critical": true }, { "id": 19, "name": "자동 출퇴근 활성화", "action": "click", "target": "자동 출퇴근 체크박스", "expected": "체크박스 선택됨", "critical": true }, { "id": 20, "name": "자동 출퇴근 활성화 후 - 연동 부서 활성화 확인", "action": "verify", "target": "combobox", "expected": "자동 출퇴근 연동 부서 콤보박스 활성화됨" }, { "id": 21, "name": "자동 출퇴근 연동 부서 콤보박스 클릭", "action": "click", "target": "자동 출퇴근 연동 부서 콤보박스", "expected": "부서 선택 드롭다운 열림" }, { "id": 22, "name": "자동 출퇴근 부서 선택", "action": "select", "target": "부서 옵션", "expected": "부서 선택됨" }, { "id": 23, "name": "자동 출퇴근 연동 부서 드롭다운 닫기", "action": "click", "target": "외부 영역", "expected": "드롭다운 닫힘" }, { "id": 24, "name": "저장 버튼 클릭", "action": "click", "target": "저장 버튼", "expected": "저장 API 호출, 로딩 상태 표시", "critical": true }, { "id": 25, "name": "저장 완료 토스트 확인", "action": "verify", "target": "toast", "expected": "'출퇴근 설정이 저장되었습니다.' 토스트 표시" }, { "id": 26, "name": "URL 유지 확인", "action": "verify", "target": "url", "expected": "URL이 /settings/attendance-settings 유지 (에러 페이지 이동 없음)" }, { "id": 27, "name": "페이지 새로고침", "action": "reload", "target": "page", "expected": "페이지 새로고침 후 GET API 재호출" }, { "id": 28, "name": "설정 지속성 확인 - GPS 출퇴근", "action": "verify", "target": "checkbox", "expected": "GPS 출퇴근 체크박스 선택 상태 유지" }, { "id": 29, "name": "설정 지속성 확인 - 허용 반경", "action": "verify", "target": "select", "expected": "허용 반경 300M 선택 상태 유지" }, { "id": 30, "name": "GPS 출퇴근 비활성화", "action": "click", "target": "GPS 출퇴근 체크박스", "expected": "체크박스 선택 해제" }, { "id": 31, "name": "GPS 비활성화 후 - 연동 부서 초기화 확인", "action": "verify", "target": "combobox", "expected": "연동 부서 '부서 선택' 상태로 초기화 (UI 전용)" }, { "id": 32, "name": "GPS 비활성화 후 - 허용 반경 초기화 확인", "action": "verify", "target": "select", "expected": "허용 반경 '100M'로 초기화 (UI 전용)" }, { "id": 33, "name": "GPS 비활성화 후 - 컨트롤 비활성화 확인", "action": "verify", "target": "controls", "expected": "연동 부서 및 허용 반경 비활성화됨" }, { "id": 34, "name": "자동 출퇴근 비활성화", "action": "click", "target": "자동 출퇴근 체크박스", "expected": "체크박스 선택 해제" }, { "id": 35, "name": "자동 출퇴근 비활성화 후 - 연동 부서 초기화 확인", "action": "verify", "target": "combobox", "expected": "연동 부서 '부서 선택' 상태로 초기화 (UI 전용)" }, { "id": 36, "name": "자동 출퇴근 비활성화 후 - 컨트롤 비활성화 확인", "action": "verify", "target": "combobox", "expected": "연동 부서 비활성화됨" }, { "id": 37, "name": "비활성화 상태 저장", "action": "click", "target": "저장 버튼", "expected": "저장 API 호출" }, { "id": 38, "name": "비활성화 저장 완료 확인", "action": "verify", "target": "toast", "expected": "'출퇴근 설정이 저장되었습니다.' 토스트 표시" }, { "id": 39, "name": "모든 허용 반경 옵션 테스트 - 50M", "action": "test-options", "target": "허용 반경 셀렉트", "expected": "50M, 100M, 300M, 500M 옵션 모두 선택 가능" }, { "id": 40, "name": "콘솔 에러 확인", "action": "verify", "target": "console", "expected": "콘솔에 에러 로그 없음" }, { "id": 41, "name": "안내 문구 확인", "action": "verify", "target": "help-text", "expected": "3개의 안내 문구 표시" }, { "id": 42, "name": "최종 상태 확인", "action": "verify", "target": "page", "expected": "페이지 정상 동작, 모든 설정 저장됨" } ], "testData": { "settings": { "gpsEnabled": true, "allowedRadius": 300, "autoEnabled": true }, "radiusOptions": [ { "value": 50, "label": "50M" }, { "value": 100, "label": "100M" }, { "value": 300, "label": "300M" }, { "value": 500, "label": "500M" } ] } }