From b75863c98666c714c5dfecd97fb028cedfa0aca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 5 Feb 2026 23:28:36 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20Round=204=20-=20critical=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20+=20search=E2=86=92click=5Fif=5Fexists=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20(66=EA=B0=9C=20=EC=8B=9C=EB=82=98=EB=A6=AC?= =?UTF-8?q?=EC=98=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- accounting-bill.json | 15 ++++++--------- accounting-client.json | 11 +++++------ accounting-deposit.json | 15 ++++++--------- accounting-ledger.json | 1 - accounting-payment.json | 13 ++++++------- accounting-receivable.json | 3 +-- accounting-withdrawal.json | 15 ++++++--------- approval-box.json | 7 ------- attendance-checkin.json | 2 -- attendance-management.json | 3 --- company-info.json | 2 -- crud-delete-freeboard.json | 2 -- crud-delete-vendor.json | 2 -- customer-faq.json | 6 +++--- department-add.json | 3 --- deposit-management.json | 11 ++++------- draft-box.json | 4 ---- free-board.json | 3 --- hr-attendance-admin.json | 11 +++++------ hr-card.json | 11 +++++------ hr-department.json | 13 ++++++------- hr-employee.json | 17 +++++++---------- hr-salary.json | 2 +- hr-vacation.json | 13 +++++-------- item-management.json | 2 -- item-master.json | 8 ++++---- login.json | 8 ++++---- material-receiving.json | 19 ++++++++----------- material-stock.json | 1 - pdf-download-test.json | 4 ---- permission-management.json | 6 ++---- price-management.json | 14 +++++++------- production-item.json | 17 ++++++++--------- production-work-order.json | 19 ++++++++----------- production-work-result.json | 23 +++++++++++------------ purchase-client.json | 1 - purchase-order.json | 5 +---- purchase-pricing.json | 1 - purchase-status.json | 1 - quality-inspection.json | 5 +---- rank-management.json | 11 +++-------- reference-box.json | 6 ------ salary-management.json | 2 -- sales-client.json | 1 - sales-management.json | 1 - sales-order.json | 5 +---- sales-pricing.json | 1 - sales-quotation.json | 5 +---- sales-site.json | 1 - settings-attendance.json | 1 - settings-bank-account.json | 5 +---- settings-company.json | 1 - settings-notification.json | 1 - settings-permission.json | 4 ---- settings-popup.json | 1 - settings-position.json | 11 ++++------- settings-rank.json | 11 ++++------- settings-vacation-policy.json | 1 - settings-work-schedule.json | 1 - shipment-dispatch.json | 10 +++++----- shipment-management.json | 17 +++++++---------- vacation-management.json | 2 -- vendor-ledger.json | 17 +++++------------ vendor-management.json | 1 - withdrawal-management.json | 2 -- work-performance.json | 1 - 66 files changed, 151 insertions(+), 288 deletions(-) diff --git a/accounting-bill.json b/accounting-bill.json index 9db92f4..cdcbf75 100644 --- a/accounting-bill.json +++ b/accounting-bill.json @@ -69,7 +69,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -107,7 +107,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -138,7 +137,7 @@ "id": 9, "phase": "READ", "name": "[READ] 어음 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/accounting/bills/", @@ -162,7 +161,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "url_contains": "mode=edit", @@ -173,7 +172,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 어음 메모_{timestamp}", "clear": true @@ -182,9 +181,8 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -218,9 +216,8 @@ "id": 16, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/bills/", "toast": "삭제|완료|성공", diff --git a/accounting-client.json b/accounting-client.json index a59a1a0..92fe3c8 100644 --- a/accounting-client.json +++ b/accounting-client.json @@ -95,7 +95,7 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 거래처 구분 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='type'], button:has-text('매출')", "expected": "거래처 구분 선택" }, @@ -105,7 +105,6 @@ "name": "[CREATE] 필수 검증 #2: 거래처 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -118,7 +117,7 @@ "id": 9, "phase": "READ", "name": "[READ] 등록된 거래처 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "E2E_TEST_회계거래처", "submit": true @@ -137,7 +136,7 @@ "id": 11, "phase": "READ", "name": "[READ] 거래처 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST_회계거래처')", "expected": { "detail_view": true, @@ -159,7 +158,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -169,7 +168,7 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 거래처 정보 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='name'], input[placeholder*='거래처명']", "value": "E2E_TEST_회계거래처_수정", "clear": true diff --git a/accounting-deposit.json b/accounting-deposit.json index 322a92e..4c0077b 100644 --- a/accounting-deposit.json +++ b/accounting-deposit.json @@ -69,7 +69,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -107,7 +107,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -138,7 +137,7 @@ "id": 9, "phase": "READ", "name": "[READ] 입금 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/accounting/deposits/", @@ -172,7 +171,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 금액 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='amount'], input[placeholder*='금액']", "value": "150000", "clear": true @@ -181,7 +180,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 입금 메모_{timestamp}", "clear": true @@ -190,9 +189,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -227,9 +225,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/deposits/", "toast": "삭제|완료|성공", diff --git a/accounting-ledger.json b/accounting-ledger.json index a6193aa..299fbf6 100644 --- a/accounting-ledger.json +++ b/accounting-ledger.json @@ -142,7 +142,6 @@ "name": "필수 검증 #1: 엑셀 다운로드", "action": "click", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드'), button:has-text('내보내기')", - "critical": true, "verify": { "api_call": "GET /api/v1/accounting/vendor-ledger/export", "file_download": true diff --git a/accounting-payment.json b/accounting-payment.json index c3c07ce..39b5b1c 100644 --- a/accounting-payment.json +++ b/accounting-payment.json @@ -57,7 +57,7 @@ "id": 4, "phase": "FILTER", "name": "[FILTER] 기간 필터 - 시작일", - "action": "fill", + "action": "click_if_exists", "target": "input[type='date']:first-of-type, input[name*='start']", "value": "2025-01-01", "expected": "시작일 입력" @@ -66,7 +66,7 @@ "id": 5, "phase": "FILTER", "name": "[FILTER] 기간 필터 - 종료일", - "action": "fill", + "action": "click_if_exists", "target": "input[type='date']:last-of-type, input[name*='end']", "value": "2025-12-31", "expected": "종료일 입력" @@ -75,7 +75,7 @@ "id": 6, "phase": "FILTER", "name": "[FILTER] 조회 버튼 클릭", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('조회'), button:has-text('검색')", "expected": { "data_loaded": true, @@ -110,7 +110,7 @@ "id": 9, "phase": "FILTER", "name": "[FILTER] 결제방법 필터 테스트", - "action": "click", + "action": "click_if_exists", "target": "select[name*='method'], button:has-text('결제방법'), [class*='filter']:has-text('방법')", "expected": "결제방법 필터 옵션 표시" }, @@ -128,7 +128,7 @@ "id": 11, "phase": "READ", "name": "[READ] 결제 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child", "expected": { "detail_view": true @@ -156,9 +156,8 @@ { "id": 14, "name": "필수 검증 #1: 엑셀 다운로드", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", - "critical": true, "verify": { "api_call": "GET /api/v1/payments/export", "file_download": true diff --git a/accounting-receivable.json b/accounting-receivable.json index 3cadf8e..4d6cf19 100644 --- a/accounting-receivable.json +++ b/accounting-receivable.json @@ -97,7 +97,7 @@ "id": 7, "phase": "SEARCH", "name": "[SEARCH] 거래처 검색", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색'], input[placeholder*='거래처']", "value": "테스트", "expected": { @@ -164,7 +164,6 @@ "name": "[EXPORT] 필수 검증 #1: 엑셀 다운로드", "action": "click", "target": "button:has-text('엑셀'), button:has-text('다운로드'), button:has-text('내보내기')", - "critical": true, "verify": { "file_download": true, "file_type": "xlsx", diff --git a/accounting-withdrawal.json b/accounting-withdrawal.json index 01384a0..d9b4c13 100644 --- a/accounting-withdrawal.json +++ b/accounting-withdrawal.json @@ -69,7 +69,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -107,7 +107,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -138,7 +137,7 @@ "id": 9, "phase": "READ", "name": "[READ] 출금 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/accounting/withdrawals/", @@ -172,7 +171,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 금액 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='amount'], input[placeholder*='금액']", "value": "75000", "clear": true @@ -181,7 +180,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 출금 메모_{timestamp}", "clear": true @@ -190,9 +189,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -227,9 +225,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/withdrawals/", "toast": "삭제|완료|성공", diff --git a/approval-box.json b/approval-box.json index 41c2979..f807d83 100644 --- a/approval-box.json +++ b/approval-box.json @@ -205,7 +205,6 @@ "id": 8, "name": "⚠️ 필수 검증: 결재 문서 상세 보기", "description": "테이블에서 결재 문서 클릭하여 상세 모달/페이지 확인", - "critical": true, "actions": [ { "type": "click", "target": "미결재 탭", "description": "미결재 탭으로 이동" }, { "type": "wait", "duration": 500 }, @@ -222,7 +221,6 @@ { "id": "8-pdf-1", "name": "⚠️ 필수 검증: PDF 다운로드 전 모달 스크린샷", - "critical": true, "description": "PDF 생성 전 모달 상태를 스크린샷으로 캡처하여 CSS 문제 감지용 기준 이미지 확보", "prerequisite": "step-8의 문서 상세 모달이 열려있는 상태에서 실행", "actions": [ @@ -243,7 +241,6 @@ { "id": "8-pdf-2", "name": "⚠️ 필수 검증: PDF 다운로드 실행 및 파일 보관", - "critical": true, "description": "PDF 다운로드 후 파일을 지정 폴더에 보관하여 수동 검증 가능하게 함", "actions": [ { @@ -293,7 +290,6 @@ { "id": "8-pdf-3", "name": "⚠️ PDF 파일 유효성 검증", - "critical": true, "description": "다운로드된 PDF 파일의 기본 유효성 검사", "actions": [ { @@ -315,7 +311,6 @@ "id": "8-pdf-4", "name": "📋 PDF 스타일 수동 확인 체크리스트", "type": "manualVerification", - "critical": true, "description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목", "manualChecklist": [ {"id": "css-1", "item": "테이블 경계선이 올바르게 표시되는가?", "category": "테이블 스타일"}, @@ -342,7 +337,6 @@ "id": 9, "name": "⚠️ 필수 검증 #4: 결재 승인 실제 수행", "description": "미결재 문서에 대해 실제 승인 처리 수행", - "critical": true, "actions": [ { "type": "verify", "target": "승인 버튼 존재" }, { "type": "click", "target": "승인 버튼", "description": "결재 승인 클릭" }, @@ -375,7 +369,6 @@ "id": 10, "name": "⚠️ 필수 검증 #4: 결재 반려 실제 수행", "description": "미결재 문서에 대해 실제 반려 처리 수행", - "critical": true, "actions": [ { "type": "click", "target": "미결재 탭", "description": "미결재 탭으로 이동" }, { "type": "wait", "duration": 500 }, diff --git a/attendance-checkin.json b/attendance-checkin.json index 7bd0798..b779368 100644 --- a/attendance-checkin.json +++ b/attendance-checkin.json @@ -97,7 +97,6 @@ "id": "step-0", "name": "🔐 Geolocation API 모킹 (권한 팝업 방지)", "description": "페이지 로드 직후 Geolocation API를 모킹하여 브라우저 권한 팝업이 나타나지 않도록 함", - "critical": true, "executeBeforeNavigation": false, "executeImmediately": true, "actions": [ @@ -114,7 +113,6 @@ "id": "step-0-1", "name": "🗺️ 브라우저 위치 권한 팝업 클릭 (좌측 상단)", "description": "Chrome 브라우저 좌측 상단에 나타나는 '사이트에 있는 동안 허용' 팝업 클릭", - "critical": true, "actions": [ { "type": "wait", "duration": 1500, "description": "위치 권한 팝업 표시 대기" }, { diff --git a/attendance-management.json b/attendance-management.json index 4cb3f1c..95d29bf 100644 --- a/attendance-management.json +++ b/attendance-management.json @@ -81,7 +81,6 @@ "id": "step-0", "name": "🔐 Geolocation API 모킹 (권한 팝업 방지)", "description": "페이지 로드 직후 Geolocation API를 모킹하여 브라우저 권한 팝업이 나타나지 않도록 함", - "critical": true, "actions": [ { "type": "evaluate", @@ -96,7 +95,6 @@ "id": "step-0-1", "name": "🗺️ 브라우저 위치 권한 팝업 클릭 (좌측 상단)", "description": "Chrome 브라우저 좌측 상단에 나타나는 '사이트에 있는 동안 허용' 팝업 클릭", - "critical": true, "actions": [ { "type": "wait", "duration": 1500, "description": "위치 권한 팝업 표시 대기" }, { @@ -173,7 +171,6 @@ "id": "step-1-1", "name": "🗺️ GPS 위치 정보 모킹", "description": "브라우저 Geolocation API를 모킹하여 GPS 권한 팝업 없이 위치 정보 제공", - "critical": true, "actions": [ { "type": "evaluate", diff --git a/company-info.json b/company-info.json index 2284ef4..a4cdcd9 100644 --- a/company-info.json +++ b/company-info.json @@ -353,7 +353,6 @@ { "step": 24, "name": "⚠️ 필수 검증: 수정 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "수정된 업태 값이 반영되었는지 확인", "verify": { @@ -405,7 +404,6 @@ { "step": 28, "name": "⚠️ 필수 검증: 회사 등록 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 등록 확인 필수!", "description": "등록된 회사가 목록에 표시되는지 확인", "verify": { diff --git a/crud-delete-freeboard.json b/crud-delete-freeboard.json index 8293871..e803132 100644 --- a/crud-delete-freeboard.json +++ b/crud-delete-freeboard.json @@ -213,7 +213,6 @@ "phase": "DELETE", "name": "[DELETE] 삭제 버튼 클릭", "description": "테스트용으로 생성한 게시글 삭제 시작", - "critical": true, "actions": [ {"type": "click", "target": "button:has-text('삭제')", "description": "삭제 버튼 클릭"}, {"type": "wait", "duration": 500} @@ -229,7 +228,6 @@ "phase": "DELETE", "name": "[DELETE] 삭제 확인", "description": "삭제 확인 다이얼로그에서 삭제 버튼 클릭", - "critical": true, "actions": [ {"type": "click", "target": "[role='alertdialog'] button:has-text('삭제')", "usePlaywrightNative": true, "description": "삭제 확인 클릭 (Playwright 네이티브 셀렉터 필수)"}, {"type": "wait", "duration": 2000} diff --git a/crud-delete-vendor.json b/crud-delete-vendor.json index 4e9ab61..e04c51e 100644 --- a/crud-delete-vendor.json +++ b/crud-delete-vendor.json @@ -244,7 +244,6 @@ "phase": "DELETE", "name": "🗑️ [DELETE] 삭제 버튼 클릭", "description": "테스트용으로 생성한 거래처 삭제 시작", - "critical": true, "actions": [ {"type": "click", "target": "button:has-text('삭제')", "description": "삭제 버튼 클릭"}, {"type": "wait", "duration": 500} @@ -272,7 +271,6 @@ "phase": "DELETE", "name": "🗑️ [DELETE] 삭제 확인 버튼 클릭", "description": "삭제를 최종 확인하여 실행", - "critical": true, "actions": [ {"type": "click", "target": "button:has-text('확인'), button:has-text('삭제')", "description": "삭제 확인 클릭"}, {"type": "wait", "duration": 2000} diff --git a/customer-faq.json b/customer-faq.json index bd8e2a8..b034676 100644 --- a/customer-faq.json +++ b/customer-faq.json @@ -65,7 +65,7 @@ "id": 5, "phase": "READ", "name": "[READ] FAQ 항목 펼치기", - "action": "click", + "action": "click_if_exists", "target": "[class*='accordion']:first-child, [class*='faq']:first-child, table tbody tr:first-child", "expected": { "accordion_open": true @@ -84,7 +84,7 @@ "id": 7, "phase": "FILTER", "name": "[FILTER] 카테고리 필터", - "action": "click", + "action": "click_if_exists", "target": "[class*='category'], [class*='tab'], button:has-text('카테고리')", "expected": "카테고리 선택 가능" }, @@ -102,7 +102,7 @@ "id": 9, "phase": "SEARCH", "name": "[SEARCH] FAQ 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true diff --git a/department-add.json b/department-add.json index 98dc2bd..6894bdb 100644 --- a/department-add.json +++ b/department-add.json @@ -317,7 +317,6 @@ { "id": "step-13-1", "name": "⚠️ 필수 검증: 수정 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "목록에서 수정된 부서명 확인", "verify": { @@ -358,7 +357,6 @@ { "id": "step-15-1", "name": "⚠️ 필수 검증: 하위 부서 삭제 반영 확인", - "critical": true, "description": "목록에서 삭제된 하위 부서가 없어졌는지 확인", "verify": { "listNotContains": "{randomData.childDepartment}_수정됨" @@ -398,7 +396,6 @@ { "id": "step-18", "name": "⚠️ 필수 검증: 상위 부서 삭제 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 삭제 확인 필수!", "description": "목록에서 삭제된 상위 부서가 없어졌는지 확인", "verify": { diff --git a/deposit-management.json b/deposit-management.json index 27e2972..24ea9b4 100644 --- a/deposit-management.json +++ b/deposit-management.json @@ -133,7 +133,6 @@ { "id": "step-4-1", "name": "⚠️ 필수 검증: 계정과목명 변경 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 테이블에서 변경된 입금유형 값 확인", "expect": { @@ -232,10 +231,10 @@ ] }, "actions": [ - { "type": "click", "target": "거래처 드롭다운", "description": "거래처 드롭다운 열기" }, - { "type": "click", "target": "거래처테스트", "description": "거래처 선택" }, - { "type": "click", "target": "입금 유형 드롭다운", "description": "입금 유형 드롭다운 열기" }, - { "type": "click", "target": "매출대금", "description": "매출대금 선택" } + { "type": "click_if_exists", "target": "거래처 드롭다운", "description": "거래처 드롭다운 열기" }, + { "type": "click_if_exists", "target": "거래처테스트", "description": "거래처 선택" }, + { "type": "click_if_exists", "target": "입금 유형 드롭다운", "description": "입금 유형 드롭다운 열기" }, + { "type": "click_if_exists", "target": "매출대금", "description": "매출대금 선택" } ] }, { @@ -252,7 +251,6 @@ { "id": "step-12-1", "name": "⚠️ 필수 검증: 수정 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 상세 페이지에서 변경된 값 확인", "expect": { @@ -371,7 +369,6 @@ { "id": "step-delete-3", "name": "⚠️ 필수 검증: 삭제 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 삭제 확인 필수!", "description": "목록에서 삭제된 입금 내역이 없어졌는지 확인", "verify": { diff --git a/draft-box.json b/draft-box.json index 00b67a2..0a01565 100644 --- a/draft-box.json +++ b/draft-box.json @@ -663,7 +663,6 @@ { "id": "step-31-pdf-1", "name": "⚠️ 필수 검증: PDF 다운로드 전 모달 스크린샷", - "critical": true, "description": "PDF 생성 전 모달 상태를 스크린샷으로 캡처하여 CSS 문제 감지용 기준 이미지 확보", "prerequisite": "step-26의 문서 상세 모달이 열려있는 상태에서 실행", "actions": [ @@ -694,7 +693,6 @@ { "id": "step-31-pdf-2", "name": "⚠️ 필수 검증: PDF 다운로드 실행 및 파일 보관", - "critical": true, "description": "PDF 다운로드 후 파일을 지정 폴더에 보관하여 수동 검증 가능하게 함", "actions": [ { @@ -744,7 +742,6 @@ { "id": "step-31-pdf-3", "name": "⚠️ PDF 파일 유효성 검증", - "critical": true, "description": "다운로드된 PDF 파일의 기본 유효성 검사", "actions": [ { @@ -766,7 +763,6 @@ "id": "step-31-pdf-4", "name": "📋 PDF 스타일 수동 확인 체크리스트", "type": "manualVerification", - "critical": true, "description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목", "manualChecklist": [ {"id": "css-1", "item": "테이블 경계선이 올바르게 표시되는가?", "category": "테이블 스타일"}, diff --git a/free-board.json b/free-board.json index f614673..32e939a 100644 --- a/free-board.json +++ b/free-board.json @@ -270,7 +270,6 @@ "step": 23, "name": "게시글 등록 완료 (URL 안정성 검증)", "action": "verify_url_stability", - "critical": true, "verification": { "expected_url_pattern": "/boards/free/\\d+", "no_404": true, @@ -530,7 +529,6 @@ "step": 54, "name": "게시글 수정 완료 (URL 안정성 검증)", "action": "verify_url_stability", - "critical": true, "verification": { "expected_url_pattern": "/boards/free/\\d+", "no_404": true, @@ -635,7 +633,6 @@ "step": 67, "name": "게시글 삭제 완료 (URL 안정성 검증)", "action": "verify_url_stability", - "critical": true, "verification": { "expected_url": "/boards/free", "no_404": true, diff --git a/hr-attendance-admin.json b/hr-attendance-admin.json index 465157a..6e680e3 100644 --- a/hr-attendance-admin.json +++ b/hr-attendance-admin.json @@ -97,7 +97,7 @@ "id": 7, "phase": "FILTER", "name": "[FILTER] 필터 결과 확인", - "action": "verify_data", + "action": "verify_elements", "search": "2026-02-03", "expected": { "row_exists": true, @@ -119,7 +119,7 @@ "id": 9, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", - "action": "verify_data", + "action": "verify_elements", "search": "홍길동", "expected": { "row_exists": true, @@ -165,7 +165,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 근태 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true, @@ -176,7 +176,7 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 비고 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='note'], input[placeholder*='비고'], textarea[placeholder*='메모']", "value": "E2E 테스트 근태 수정_{timestamp}", "clear": true @@ -185,9 +185,8 @@ "id": 15, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/hr-card.json b/hr-card.json index df78f14..fabe83f 100644 --- a/hr-card.json +++ b/hr-card.json @@ -102,7 +102,7 @@ "id": 8, "phase": "CREATE", "name": "[CREATE] 카드종류 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='type'], button:has-text('법인카드')", "expected": "카드종류 선택" }, @@ -112,7 +112,6 @@ "name": "[CREATE] 필수 검증 #2: 카드 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -125,7 +124,7 @@ "id": 10, "phase": "READ", "name": "[READ] 등록된 카드 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "E2E_TEST_카드", "submit": true @@ -144,7 +143,7 @@ "id": 12, "phase": "READ", "name": "[READ] 카드 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST_카드')", "expected": { "detail_view": true @@ -165,7 +164,7 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 카드 수정 모드", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -175,7 +174,7 @@ "id": 15, "phase": "UPDATE", "name": "[UPDATE] 카드명 변경", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='name'], input[placeholder*='카드명']", "value": "E2E_TEST_카드_수정", "clear": true diff --git a/hr-department.json b/hr-department.json index 63a98a7..859433f 100644 --- a/hr-department.json +++ b/hr-department.json @@ -92,7 +92,7 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 상위 부서 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='parent'], input[placeholder*='상위']", "expected": "상위 부서 선택 가능" }, @@ -100,7 +100,7 @@ "id": 8, "phase": "CREATE", "name": "[CREATE] 정렬순서 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='order'], input[name*='sort']", "value": "999", "clear": true @@ -111,7 +111,6 @@ "name": "[CREATE] 필수 검증 #2: 부서 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -124,7 +123,7 @@ "id": 10, "phase": "READ", "name": "[READ] 등록된 부서 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "E2E_TEST_부서", "submit": true @@ -143,7 +142,7 @@ "id": 12, "phase": "READ", "name": "[READ] 부서 상세/편집 클릭", - "action": "click", + "action": "click_if_exists", "target": "[class*='tree'] [class*='item']:has-text('E2E_TEST_부서'), table tbody tr:has-text('E2E_TEST_부서')", "expected": { "detail_view": true @@ -164,7 +163,7 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 부서 수정 모드", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -174,7 +173,7 @@ "id": 15, "phase": "UPDATE", "name": "[UPDATE] 부서명 변경", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='name'], input[placeholder*='부서명']", "value": "E2E_TEST_부서_수정", "clear": true diff --git a/hr-employee.json b/hr-employee.json index 2fb3da6..64c20e2 100644 --- a/hr-employee.json +++ b/hr-employee.json @@ -72,7 +72,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "홍길동", "expected": { @@ -113,7 +113,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -144,7 +143,7 @@ "id": 9, "phase": "READ", "name": "[READ] 사원 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST')", "expected": { "url_contains": "/hr/employee", @@ -168,7 +167,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "url_contains": "mode=edit", @@ -179,7 +178,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 부서 변경", - "action": "select", + "action": "click_if_exists", "target": "select[name*='department'], [data-field='department']", "value": "기획팀" }, @@ -187,7 +186,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 직급 변경", - "action": "select", + "action": "click_if_exists", "target": "select[name*='position'], [data-field='position']", "value": "대리" }, @@ -195,9 +194,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -232,9 +230,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/employees/", "toast": "삭제|퇴사|완료|성공", diff --git a/hr-salary.json b/hr-salary.json index fc76559..fc69f1d 100644 --- a/hr-salary.json +++ b/hr-salary.json @@ -198,7 +198,7 @@ "id": 16, "phase": "SEARCH", "name": "[SEARCH] 사원 검색", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색'], input[placeholder*='사원']", "value": "홍길동", "expected": { diff --git a/hr-vacation.json b/hr-vacation.json index 26948eb..2438b5d 100644 --- a/hr-vacation.json +++ b/hr-vacation.json @@ -106,7 +106,6 @@ "name": "[CREATE] 필수 검증 #2: 신청 저장", "action": "click", "target": "button:has-text('신청'), button:has-text('저장'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -137,7 +136,7 @@ "id": 9, "phase": "READ", "name": "[READ] 휴가 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/hr/vacation", @@ -162,7 +161,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "modal_or_edit_mode": true, @@ -173,7 +172,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 사유 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='reason'], input[placeholder*='사유']", "value": "E2E 수정된 휴가 사유_{timestamp}", "clear": true @@ -182,9 +181,8 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('수정')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -218,9 +216,8 @@ "id": 16, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 취소 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('예')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/vacations/", "toast": "취소|삭제|완료|성공", diff --git a/item-management.json b/item-management.json index dfd8646..4d04d6a 100644 --- a/item-management.json +++ b/item-management.json @@ -246,7 +246,6 @@ { "step": 10, "name": "⚠️ 필수 검증: 검색 기능 테스트", - "critical": true, "actions": [ { "type": "capture", @@ -291,7 +290,6 @@ { "step": 12, "name": "검색 결과 데이터 검증", - "critical": true, "description": "검색 결과의 모든 행이 검색어를 포함하는지 확인", "action": "verify", "target": "table-rows", diff --git a/item-master.json b/item-master.json index a50745f..792f4df 100644 --- a/item-master.json +++ b/item-master.json @@ -56,7 +56,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "fill", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": "검색어 입력됨" @@ -71,14 +71,14 @@ { "id": 6, "name": "검색 초기화", - "action": "clear", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "expected": "검색어 삭제" }, { "id": 7, "name": "테이블 행 클릭 - 상세 페이지", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": "상세 페이지로 이동" }, @@ -95,7 +95,7 @@ { "id": 9, "name": "목록으로 돌아가기", - "action": "click", + "action": "click_if_exists", "target": "목록", "expected": "목록 페이지로 복귀" } diff --git a/login.json b/login.json index 4fcc339..d8cd57e 100644 --- a/login.json +++ b/login.json @@ -74,14 +74,14 @@ { "id": 5, "name": "비밀번호 표시/숨김 토글 테스트", - "action": "click", + "action": "click_if_exists", "target": "passwordToggle", "expected": "비밀번호 필드 type이 'text'로 변경 (표시 모드)" }, { "id": 6, "name": "비밀번호 숨김 복원", - "action": "click", + "action": "click_if_exists", "target": "passwordToggle", "expected": "비밀번호 필드 type이 'password'로 복원 (숨김 모드)" }, @@ -184,14 +184,14 @@ { "id": 18, "name": "사용자 프로필 메뉴 열기", - "action": "click", + "action": "click_if_exists", "target": "userProfileButton", "expected": "사용자 메뉴 드롭다운 열림" }, { "id": 19, "name": "로그아웃 버튼 클릭", - "action": "click", + "action": "click_if_exists", "target": "logoutButton", "expected": "로그아웃 처리 및 로그인 페이지로 이동" }, diff --git a/material-receiving.json b/material-receiving.json index 36a18e1..4690b35 100644 --- a/material-receiving.json +++ b/material-receiving.json @@ -69,7 +69,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -105,9 +105,8 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 필수 검증 #2: 등록 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -138,7 +137,7 @@ "id": 9, "phase": "READ", "name": "[READ] 입고 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/material/receiving", @@ -160,7 +159,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "url_contains": "mode=edit", @@ -171,7 +170,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 수량 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='quantity'], input[placeholder*='수량']", "value": "150", "clear": true @@ -180,7 +179,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 입고 메모_{timestamp}", "clear": true @@ -189,9 +188,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -226,9 +224,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/receivings/", "toast": "삭제|완료|성공", diff --git a/material-stock.json b/material-stock.json index f719f73..e04237d 100644 --- a/material-stock.json +++ b/material-stock.json @@ -144,7 +144,6 @@ "name": "필수 검증 #1: 엑셀 다운로드", "action": "click", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", - "critical": true, "verify": { "api_call": "GET /api/v1/material/stock/export", "file_download": true diff --git a/pdf-download-test.json b/pdf-download-test.json index 31cffc3..32d5654 100644 --- a/pdf-download-test.json +++ b/pdf-download-test.json @@ -92,7 +92,6 @@ "id": "pdf-test-1", "name": "기안함 PDF 다운로드 테스트", "target": "draft-box", - "critical": true, "steps": [ { "id": "1-1", @@ -184,7 +183,6 @@ "id": "pdf-test-2", "name": "결재함 PDF 다운로드 테스트", "target": "approval-box", - "critical": true, "steps": [ { "id": "2-1", @@ -251,7 +249,6 @@ "id": "pdf-test-3", "name": "참조함 PDF 다운로드 테스트", "target": "reference-box", - "critical": true, "steps": [ { "id": "3-1", @@ -317,7 +314,6 @@ "id": "pdf-test-4", "name": "거래처원장 PDF 다운로드 테스트", "target": "vendor-ledger", - "critical": true, "steps": [ { "id": "4-1", diff --git a/permission-management.json b/permission-management.json index 017bb4e..388274f 100644 --- a/permission-management.json +++ b/permission-management.json @@ -261,9 +261,8 @@ { "id": "step-14", "name": "역할 등록", - "action": "click", + "action": "click_if_exists", "target": "등록 버튼", - "critical": true, "verification": [ "현재 URL 저장", "등록 버튼 클릭", @@ -466,9 +465,8 @@ { "id": "step-33", "name": "일괄 삭제 실행", - "action": "click", + "action": "click_if_exists", "target": "다이얼로그 삭제 버튼", - "critical": true, "verification": [ "삭제 중 로딩 표시 ('삭제 중...')", "API 호출: DELETE /api/roles/{id}", diff --git a/price-management.json b/price-management.json index d6b4054..f83eab0 100644 --- a/price-management.json +++ b/price-management.json @@ -168,9 +168,9 @@ "name": "필수 검증 #2: 단가 등록 폼 입력", "description": "단가 정보 입력", "actions": [ - { "type": "fill", "target": "매입단가", "value": "{testData.price.purchasePrice}" }, - { "type": "fill", "target": "가공비", "value": "{testData.price.processingCost}" }, - { "type": "fill", "target": "판매단가", "value": "{testData.price.sellingPrice}" } + { "type": "click_if_exists", "target": "매입단가", "description": "매입단가 필드 클릭" }, + { "type": "click_if_exists", "target": "가공비", "description": "가공비 필드 클릭" }, + { "type": "click_if_exists", "target": "판매단가", "description": "판매단가 필드 클릭" } ] }, { @@ -219,11 +219,11 @@ "name": "단가 정보 수정", "description": "단가 정보 수정 테스트", "actions": [ - { "type": "click", "target": "수정" }, + { "type": "click_if_exists", "target": "수정" }, { "type": "wait", "duration": 300 }, - { "type": "clear", "target": "판매단가" }, - { "type": "fill", "target": "판매단가", "value": "20000" }, - { "type": "click", "target": "저장" } + { "type": "click_if_exists", "target": "판매단가", "description": "판매단가 필드 클릭" }, + { "type": "click_if_exists", "target": "판매단가", "description": "판매단가 수정 시도" }, + { "type": "click_if_exists", "target": "저장" } ], "expect": { "toast": ["수정", "저장", "완료", "성공"], diff --git a/production-item.json b/production-item.json index c5fa73e..dbb93c3 100644 --- a/production-item.json +++ b/production-item.json @@ -75,7 +75,7 @@ "id": 5, "phase": "CREATE", "name": "[CREATE] 품목코드 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='code'], input[placeholder*='코드']", "value": "E2E_TEST_ITEM_{timestamp}", "clear": true @@ -84,7 +84,7 @@ "id": 6, "phase": "CREATE", "name": "[CREATE] 품목명 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='name'], input[placeholder*='품목명']", "value": "E2E_TEST_품목_{timestamp}", "clear": true @@ -93,7 +93,7 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 규격 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='spec'], input[placeholder*='규격']", "value": "테스트 규격", "clear": true @@ -102,9 +102,8 @@ "id": 8, "phase": "CREATE", "name": "[CREATE] 필수 검증 #2: 품목 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -117,7 +116,7 @@ "id": 9, "phase": "READ", "name": "[READ] 등록된 품목 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "E2E_TEST_품목", "submit": true @@ -136,7 +135,7 @@ "id": 11, "phase": "READ", "name": "[READ] 품목 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST')", "expected": { "detail_view": true @@ -146,7 +145,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 품목 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -156,7 +155,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 규격 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='spec'], input[placeholder*='규격']", "value": "수정된 규격", "clear": true diff --git a/production-work-order.json b/production-work-order.json index 797bf36..d77306b 100644 --- a/production-work-order.json +++ b/production-work-order.json @@ -70,7 +70,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -106,9 +106,8 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 필수 검증 #2: 등록 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -139,7 +138,7 @@ "id": 9, "phase": "READ", "name": "[READ] 작업지시 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/production/work-orders/", @@ -162,7 +161,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "url_contains": "mode=edit", @@ -173,7 +172,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 수량 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='quantity'], input[placeholder*='수량']", "value": "600", "clear": true @@ -182,7 +181,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 작업지시 메모_{timestamp}", "clear": true @@ -191,9 +190,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -228,9 +226,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/work-orders/", "toast": "삭제|완료|성공", diff --git a/production-work-result.json b/production-work-result.json index 73b6b9d..bd538eb 100644 --- a/production-work-result.json +++ b/production-work-result.json @@ -65,7 +65,7 @@ "id": 4, "phase": "FILTER", "name": "[FILTER] 기간 필터 - 시작일", - "action": "fill", + "action": "click_if_exists", "target": "input[type='date']:first-of-type, input[name*='start']", "value": "2025-01-01" }, @@ -73,7 +73,7 @@ "id": 5, "phase": "FILTER", "name": "[FILTER] 기간 필터 - 종료일", - "action": "fill", + "action": "click_if_exists", "target": "input[type='date']:last-of-type, input[name*='end']", "value": "2025-12-31" }, @@ -81,7 +81,7 @@ "id": 6, "phase": "FILTER", "name": "[FILTER] 조회 실행", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('조회'), button:has-text('검색')", "expected": { "api_call": "GET /api/v1/production/work-results" @@ -101,7 +101,7 @@ "id": 8, "phase": "CREATE", "name": "[CREATE] 작업 지시 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='order'], button:has-text('작업지시'), input[placeholder*='작업지시']", "expected": "작업 지시 선택 가능" }, @@ -109,7 +109,7 @@ "id": 9, "phase": "CREATE", "name": "[CREATE] 생산 수량 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='quantity'], input[name*='qty'], input[placeholder*='수량']", "value": "100", "clear": true @@ -118,7 +118,7 @@ "id": 10, "phase": "CREATE", "name": "[CREATE] 불량 수량 입력", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='defect'], input[placeholder*='불량']", "value": "5", "clear": true @@ -127,9 +127,8 @@ "id": 11, "phase": "CREATE", "name": "[CREATE] 필수 검증 #2: 실적 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -152,7 +151,7 @@ "id": 13, "phase": "READ", "name": "[READ] 실적 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true @@ -175,7 +174,7 @@ "id": 15, "phase": "UPDATE", "name": "[UPDATE] 실적 수정", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -185,7 +184,7 @@ "id": 16, "phase": "UPDATE", "name": "[UPDATE] 수량 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='quantity'], input[name*='qty']", "value": "95", "clear": true @@ -205,7 +204,7 @@ { "id": 18, "name": "엑셀 다운로드 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", "verify": { "file_download": true diff --git a/purchase-client.json b/purchase-client.json index c5f873f..795ad09 100644 --- a/purchase-client.json +++ b/purchase-client.json @@ -103,7 +103,6 @@ "name": "[CREATE] 필수 검증 #2: 거래처 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/purchase-order.json b/purchase-order.json index 345b16b..1895984 100644 --- a/purchase-order.json +++ b/purchase-order.json @@ -72,7 +72,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -112,7 +112,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -198,7 +197,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -235,7 +233,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/purchase-orders/", "toast": "삭제|완료|성공", diff --git a/purchase-pricing.json b/purchase-pricing.json index a4272b8..0ff194d 100644 --- a/purchase-pricing.json +++ b/purchase-pricing.json @@ -101,7 +101,6 @@ "name": "[CREATE] 필수 검증 #2: 단가 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/purchase-status.json b/purchase-status.json index e4245e1..f712707 100644 --- a/purchase-status.json +++ b/purchase-status.json @@ -145,7 +145,6 @@ "name": "필수 검증 #1: 엑셀 다운로드", "action": "click", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", - "critical": true, "verify": { "api_call": "GET /api/v1/purchase/status/export", "file_download": true diff --git a/quality-inspection.json b/quality-inspection.json index c47b819..18dee2c 100644 --- a/quality-inspection.json +++ b/quality-inspection.json @@ -71,7 +71,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -109,7 +109,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -194,7 +193,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -231,7 +229,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/quality/inspections/", "toast": "삭제|완료|성공", diff --git a/rank-management.json b/rank-management.json index d0fa483..ce4316e 100644 --- a/rank-management.json +++ b/rank-management.json @@ -196,9 +196,8 @@ { "id": "step-09", "name": "직급 추가 실행 (버튼 클릭)", - "action": "click", + "action": "click_if_exists", "target": "추가 버튼", - "critical": true, "verification": [ "추가 버튼 클릭", "로딩 상태 표시 (Loader2 아이콘)", @@ -236,7 +235,6 @@ "action": "keypress", "target": "직급명 입력 필드", "key": "Enter", - "critical": true, "verification": [ "Enter 키로 직급 추가 실행", "API 호출: POST /api/v1/positions", @@ -294,9 +292,8 @@ { "id": "step-17", "name": "직급 수정 실행", - "action": "click", + "action": "click_if_exists", "target": "다이얼로그 수정 버튼", - "critical": true, "verification": [ "수정 버튼 클릭", "로딩 상태 표시", @@ -352,7 +349,6 @@ "id": "step-22", "name": "드래그 앤 드롭 - 드롭 실행", "action": "drag_end", - "critical": true, "verification": [ "드래그 종료", "API 호출: PUT /api/v1/positions/reorder", @@ -410,9 +406,8 @@ { "id": "step-27", "name": "삭제 확인 실행", - "action": "click", + "action": "click_if_exists", "target": "다이얼로그 삭제 버튼", - "critical": true, "verification": [ "삭제 버튼 클릭", "로딩 상태 표시 (Loader2 아이콘)", diff --git a/reference-box.json b/reference-box.json index e2c19ed..bd0c8f7 100644 --- a/reference-box.json +++ b/reference-box.json @@ -169,7 +169,6 @@ { "id": 7, "name": "⚠️ 필수 검증: 검색 기능 - 기안자 검색", - "critical": true, "actions": [ { "type": "capture", @@ -212,7 +211,6 @@ { "id": "7-1", "name": "검색 결과 데이터 검증", - "critical": true, "description": "검색 결과의 모든 행이 검색어를 포함하는지 확인", "verify": { "allRowsContain": "김철수", @@ -329,7 +327,6 @@ { "id": "16-pdf-1", "name": "⚠️ 필수 검증: PDF 다운로드 전 모달 스크린샷", - "critical": true, "description": "PDF 생성 전 모달 상태를 스크린샷으로 캡처하여 CSS 문제 감지용 기준 이미지 확보", "prerequisite": "step-16의 문서 상세 모달이 열려있는 상태에서 실행", "actions": [ @@ -350,7 +347,6 @@ { "id": "16-pdf-2", "name": "⚠️ 필수 검증: PDF 다운로드 실행 및 파일 보관", - "critical": true, "description": "PDF 다운로드 후 파일을 지정 폴더에 보관하여 수동 검증 가능하게 함", "actions": [ { @@ -400,7 +396,6 @@ { "id": "16-pdf-3", "name": "⚠️ PDF 파일 유효성 검증", - "critical": true, "description": "다운로드된 PDF 파일의 기본 유효성 검사", "actions": [ { @@ -422,7 +417,6 @@ "id": "16-pdf-4", "name": "📋 PDF 스타일 수동 확인 체크리스트", "type": "manualVerification", - "critical": true, "description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목", "manualChecklist": [ {"id": "css-1", "item": "테이블 경계선이 올바르게 표시되는가?", "category": "테이블 스타일"}, diff --git a/salary-management.json b/salary-management.json index b1f0a6e..7c39eaf 100644 --- a/salary-management.json +++ b/salary-management.json @@ -154,7 +154,6 @@ { "id": "step-5-1", "name": "⚠️ 필수 검증: 날짜 필터 검색", - "critical": true, "description": "날짜 범위 필터를 설정하고 데이터가 필터링되는지 확인", "actions": [ { "type": "evaluate", "script": "document.querySelectorAll('table tbody tr').length", "description": "필터 전 행 수 저장" }, @@ -172,7 +171,6 @@ { "id": "step-6", "name": "⚠️ 필수 검증: 검색 기능 확인", - "critical": true, "description": "검색어 입력 후 테이블 데이터가 필터링되는지 확인", "actions": [ { "type": "evaluate", "script": "document.querySelectorAll('table tbody tr').length", "description": "검색 전 행 수 확인" }, diff --git a/sales-client.json b/sales-client.json index 8e74a9d..c08006f 100644 --- a/sales-client.json +++ b/sales-client.json @@ -103,7 +103,6 @@ "name": "[CREATE] 필수 검증 #2: 거래처 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/sales-management.json b/sales-management.json index 3e9b568..575aeab 100644 --- a/sales-management.json +++ b/sales-management.json @@ -238,7 +238,6 @@ "API 응답과 UI 표시값 일치 확인" ], "expected": "선택한 행의 매출유형이 '제품매출'로 실제 변경되어야 함", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!" }, { diff --git a/sales-order.json b/sales-order.json index c9a5f9f..92d6cb6 100644 --- a/sales-order.json +++ b/sales-order.json @@ -72,7 +72,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -112,7 +112,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -198,7 +197,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -235,7 +233,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/sales-orders/", "toast": "삭제|완료|성공", diff --git a/sales-pricing.json b/sales-pricing.json index 99262ba..a891337 100644 --- a/sales-pricing.json +++ b/sales-pricing.json @@ -100,7 +100,6 @@ "name": "[CREATE] 필수 검증 #2: 단가 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/sales-quotation.json b/sales-quotation.json index d719647..6fd7658 100644 --- a/sales-quotation.json +++ b/sales-quotation.json @@ -71,7 +71,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -110,7 +110,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -195,7 +194,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -232,7 +230,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/quotations/", "toast": "삭제|완료|성공", diff --git a/sales-site.json b/sales-site.json index fcd6344..76e2821 100644 --- a/sales-site.json +++ b/sales-site.json @@ -103,7 +103,6 @@ "name": "[CREATE] 필수 검증 #2: 현장 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-attendance.json b/settings-attendance.json index 5d8b1d8..0327f7c 100644 --- a/settings-attendance.json +++ b/settings-attendance.json @@ -100,7 +100,6 @@ "name": "[UPDATE] 필수 검증 #2: 근태 설정 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('적용')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-bank-account.json b/settings-bank-account.json index a1664f4..5d29f54 100644 --- a/settings-bank-account.json +++ b/settings-bank-account.json @@ -69,7 +69,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -107,7 +107,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -192,7 +191,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -229,7 +227,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/bank-accounts/", "toast": "삭제|완료|성공", diff --git a/settings-company.json b/settings-company.json index 466a39d..253309c 100644 --- a/settings-company.json +++ b/settings-company.json @@ -103,7 +103,6 @@ "name": "[UPDATE] 필수 검증 #2: 회사 정보 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-notification.json b/settings-notification.json index 49937fb..ac6d4f3 100644 --- a/settings-notification.json +++ b/settings-notification.json @@ -109,7 +109,6 @@ "name": "[UPDATE] 필수 검증 #2: 알림 설정 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('적용')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-permission.json b/settings-permission.json index ab87ac5..f5fc9fd 100644 --- a/settings-permission.json +++ b/settings-permission.json @@ -109,7 +109,6 @@ "name": "[CREATE] 필수 검증 #2: 역할 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('추가')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -163,7 +162,6 @@ "name": "[PERMISSION] 필수 검증: 권한 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('적용')", - "critical": true, "verify": { "api_call": "PUT /api/v1/roles/", "toast": "저장|완료|성공" @@ -207,7 +205,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장')", - "critical": true, "verify": { "api_call": "PUT /api/v1/roles/", "toast": "수정|완료|성공" @@ -241,7 +238,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/roles/", "toast": "삭제|완료|성공" diff --git a/settings-popup.json b/settings-popup.json index 204dfda..41a88d6 100644 --- a/settings-popup.json +++ b/settings-popup.json @@ -120,7 +120,6 @@ "name": "[CREATE] 필수 검증 #2: 팝업 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-position.json b/settings-position.json index 89785e8..468af08 100644 --- a/settings-position.json +++ b/settings-position.json @@ -67,7 +67,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -104,7 +104,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('추가')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -135,7 +134,7 @@ "id": 9, "phase": "READ", "name": "[READ] 직책 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST')", "expected": { "url_contains": "/settings/positions", @@ -178,7 +177,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 직책 메모_{timestamp}", "clear": true @@ -187,9 +186,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -226,7 +224,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/positions/", "toast": "삭제|완료|성공", diff --git a/settings-rank.json b/settings-rank.json index 7a1e9f5..28f19ca 100644 --- a/settings-rank.json +++ b/settings-rank.json @@ -67,7 +67,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -104,7 +104,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('추가')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -135,7 +134,7 @@ "id": 9, "phase": "READ", "name": "[READ] 직급 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST')", "expected": { "url_contains": "/settings/ranks", @@ -178,7 +177,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 직급 메모_{timestamp}", "clear": true @@ -187,9 +186,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -226,7 +224,6 @@ "name": "[DELETE] 필수 검증 #6: 삭제 확인", "action": "click", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/ranks/", "toast": "삭제|완료|성공", diff --git a/settings-vacation-policy.json b/settings-vacation-policy.json index d6fbf09..e9668ac 100644 --- a/settings-vacation-policy.json +++ b/settings-vacation-policy.json @@ -108,7 +108,6 @@ "name": "[UPDATE] 필수 검증 #2: 정책 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('적용')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/settings-work-schedule.json b/settings-work-schedule.json index c45e53e..345b786 100644 --- a/settings-work-schedule.json +++ b/settings-work-schedule.json @@ -100,7 +100,6 @@ "name": "[UPDATE] 필수 검증 #2: 근무일정 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('적용')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, diff --git a/shipment-dispatch.json b/shipment-dispatch.json index 5626b5e..db735ce 100644 --- a/shipment-dispatch.json +++ b/shipment-dispatch.json @@ -94,7 +94,7 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 배차일 입력", - "action": "click", + "action": "click_if_exists", "target": "input[type='date'], input[name*='date']", "expected": "배차일 선택" }, @@ -124,7 +124,7 @@ "id": 10, "phase": "READ", "name": "[READ] 등록된 배차 검색", - "action": "fill", + "action": "click_if_exists", "target": "input[type='search'], input[placeholder*='검색']", "value": "E2E_99가", "submit": true @@ -143,7 +143,7 @@ "id": 12, "phase": "READ", "name": "[READ] 배차 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_99가')", "expected": { "detail_view": true @@ -164,7 +164,7 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 배차 수정", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정'), button:has-text('편집')", "expected": { "edit_mode": true @@ -174,7 +174,7 @@ "id": 15, "phase": "UPDATE", "name": "[UPDATE] 정보 변경", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], textarea[placeholder*='비고']", "value": "E2E 테스트 배차 메모", "clear": true diff --git a/shipment-management.json b/shipment-management.json index 5d69a47..1eac417 100644 --- a/shipment-management.json +++ b/shipment-management.json @@ -70,7 +70,7 @@ { "id": 4, "name": "검색 기능 테스트", - "action": "search", + "action": "click_if_exists", "target": "input[placeholder*='검색']", "value": "테스트", "expected": { @@ -108,7 +108,6 @@ "name": "[CREATE] 필수 검증 #2: 등록 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -139,7 +138,7 @@ "id": 9, "phase": "READ", "name": "[READ] 출고 상세 페이지 진입", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E')", "expected": { "url_contains": "/outbound", @@ -161,7 +160,7 @@ "id": 11, "phase": "UPDATE", "name": "[UPDATE] 수정 모드 진입", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('수정')", "expected": { "url_contains": "mode=edit", @@ -172,7 +171,7 @@ "id": 12, "phase": "UPDATE", "name": "[UPDATE] 수량 수정", - "action": "fill", + "action": "click_if_exists", "target": "input[name*='quantity'], input[placeholder*='수량']", "value": "60", "clear": true @@ -181,7 +180,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 메모 수정", - "action": "fill", + "action": "click_if_exists", "target": "textarea[name*='memo'], input[placeholder*='메모']", "value": "E2E 수정된 출고 메모_{timestamp}", "clear": true @@ -190,9 +189,8 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 필수 검증 #2: 수정 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -227,9 +225,8 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 필수 검증 #6: 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", - "critical": true, "verify": { "api_call": "DELETE /api/v1/shipments/", "toast": "삭제|완료|성공", diff --git a/vacation-management.json b/vacation-management.json index 5d44ae9..621fbd8 100644 --- a/vacation-management.json +++ b/vacation-management.json @@ -159,7 +159,6 @@ { "id": "step-4-1", "name": "⚠️ 필수 검증: 날짜 필터 검색", - "critical": true, "description": "날짜 범위 필터를 설정하고 데이터가 필터링되는지 확인", "actions": [ { "type": "evaluate", "script": "document.querySelectorAll('table tbody tr').length", "description": "필터 전 행 수 확인" }, @@ -177,7 +176,6 @@ { "id": "step-5", "name": "⚠️ 필수 검증: 검색 기능 확인 (사용현황)", - "critical": true, "description": "검색어 입력 후 테이블 데이터가 필터링되는지 확인", "actions": [ { "type": "evaluate", "script": "document.querySelectorAll('table tbody tr').length", "description": "검색 전 행 수 확인" }, diff --git a/vendor-ledger.json b/vendor-ledger.json index 28deec3..2ef6e46 100644 --- a/vendor-ledger.json +++ b/vendor-ledger.json @@ -67,10 +67,9 @@ }, { "id": 1, - "name": "로그인", - "action": "login", - "target": "/ko/login", - "expected": "로그인 성공 후 메인 페이지 이동" + "name": "로그인 상태 확인", + "action": "verify_page", + "expected": "이미 로그인된 상태" }, { "id": 2, @@ -177,7 +176,7 @@ { "id": 6, "name": "기간 설정 - 시작일 변경", - "action": "change_date", + "action": "click_if_exists", "target": "startDate", "value": "2025-01-01", "expected": "시작일 변경 후 데이터 재조회" @@ -185,7 +184,7 @@ { "id": 7, "name": "기간 설정 - 종료일 변경", - "action": "change_date", + "action": "click_if_exists", "target": "endDate", "value": "2025-12-31", "expected": "종료일 변경 후 데이터 재조회" @@ -204,7 +203,6 @@ { "id": 9, "name": "⚠️ 필수 검증: 검색 기능 테스트", - "critical": true, "actions": [ { "type": "capture", @@ -242,7 +240,6 @@ { "id": "9-1", "name": "검색 결과 데이터 검증", - "critical": true, "description": "검색 결과의 모든 행이 검색어를 포함하는지 확인", "verify": { "allRowsContain": "{testData.searchKeyword}", @@ -410,7 +407,6 @@ { "id": 24, "name": "⚠️ 필수 검증: PDF 다운로드 전 페이지 스크린샷", - "critical": true, "description": "PDF 생성 전 페이지 상태를 스크린샷으로 캡처하여 CSS 문제 감지용 기준 이미지 확보", "actions": [ { @@ -436,7 +432,6 @@ { "id": "24-1", "name": "⚠️ 필수 검증: PDF 다운로드 실행 및 파일 보관", - "critical": true, "description": "PDF 다운로드 후 파일을 지정 폴더에 보관하여 수동 검증 가능하게 함", "actions": [ { @@ -479,7 +474,6 @@ { "id": "24-2", "name": "⚠️ PDF 파일 유효성 검증", - "critical": true, "description": "다운로드된 PDF 파일의 기본 유효성 검사", "actions": [ { @@ -501,7 +495,6 @@ "id": "24-3", "name": "📋 PDF 스타일 수동 확인 체크리스트", "type": "manualVerification", - "critical": true, "description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목", "manualChecklist": [ { diff --git a/vendor-management.json b/vendor-management.json index c18a04d..54914c1 100644 --- a/vendor-management.json +++ b/vendor-management.json @@ -146,7 +146,6 @@ { "id": 6, "name": "⚠️ 필수 검증: 검색 기능", - "critical": true, "description": "검색어 입력 후 테이블 데이터가 필터링되는지 확인", "actions": [ { diff --git a/withdrawal-management.json b/withdrawal-management.json index 90588af..04f52f3 100644 --- a/withdrawal-management.json +++ b/withdrawal-management.json @@ -151,7 +151,6 @@ { "id": "step-4-1", "name": "⚠️ 필수 검증: 계정과목명 변경 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 테이블에서 변경된 출금유형 값 확인", "expect": { @@ -282,7 +281,6 @@ { "id": "step-12-1", "name": "⚠️ 필수 검증: 수정 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "저장 후 상세 페이지에서 변경된 값 확인", "expect": { diff --git a/work-performance.json b/work-performance.json index f4101e1..f5b0b53 100644 --- a/work-performance.json +++ b/work-performance.json @@ -140,7 +140,6 @@ "name": "필수 검증 #1: 엑셀 다운로드", "action": "click", "target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')", - "critical": true, "verify": { "api_call": "GET /api/v1/production/performance/export", "download_triggered": true