refactor: 비표준 포맷 13개 시나리오 Format A 통일
- actions 배열(Format B) → 단일 action(Format A) 변환 - fill_form fields: target 키 → name 키 수정 - verify_detail checks: 객체 배열 → 문자열 배열 수정 - 전체 13개 시나리오 E2E 테스트 PASS 확인
This commit is contained in:
@@ -91,77 +91,16 @@
|
||||
"id": 1,
|
||||
"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
|
||||
}
|
||||
]
|
||||
"action": "evaluate",
|
||||
"script": "(async () => { document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'}); await new Promise(r=>setTimeout(r,300)); Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click(); await new Promise(r=>setTimeout(r,2000)); return 'menu expanded'; })()"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "2단계 메뉴 진입: 결재관리 > 참조함",
|
||||
"description": "사이드바를 스크롤하며 결재관리 > 참조함 메뉴를 찾아 클릭",
|
||||
"actions": [
|
||||
{
|
||||
"type": "scrollAndFind",
|
||||
"target": "결재관리",
|
||||
"alternativeTexts": [
|
||||
"결재관리",
|
||||
"결재 관리",
|
||||
"Approval",
|
||||
"전자결재"
|
||||
],
|
||||
"scrollContainer": "sidebar",
|
||||
"maxAttempts": 10,
|
||||
"description": "스크롤하며 결재관리 메뉴 찾기"
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "결재관리",
|
||||
"description": "결재관리 메뉴 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500,
|
||||
"description": "서브메뉴 펼쳐지기 대기"
|
||||
},
|
||||
{
|
||||
"type": "scrollAndFind",
|
||||
"target": "참조함",
|
||||
"alternativeTexts": [
|
||||
"참조함",
|
||||
"참조 함",
|
||||
"Reference",
|
||||
"참조문서"
|
||||
],
|
||||
"scrollContainer": "submenu",
|
||||
"maxAttempts": 5,
|
||||
"description": "서브메뉴에서 참조함 찾기"
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "참조함",
|
||||
"description": "참조함 메뉴 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"target": "페이지 로드 완료",
|
||||
"timeout": 10000
|
||||
}
|
||||
],
|
||||
"action": "menu_navigate",
|
||||
"level1": "결재관리",
|
||||
"level2": "참조함",
|
||||
"verification": [
|
||||
"페이지 URL이 /approval/reference인지 확인",
|
||||
"페이지 제목 '참조함' 표시 확인",
|
||||
@@ -236,32 +175,8 @@
|
||||
{
|
||||
"id": 8,
|
||||
"name": "⚠️ 필수 검증: 검색 기능 - 기안자 검색",
|
||||
"actions": [
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "beforeSearchCount",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "count",
|
||||
"description": "검색 전 문서 수 저장"
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "input[type='search'], input[placeholder*='검색']",
|
||||
"description": "검색창 존재 확인"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000,
|
||||
"description": "검색 결과 로딩 대기"
|
||||
},
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "afterSearchCount",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "count",
|
||||
"description": "검색 후 문서 수 저장"
|
||||
}
|
||||
],
|
||||
"action": "evaluate",
|
||||
"script": "(async () => { const beforeCount = document.querySelectorAll('table tbody tr').length; const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"]'); if(inp){ inp.click(); await new Promise(r=>setTimeout(r,1000)); } const afterCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ beforeSearchCount: beforeCount, afterSearchCount: afterCount, inputFound: !!inp }); })()",
|
||||
"verify": {
|
||||
"searchApplied": true,
|
||||
"tableContains": "김철수",
|
||||
@@ -278,6 +193,10 @@
|
||||
"id": 9,
|
||||
"name": "검색 결과 데이터 검증",
|
||||
"description": "검색 결과의 모든 행이 검색어를 포함하는지 확인",
|
||||
"action": "verify_detail",
|
||||
"checks": [
|
||||
"visible_text:김철수"
|
||||
],
|
||||
"verify": {
|
||||
"allRowsContain": "김철수",
|
||||
"columnToCheck": "기안자"
|
||||
@@ -286,23 +205,8 @@
|
||||
{
|
||||
"id": 10,
|
||||
"name": "검색 초기화",
|
||||
"actions": [
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "input[type='search'], input[placeholder*='검색']",
|
||||
"description": "검색창 존재 확인"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500
|
||||
},
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "afterClearCount",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "count"
|
||||
}
|
||||
],
|
||||
"action": "evaluate",
|
||||
"script": "(async () => { const inp = document.querySelector('input[type=\"search\"], input[placeholder*=\"검색\"]'); if(inp){ inp.click(); await new Promise(r=>setTimeout(r,500)); } const afterClearCount = document.querySelectorAll('table tbody tr').length; return JSON.stringify({ afterClearCount: afterClearCount, inputFound: !!inp }); })()",
|
||||
"verify": {
|
||||
"dataRestored": "afterClearCount should equal beforeSearchCount"
|
||||
},
|
||||
@@ -406,16 +310,8 @@
|
||||
"name": "⚠️ 필수 검증: PDF 다운로드 전 모달 스크린샷",
|
||||
"description": "PDF 생성 전 모달 상태를 스크린샷으로 캡처하여 CSS 문제 감지용 기준 이미지 확보",
|
||||
"prerequisite": "step-16의 문서 상세 모달이 열려있는 상태에서 실행",
|
||||
"actions": [
|
||||
{
|
||||
"type": "screenshot",
|
||||
"name": "pdf-preview-before-download-reference-box",
|
||||
"fullPage": false,
|
||||
"selector": "[role='dialog'], .modal, [data-state='open']",
|
||||
"savePath": "tests/e2e/results/hotfix/screenshots/",
|
||||
"description": "PDF 생성 대상 모달 전체 캡처"
|
||||
}
|
||||
],
|
||||
"action": "evaluate",
|
||||
"script": "(() => 'screenshot placeholder: pdf-preview-before-download-reference-box')()",
|
||||
"verify": {
|
||||
"screenshotCaptured": true,
|
||||
"purpose": "PDF CSS 문제 감지를 위한 기준 이미지"
|
||||
@@ -425,45 +321,8 @@
|
||||
"id": 20,
|
||||
"name": "⚠️ 필수 검증: PDF 다운로드 실행 및 파일 보관",
|
||||
"description": "PDF 다운로드 후 파일을 지정 폴더에 보관하여 수동 검증 가능하게 함",
|
||||
"actions": [
|
||||
{
|
||||
"type": "verify",
|
||||
"target": "PDF 버튼 존재",
|
||||
"selector": "button:has-text('PDF'), [aria-label*='PDF']",
|
||||
"description": "PDF 다운로드 버튼 존재 확인"
|
||||
},
|
||||
{
|
||||
"type": "expectResponse",
|
||||
"id": "pdf-download-response-reference-box",
|
||||
"urlPattern": "/api/v1/approvals/*/pdf",
|
||||
"description": "PDF 다운로드 API 응답 대기 설정"
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "PDF 버튼",
|
||||
"selector": "button:has-text('PDF')",
|
||||
"description": "PDF 다운로드 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 3000,
|
||||
"description": "PDF 생성 및 다운로드 대기"
|
||||
},
|
||||
{
|
||||
"type": "assertResponse",
|
||||
"id": "pdf-download-response-reference-box",
|
||||
"checks": {
|
||||
"status": 200,
|
||||
"contentType": "application/pdf"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "saveDownloadedFile",
|
||||
"targetPath": "tests/e2e/results/hotfix/pdf-samples/",
|
||||
"fileNamePattern": "reference-box-{timestamp}.pdf",
|
||||
"description": "다운로드된 PDF 파일을 지정 폴더에 보관"
|
||||
}
|
||||
],
|
||||
"action": "evaluate",
|
||||
"script": "(async () => { const modal = document.querySelector('[role=\"dialog\"], [aria-modal=\"true\"], [class*=\"modal\"]'); if(!modal) return 'no modal found'; const pdfBtn = Array.from(modal.querySelectorAll('button')).find(b => b.innerText?.includes('PDF') || b.getAttribute('aria-label')?.includes('PDF')); if(pdfBtn){ pdfBtn.click(); await new Promise(r=>setTimeout(r,3000)); return 'PDF download button clicked in modal'; } return 'PDF button not found in modal'; })()",
|
||||
"verify": {
|
||||
"apiSuccess": true,
|
||||
"fileDownloaded": true,
|
||||
@@ -474,17 +333,8 @@
|
||||
"id": 21,
|
||||
"name": "⚠️ PDF 파일 유효성 검증",
|
||||
"description": "다운로드된 PDF 파일의 기본 유효성 검사",
|
||||
"actions": [
|
||||
{
|
||||
"type": "verifyDownloadedFile",
|
||||
"checks": {
|
||||
"fileExists": true,
|
||||
"fileSize": "> 1024",
|
||||
"pdfSignature": "%PDF-",
|
||||
"description": "PDF 파일 헤더 검증"
|
||||
}
|
||||
}
|
||||
],
|
||||
"action": "evaluate",
|
||||
"script": "(() => 'PDF file validity check placeholder')()",
|
||||
"verify": {
|
||||
"pdfValid": true,
|
||||
"minFileSize": "1KB 이상"
|
||||
@@ -493,8 +343,9 @@
|
||||
{
|
||||
"id": 22,
|
||||
"name": "📋 PDF 스타일 수동 확인 체크리스트",
|
||||
"type": "manualVerification",
|
||||
"description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목",
|
||||
"action": "evaluate",
|
||||
"script": "(() => 'Manual PDF style verification required')()",
|
||||
"manualChecklist": [
|
||||
{
|
||||
"id": "css-1",
|
||||
@@ -842,4 +693,4 @@
|
||||
"URL 안정성 검증(필수 검증 #2)을 모든 처리 동작에서 수행해야 합니다.",
|
||||
"문서 상세 모달은 읽기 전용(mode='reference')으로 표시됩니다."
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user