Files
sam-scenarios/customer-inquiry.json
light cff20a6c0e refactor: navigation 속성 추가 (targetUrl, urlPattern, menuHints)
- 54개 시나리오 파일에 URL 기반 메뉴 탐색을 위한 navigation 속성 추가
- targetUrl: 정확한 페이지 URL 경로
- urlPattern: ko 버전 포함 URL 패턴 (regex)
- menuHints: 메뉴명 힌트 배열 (fallback용)

메뉴 탐색 실패율 41.8% → URL 기반 방식으로 개선 예정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 21:47:29 +09:00

561 lines
18 KiB
JSON

{
"id": "customer-inquiry",
"name": "고객센터 - 1:1 문의",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
},
"description": "1:1 문의 목록 조회, 문의 등록, 상세 조회, 수정, 삭제, 댓글 작성 전체 워크플로우 테스트",
"url": "/ko/customer-center/qna",
"navigation": {
"targetUrl": "/customer-center/qna",
"urlPattern": "/customer-center/qna|/ko/customer-center/qna",
"menuHints": ["1:1 문의", "문의", "고객센터"]
},
"menuNavigation": {
"level1": "고객센터",
"level2": "1:1 문의",
"expectedUrl": "/ko/customer-center/qna"
},
"menuNavigationEnhanced": {
"strategy": "scroll-and-search",
"sidebarSelector": ".sidebar-scroll, [data-sidebar-content], nav[role='navigation']",
"scrollBehavior": {
"scrollToTop": true,
"scrollStep": 200,
"maxScrollAttempts": 10,
"waitAfterScroll": 300
},
"menuSearch": {
"level1": {
"text": "고객센터",
"selectors": ["[data-menu-item]", ".nav-item", "button", "a"],
"expandable": true
},
"level2": {
"text": "1:1 문의",
"selectors": ["[data-submenu-item]", ".nav-subitem", "a"],
"waitForVisible": true
}
},
"fallbackUrl": "/ko/customer-center/qna"
},
"expectedAPIs": [
{
"method": "GET",
"path": "/api/tenants/*/boards/qna/posts",
"description": "문의 목록 조회"
},
{
"method": "POST",
"path": "/api/tenants/*/boards/qna/posts",
"description": "문의 등록"
},
{
"method": "GET",
"path": "/api/tenants/*/boards/qna/posts/*",
"description": "문의 상세 조회"
},
{
"method": "PUT",
"path": "/api/tenants/*/boards/qna/posts/*",
"description": "문의 수정"
},
{
"method": "DELETE",
"path": "/api/tenants/*/boards/qna/posts/*",
"description": "문의 삭제"
},
{
"method": "POST",
"path": "/api/tenants/*/boards/qna/posts/*/comments",
"description": "댓글 작성"
}
],
"steps": [
{
"id": "step-0",
"name": "사이드바 메뉴 전체 펼치기",
"description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비",
"actions": [
{
"type": "evaluate",
"script": "document.querySelector('.sidebar-scroll, [data-sidebar-content], nav[role=\"navigation\"]')?.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
},
"verification": [
"사이드바가 최상단으로 스크롤됨",
"모든 메뉴가 펼쳐짐"
]
},
{
"id": "step-01",
"name": "2단계 메뉴 진입: 고객센터 > 1:1 문의",
"description": "고객센터 > 1:1 문의 메뉴로 이동하여 페이지 로드 확인",
"navigationPattern": "scrollAndFind",
"actions": [
{
"type": "scrollAndFind",
"target": "고객센터",
"scrollContainer": ".sidebar-scroll, [data-sidebar-content], nav[role='navigation']",
"scrollStep": 200,
"maxAttempts": 10
},
{ "type": "click", "target": "고객센터" },
{ "type": "wait", "duration": 500 },
{
"type": "scrollAndFind",
"target": "1:1 문의",
"scrollContainer": ".sidebar-scroll, [data-sidebar-content], nav[role='navigation']",
"scrollStep": 200,
"maxAttempts": 5
},
{ "type": "click", "target": "1:1 문의" },
{ "type": "wait", "target": "페이지 로드 완료" }
],
"expected": {
"url": "/ko/customer-center/qna",
"title": "1:1 문의",
"authenticated": true
},
"verification": [
"페이지 타이틀 '1:1 문의' 표시",
"페이지 설명 '1:1 문의를 등록하고 답변을 확인합니다.' 표시",
"문의 등록 버튼 존재"
]
},
{
"id": "step-02",
"name": "페이지 구조 확인",
"action": "verify",
"expectedResult": "모든 UI 요소가 정상적으로 표시됨",
"verification": [
"날짜 범위 선택기 존재 (시작일/종료일)",
"기간 프리셋 버튼 존재 (당해년도, 전전월, 전월, 당월, 어제, 오늘)",
"문의 등록 버튼 존재",
"검색 입력 필드 존재 (placeholder: '제목, 작성자로 검색...')",
"필터 드롭다운 3개 존재 (상담분류, 상태, 정렬)"
]
},
{
"id": "step-03",
"name": "테이블 구조 확인",
"action": "verify",
"expectedResult": "테이블 헤더와 구조가 올바르게 표시됨",
"verification": [
"체크박스 컬럼 존재",
"No. 컬럼 존재",
"상담분류 컬럼 존재",
"제목 컬럼 존재",
"상태 컬럼 존재",
"등록일 컬럼 존재"
]
},
{
"id": "step-04",
"name": "초기 데이터 로드 확인",
"action": "verify",
"expectedResult": "문의 목록 데이터가 로드됨 (있을 경우)",
"verification": [
"총 N건 표시 확인",
"데이터가 있으면 테이블에 표시",
"데이터가 없으면 '검색 결과가 없습니다' 메시지 표시"
]
},
{
"id": "step-05",
"name": "상담분류 필터 동작 확인",
"action": "interact",
"target": "상담분류 드롭다운",
"expectedResult": "필터 옵션이 표시되고 선택 가능함",
"verification": [
"드롭다운 클릭 시 옵션 목록 표시",
"옵션: 전체, 문의하기, 신고하기, 건의사항, 서비스오류",
"옵션 선택 시 필터가 적용됨"
]
},
{
"id": "step-06",
"name": "상태 필터 동작 확인",
"action": "interact",
"target": "상태 드롭다운",
"expectedResult": "상태 필터 옵션이 표시되고 선택 가능함",
"verification": [
"드롭다운 클릭 시 옵션 목록 표시",
"옵션: 전체, 답변대기, 답변완료",
"옵션 선택 시 필터가 적용됨"
]
},
{
"id": "step-07",
"name": "정렬 옵션 동작 확인",
"action": "interact",
"target": "정렬 드롭다운",
"expectedResult": "정렬 옵션이 표시되고 선택 가능함",
"verification": [
"드롭다운 클릭 시 옵션 목록 표시",
"옵션: 최신순, 오래된순",
"기본값: 최신순",
"옵션 선택 시 목록 정렬 변경"
]
},
{
"id": "step-08",
"name": "검색 기능 테스트",
"action": "interact",
"target": "검색 입력 필드",
"input": "테스트",
"expectedResult": "검색어에 맞는 문의가 필터링됨",
"verification": [
"검색어 입력 가능",
"검색어가 제목 또는 작성자와 매칭되는 항목만 표시",
"검색 결과 건수 업데이트"
]
},
{
"id": "step-09",
"name": "날짜 범위 필터 테스트",
"action": "interact",
"target": "날짜 범위 선택기",
"expectedResult": "날짜 범위 선택이 가능하고 필터가 적용됨",
"verification": [
"시작일 선택 가능",
"종료일 선택 가능",
"날짜 범위에 해당하는 문의만 표시",
"기간 프리셋 버튼 (당월, 어제 등) 클릭 시 날짜 자동 설정"
]
},
{
"id": "step-10",
"name": "문의 등록 버튼 클릭",
"action": "click",
"target": "문의 등록 버튼",
"expectedResult": "문의 등록 페이지로 이동",
"verification": [
"URL이 /customer-center/qna/create로 변경",
"페이지 타이틀 '1:1 문의 등록' 표시",
"페이지 설명 '1:1 문의를 등록합니다.' 표시"
]
},
{
"id": "step-11",
"name": "문의 등록 폼 구조 확인",
"action": "verify",
"expectedResult": "등록 폼의 모든 필드가 표시됨",
"verification": [
"상담분류 드롭다운 존재",
"제목 입력 필드 존재",
"내용 에디터 존재 (RichTextEditor)",
"첨부파일 업로드 버튼 존재",
"취소 버튼 존재",
"저장 버튼 존재"
]
},
{
"id": "step-12",
"name": "상담분류 선택",
"action": "interact",
"target": "상담분류 드롭다운",
"input": "inquiry",
"expectedResult": "상담분류가 선택됨",
"verification": [
"드롭다운 클릭 시 옵션 표시",
"옵션: 문의하기, 신고하기, 건의사항, 서비스오류",
"'문의하기' 선택"
]
},
{
"id": "step-13",
"name": "제목 입력",
"action": "input",
"target": "제목 입력 필드",
"input": "E2E 테스트 문의입니다",
"expectedResult": "제목이 입력됨",
"verification": [
"입력 필드에 텍스트 입력 가능",
"입력된 값이 표시됨"
]
},
{
"id": "step-14",
"name": "내용 입력",
"action": "input",
"target": "내용 에디터",
"input": "<p>E2E 테스트를 위한 문의 내용입니다.</p><p>정상적으로 등록되는지 확인합니다.</p>",
"expectedResult": "내용이 입력됨",
"verification": [
"RichTextEditor에 HTML 내용 입력 가능",
"입력된 내용이 에디터에 표시됨"
]
},
{
"id": "step-15",
"name": "필수 입력값 누락 시 유효성 검사 확인",
"action": "verify",
"expectedResult": "필수값 미입력 시 에러 메시지 표시",
"verification": [
"제목 미입력 시 '제목을 입력해주세요.' 에러 표시",
"내용 미입력 시 '내용을 입력해주세요.' 에러 표시",
"상담분류 미선택 시 '상담분류를 선택해주세요.' 에러 표시"
]
},
{
"id": "step-16",
"name": "문의 저장 (등록)",
"action": "click",
"target": "저장 버튼",
"expectedResult": "문의가 등록되고 목록 페이지로 이동",
"verification": [
"POST /api/tenants/*/boards/qna/posts API 호출",
"API 응답 200 OK",
"URL이 /customer-center/qna로 변경",
"목록 페이지로 돌아감",
"성공 토스트 메시지 표시 (있을 경우)"
],
"criticalValidation": {
"type": "registration",
"checkURL": true,
"checkErrorPage": true,
"checkAPI": true,
"expectedURL": "/customer-center/qna"
}
},
{
"id": "step-17",
"name": "등록된 문의 확인",
"action": "verify",
"expectedResult": "새로 등록한 문의가 목록에 표시됨",
"verification": [
"목록 최상단에 'E2E 테스트 문의입니다' 제목 표시",
"상담분류 '문의하기' 배지 표시",
"상태 '답변대기' 배지 표시",
"등록일이 오늘 날짜로 표시"
]
},
{
"id": "step-18",
"name": "등록한 문의 클릭 (상세 페이지 이동)",
"action": "click",
"target": "등록한 문의 행",
"expectedResult": "문의 상세 페이지로 이동",
"verification": [
"URL이 /customer-center/qna/[id]로 변경",
"페이지 타이틀 '1:1 문의 상세' 표시",
"페이지 설명 '1:1 문의를 조회합니다.' 표시"
]
},
{
"id": "step-19",
"name": "문의 상세 내용 확인",
"action": "verify",
"expectedResult": "문의 상세 정보가 표시됨",
"verification": [
"문의 제목 'E2E 테스트 문의입니다' 표시",
"작성자 이름 표시",
"작성일 표시",
"상담분류 '문의하기' 배지 표시",
"상태 '답변대기' 표시",
"문의 내용 표시 (HTML 렌더링)",
"수정 버튼 존재 (본인 문의인 경우)",
"삭제 버튼 존재 (본인 문의인 경우)"
]
},
{
"id": "step-20",
"name": "댓글 작성 영역 확인",
"action": "verify",
"expectedResult": "댓글 작성 UI가 표시됨",
"verification": [
"댓글 입력 textarea 존재",
"댓글 등록 버튼 존재",
"기존 댓글 목록 영역 존재"
]
},
{
"id": "step-21",
"name": "댓글 작성",
"action": "interact",
"target": "댓글 입력 필드",
"input": "E2E 테스트 댓글입니다",
"expectedResult": "댓글이 입력되고 등록됨",
"verification": [
"textarea에 댓글 내용 입력",
"등록 버튼 클릭",
"POST /api/tenants/*/boards/qna/posts/*/comments API 호출",
"댓글이 목록에 추가됨"
]
},
{
"id": "step-22",
"name": "수정 버튼 클릭",
"action": "click",
"target": "수정 버튼",
"expectedResult": "문의 수정 페이지로 이동",
"verification": [
"URL이 /customer-center/qna/[id]?mode=edit로 변경",
"페이지 타이틀 '1:1 문의 수정' 표시",
"기존 입력값이 폼에 로드됨 (제목, 상담분류, 내용)"
]
},
{
"id": "step-23",
"name": "제목 수정",
"action": "input",
"target": "제목 입력 필드",
"input": "E2E 테스트 문의입니다 (수정됨)",
"expectedResult": "제목이 수정됨",
"verification": [
"기존 제목이 표시됨",
"제목 수정 가능",
"수정된 값이 표시됨"
]
},
{
"id": "step-24",
"name": "문의 저장 (수정)",
"action": "click",
"target": "저장 버튼",
"expectedResult": "문의가 수정되고 목록 페이지로 이동",
"verification": [
"PUT /api/tenants/*/boards/qna/posts/* API 호출",
"API 응답 200 OK",
"URL이 /customer-center/qna로 변경",
"목록 페이지로 돌아감"
],
"criticalValidation": {
"type": "registration",
"checkURL": true,
"checkErrorPage": true,
"checkAPI": true,
"expectedURL": "/customer-center/qna"
}
},
{
"id": "step-25",
"name": "수정된 문의 확인",
"action": "verify",
"expectedResult": "수정된 제목이 목록에 표시됨",
"verification": [
"목록에서 'E2E 테스트 문의입니다 (수정됨)' 제목 확인"
]
},
{
"id": "step-26",
"name": "문의 다시 클릭 (삭제를 위해)",
"action": "click",
"target": "수정된 문의 행",
"expectedResult": "문의 상세 페이지로 이동",
"verification": [
"URL이 /customer-center/qna/[id]로 변경",
"수정된 제목 표시"
]
},
{
"id": "step-27",
"name": "삭제 버튼 클릭",
"action": "click",
"target": "삭제 버튼",
"expectedResult": "삭제 확인 다이얼로그가 표시됨",
"verification": [
"AlertDialog 표시",
"삭제 확인 메시지 표시",
"취소 버튼 존재",
"삭제 확인 버튼 존재"
]
},
{
"id": "step-28",
"name": "삭제 확인",
"action": "click",
"target": "삭제 확인 버튼",
"expectedResult": "문의가 삭제되고 목록 페이지로 이동",
"verification": [
"DELETE /api/tenants/*/boards/qna/posts/* API 호출",
"API 응답 200 OK",
"URL이 /customer-center/qna로 변경",
"목록 페이지로 돌아감",
"삭제된 문의가 목록에서 사라짐"
],
"criticalValidation": {
"type": "registration",
"checkURL": true,
"checkErrorPage": true,
"checkAPI": true,
"expectedURL": "/customer-center/qna"
}
},
{
"id": "step-29",
"name": "삭제 확인 (목록에서)",
"action": "verify",
"expectedResult": "삭제된 문의가 목록에 없음",
"verification": [
"'E2E 테스트 문의입니다 (수정됨)' 제목이 목록에 표시되지 않음",
"총 건수가 1개 감소"
]
},
{
"id": "step-30",
"name": "페이지네이션 테스트 (데이터 10개 이상일 경우)",
"action": "interact",
"target": "페이지네이션",
"expectedResult": "페이지 이동이 정상 동작함",
"verification": [
"데이터가 10개 이상일 경우 페이지네이션 표시",
"다음 페이지 버튼 클릭 시 2페이지 데이터 표시",
"이전 페이지 버튼 클릭 시 1페이지로 돌아감",
"페이지 번호 버튼 클릭 시 해당 페이지로 이동"
]
},
{
"id": "step-31",
"name": "체크박스 선택 테스트",
"action": "interact",
"target": "체크박스",
"expectedResult": "행 선택이 정상 동작함",
"verification": [
"개별 체크박스 클릭 시 해당 행 선택",
"전체 선택 체크박스 클릭 시 모든 행 선택",
"다시 클릭 시 선택 해제"
]
},
{
"id": "step-32",
"name": "모바일 반응형 테스트 (선택)",
"action": "verify",
"expectedResult": "모바일 화면에서 카드 형식으로 표시됨",
"verification": [
"화면 크기 축소 시 테이블이 카드 형식으로 변경",
"카드에 필수 정보 표시 (제목, 상담분류, 상태, 날짜)",
"카드 클릭 시 상세 페이지 이동"
]
}
],
"testData": {
"inquiry": {
"category": "inquiry",
"title": "E2E 테스트 문의입니다",
"content": "<p>E2E 테스트를 위한 문의 내용입니다.</p><p>정상적으로 등록되는지 확인합니다.</p>"
},
"updatedInquiry": {
"title": "E2E 테스트 문의입니다 (수정됨)"
},
"comment": {
"content": "E2E 테스트 댓글입니다"
}
},
"cleanupRequired": true,
"cleanupSteps": [
"생성한 문의 삭제 (step-28에서 처리됨)"
]
}