Files
sam-scenarios/company-info.json

423 lines
14 KiB
JSON

{
"id": "company-info",
"name": "설정 - 회사정보",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
},
"description": "회사 정보 관리 기능 테스트 - 회사 정보 조회, 수정, 회사 추가 기능",
"baseUrl": "https://dev.codebridge-x.com",
"menuNavigationEnhanced": {
"strategy": "scroll-and-search",
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "설정",
"level2": "회사정보",
"alternativeLevel1Names": ["설정", "Settings", "환경설정", "시스템설정", "관리"],
"alternativeLevel2Names": ["회사정보", "회사 정보", "Company Info", "회사관리", "기업정보"],
"fallbackUrls": [
"/ko/settings/company-info",
"/ko/settings/company",
"/ko/admin/company-info",
"/settings/company-info",
"/ko/management/company"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
"scrollStep": 200,
"maxScrollAttempts": 10,
"scrollDelay": 300
}
},
"expectedAPIs": [
{
"method": "GET",
"path": "/api/v1/company-info",
"description": "회사 정보 조회"
},
{
"method": "PUT",
"path": "/api/v1/company-info/:id",
"description": "회사 정보 수정"
},
{
"method": "POST",
"path": "/api/v1/company-info",
"description": "회사 추가"
}
],
"steps": [
{
"id": 0,
"name": "사이드바 메뉴 탐색 준비",
"description": "사이드바를 최상단으로 스크롤하고 메뉴 구조 파악",
"actions": [
{ "type": "scroll", "target": "sidebar", "direction": "top", "description": "사이드바 최상단으로 스크롤" },
{ "type": "wait", "duration": 500 },
{ "type": "screenshot", "name": "sidebar_initial_state" }
],
"verification": [
"사이드바가 화면에 보이는지 확인",
"메뉴 항목들이 렌더링되었는지 확인"
]
},
{
"id": 1,
"name": "1차 메뉴 찾기: 설정 (스크롤 포함)",
"description": "사이드바를 스크롤하며 '설정' 메뉴를 찾아 클릭",
"actions": [
{
"type": "scrollAndFind",
"target": "설정",
"alternativeTexts": ["설정", "Settings", "환경설정", "시스템설정"],
"scrollContainer": "sidebar",
"maxAttempts": 10,
"description": "스크롤하며 설정 메뉴 찾기"
},
{ "type": "wait", "duration": 300 },
{ "type": "click", "target": "설정", "description": "설정 메뉴 클릭" },
{ "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" },
{ "type": "screenshot", "name": "settings_menu_expanded" }
],
"verification": [
"설정 메뉴가 클릭되었는지 확인",
"서브메뉴가 펼쳐졌는지 확인",
"하위 메뉴 항목들이 보이는지 확인"
],
"fallback": {
"if": "메뉴를 찾을 수 없음",
"then": "사이드바 전체를 스크롤하며 재탐색"
}
},
{
"id": 2,
"name": "2차 메뉴 찾기: 회사정보 (스크롤 포함)",
"description": "서브메뉴에서 '회사정보'를 찾아 클릭",
"actions": [
{
"type": "scrollAndFind",
"target": "회사정보",
"alternativeTexts": ["회사정보", "회사 정보", "Company Info", "회사관리"],
"scrollContainer": "submenu",
"maxAttempts": 5,
"description": "서브메뉴에서 회사정보 찾기"
},
{ "type": "wait", "duration": 200 },
{ "type": "click", "target": "회사정보", "description": "회사정보 메뉴 클릭" },
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 },
{ "type": "screenshot", "name": "company_info_page" }
],
"verification": [
"회사정보 메뉴 클릭 성공",
"페이지 이동 또는 컨텐츠 로드"
]
},
{
"id": 3,
"name": "404 에러 감지 및 대체 경로 시도",
"description": "페이지 로드 후 404 에러 여부 확인, 404시 대체 경로 탐색",
"actions": [
{ "type": "wait", "duration": 1000 },
{ "type": "checkFor404", "indicators": [
"페이지를 찾을 수 없습니다",
"404",
"Not Found",
"존재하지 않거나"
]},
{ "type": "screenshot", "name": "page_load_result" }
],
"verification": [
"현재 페이지가 404인지 확인"
],
"onError404": {
"description": "404 에러 발생 시 대체 URL 시도",
"actions": [
{ "type": "log", "message": "404 감지 - 대체 경로 탐색 시작" },
{
"type": "tryAlternativeUrls",
"urls": [
"/ko/settings/company-info",
"/ko/settings/company",
"/ko/admin/company-info"
],
"stopOnSuccess": true
},
{
"type": "ifStillFailed",
"action": "navigateViaMenuClick",
"description": "URL 직접 접근 실패 시 메뉴 클릭으로 재시도"
}
]
}
},
{
"id": 4,
"name": "페이지 정상 로드 확인",
"description": "회사정보 페이지가 정상적으로 로드되었는지 확인",
"actions": [
{ "type": "verify", "target": "pageTitle", "contains": ["회사정보", "회사 정보", "Company"] },
{ "type": "verify", "target": "pageContent", "notContains": ["404", "찾을 수 없습니다", "Not Found"] }
],
"verification": [
"페이지 제목 '회사정보' 또는 관련 텍스트 표시",
"404 에러 메시지 미표시",
"콘텐츠가 정상 렌더링됨"
],
"successCriteria": {
"urlPattern": "/settings/company",
"requiredElements": ["회사", "회사명", "대표자명"]
}
},
{
"step": 5,
"name": "페이지 제목 확인",
"action": "verify",
"target": "heading",
"expected": "회사정보",
"validation": "페이지 제목이 '회사정보'로 표시됨"
},
{
"step": 6,
"name": "회사 추가 버튼 존재 확인",
"action": "verify",
"target": "button[text='회사 추가']",
"expected": "button exists",
"validation": "회사 추가 버튼이 표시됨"
},
{
"step": 7,
"name": "수정 버튼 존재 확인",
"action": "verify",
"target": "button[text='수정']",
"expected": "button exists",
"validation": "수정 버튼이 표시됨"
},
{
"step": 8,
"name": "회사명 필드 확인",
"action": "verify",
"target": "textbox[label='회사명'][disabled]",
"expected": "프론트_테스트회사",
"validation": "회사명이 표시되고 비활성화 상태"
},
{
"step": 9,
"name": "대표자명 필드 확인",
"action": "verify",
"target": "textbox[label='대표자명'][disabled]",
"expected": "프론트",
"validation": "대표자명이 표시되고 비활성화 상태"
},
{
"step": 10,
"name": "업태 필드 확인",
"action": "verify",
"target": "textbox[label='업태'][disabled]",
"expected": "업태명",
"validation": "업태가 표시되고 비활성화 상태"
},
{
"step": 11,
"name": "업종 필드 확인",
"action": "verify",
"target": "textbox[label='업종'][disabled]",
"expected": "업종명",
"validation": "업종이 표시되고 비활성화 상태"
},
{
"step": 12,
"name": "주소 필드 확인",
"action": "verify",
"target": "textbox[label='주소명'][disabled]",
"expected": "주소 표시",
"validation": "주소가 표시되고 비활성화 상태"
},
{
"step": 13,
"name": "이메일 필드 확인",
"action": "verify",
"target": "textbox[label='이메일 (아이디)'][disabled]",
"expected": "이메일 표시",
"validation": "이메일이 표시되고 비활성화 상태"
},
{
"step": 14,
"name": "사업자등록번호 필드 확인",
"action": "verify",
"target": "textbox[label='사업자등록번호'][disabled]",
"expected": "사업자등록번호 표시",
"validation": "사업자등록번호가 표시되고 비활성화 상태"
},
{
"step": 15,
"name": "수정 버튼 클릭",
"action": "click",
"target": "button[text='수정']",
"expected": "edit mode enabled",
"validation": "수정 모드로 전환됨"
},
{
"step": 16,
"name": "수정 모드 - 필드 활성화 확인",
"action": "verify",
"target": "textbox:not([disabled])",
"expected": "fields enabled",
"validation": "텍스트 필드들이 활성화됨"
},
{
"step": 17,
"name": "취소 버튼 클릭",
"action": "click",
"target": "button[text='취소']",
"expected": "edit mode disabled",
"validation": "조회 모드로 복귀"
},
{
"step": 18,
"name": "회사 추가 버튼 클릭",
"action": "click",
"target": "button[text='회사 추가']",
"expected": "dialog opened",
"validation": "회사 추가 다이얼로그가 열림"
},
{
"step": 19,
"name": "회사 추가 다이얼로그 확인",
"action": "verify",
"target": "dialog",
"expected": "회사 추가 다이얼로그 표시",
"validation": "다이얼로그 제목, 입력 필드, 버튼 확인"
},
{
"step": 20,
"name": "다이얼로그 닫기",
"action": "click",
"target": "dialog button[text='취소']",
"expected": "dialog closed",
"validation": "다이얼로그가 닫힘"
},
{
"step": 21,
"name": "수정 모드에서 데이터 변경 테스트",
"description": "실제 데이터를 수정하고 저장 기능 검증",
"actions": [
{ "type": "click", "target": "수정", "description": "수정 모드 진입" }
],
"expect": {
"fieldsEnabled": true
}
},
{
"step": 22,
"name": "업태 필드 수정",
"description": "업태 필드 값 변경",
"actions": [
{ "type": "clear", "target": "업태" },
{ "type": "fill", "target": "업태", "value": "테스트업태_수정" }
]
},
{
"step": 23,
"name": "저장 버튼 클릭",
"description": "수정된 회사 정보 저장",
"actions": [
{ "type": "click", "target": "저장" }
],
"waitFor": {
"type": "apiResponse",
"method": "PUT",
"timeout": 5000
},
"expect": {
"toast": ["수정", "완료", "성공", "저장"]
}
},
{
"step": 24,
"name": "⚠️ 필수 검증: 수정 데이터 반영 확인",
"critical": true,
"note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!",
"description": "수정된 업태 값이 반영되었는지 확인",
"verify": {
"fieldValue": {
"target": "업태",
"expected": "테스트업태_수정"
}
}
},
{
"step": 25,
"name": "회사 추가 다이얼로그 열기",
"description": "회사 추가 버튼 클릭하여 다이얼로그 열기",
"actions": [
{ "type": "click", "target": "회사 추가" }
],
"expect": {
"dialog": true,
"visible": ["회사명", "대표자명", "사업자등록번호", "등록", "취소"]
}
},
{
"step": 26,
"name": "새 회사 정보 입력",
"description": "회사 추가 다이얼로그에서 필수 정보 입력",
"actions": [
{ "type": "fill", "target": "회사명", "value": "테스트회사_{timestamp}" },
{ "type": "fill", "target": "대표자명", "value": "테스트대표" },
{ "type": "fill", "target": "사업자등록번호", "value": "123-45-67890" }
]
},
{
"step": 27,
"name": "회사 등록",
"description": "등록 버튼 클릭하여 새 회사 등록",
"actions": [
{ "type": "click", "target": "등록" }
],
"waitFor": {
"type": "apiResponse",
"method": "POST",
"timeout": 5000
},
"expect": {
"toast": ["등록", "완료", "성공"],
"dialogClosed": true
}
},
{
"step": 28,
"name": "⚠️ 필수 검증: 회사 등록 반영 확인",
"critical": true,
"note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 등록 확인 필수!",
"description": "등록된 회사가 목록에 표시되는지 확인",
"verify": {
"visible": "테스트회사"
}
},
{
"step": 29,
"name": "원복: 업태 필드 원래 값으로 복구",
"description": "테스트 후 원래 값으로 복구",
"actions": [
{ "type": "click", "target": "수정" },
{ "type": "clear", "target": "업태" },
{ "type": "fill", "target": "업태", "value": "업태명" },
{ "type": "click", "target": "저장" }
],
"expect": {
"toast": ["수정", "완료", "성공", "저장"]
}
}
],
"notes": [
"직접 URL 접근 금지: 반드시 메뉴 클릭으로 페이지 진입 (404 방지)",
"스크롤 필수: 사이드바가 길 경우 메뉴가 화면 밖에 있을 수 있음",
"대체 경로: 메뉴명이 변경되었을 수 있으므로 다양한 이름으로 탐색",
"메뉴 계층: 설정 > 회사정보"
]
}