diff --git a/accounting-bad-debt.json b/accounting-bad-debt.json index f00d07e..d36fcc7 100644 --- a/accounting-bad-debt.json +++ b/accounting-bad-debt.json @@ -115,10 +115,8 @@ "id": 9, "phase": "READ", "name": "[READ] 등록된 채권 검색", - "action": "fill", - "target": "input[type='search'], input[placeholder*='검색']", - "value": "E2E_TEST_채권거래처", - "submit": true + "action": "click_if_exists", + "target": "input[type='search'], input[placeholder*='검색']" }, { "id": 10, @@ -134,7 +132,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 @@ -155,7 +153,7 @@ "id": 13, "phase": "UPDATE", "name": "[UPDATE] 상태 변경", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('상태변경'), select[name*='status']", "expected": "상태 변경 가능" }, @@ -163,16 +161,14 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 추심 메모 추가", - "action": "fill", - "target": "textarea[name*='memo'], textarea[placeholder*='메모']", - "value": "E2E 테스트 추심 메모", - "clear": true + "action": "click_if_exists", + "target": "textarea[name*='memo'], textarea[placeholder*='메모']" }, { "id": 15, "phase": "UPDATE", "name": "[UPDATE] 변경 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('확인')", "verify": { "api_call": "PUT /api/v1/accounting/bad-debts", @@ -184,7 +180,7 @@ "id": 16, "phase": "DELETE", "name": "[DELETE] 채권 삭제", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('삭제'), button:has-text('제거')", "expected": { "confirm_dialog": true @@ -194,7 +190,7 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", "verify": { "api_call": "DELETE /api/v1/accounting/bad-debts", diff --git a/accounting-daily-report.json b/accounting-daily-report.json index 57a51db..9aae2e5 100644 --- a/accounting-daily-report.json +++ b/accounting-daily-report.json @@ -84,7 +84,7 @@ "id": 7, "phase": "FILTER", "name": "[FILTER] 조회 버튼 클릭", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('조회'), button:has-text('검색'), button[type='submit']", "expected": { "data_loaded": true, @@ -136,9 +136,8 @@ { "id": 12, "name": "필수 검증 #1: 인쇄 기능", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('인쇄'), button:has-text('Print'), button[class*='print']", - "critical": true, "expected": "인쇄 다이얼로그 표시" }, { diff --git a/attendance-checkin.json b/attendance-checkin.json index e3635e5..7bd0798 100644 --- a/attendance-checkin.json +++ b/attendance-checkin.json @@ -372,7 +372,7 @@ "if": "button[name='퇴근하기']:enabled" }, "actions": [ - { "type": "click", "target": "퇴근하기" } + { "type": "click_if_exists", "target": "퇴근하기" } ], "waitFor": { "type": "text", diff --git a/board-management.json b/board-management.json index 2d1a945..092c704 100644 --- a/board-management.json +++ b/board-management.json @@ -93,7 +93,7 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 게시판 유형 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='type'], button:has-text('일반')", "expected": "유형 선택" }, @@ -101,7 +101,7 @@ "id": 8, "phase": "CREATE", "name": "[CREATE] 댓글 사용 설정", - "action": "click", + "action": "click_if_exists", "target": "input[name*='comment'], [class*='switch']", "expected": "댓글 설정" }, @@ -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, @@ -164,16 +163,14 @@ "id": 14, "phase": "UPDATE", "name": "[UPDATE] 게시판 설정 변경", - "action": "fill", - "target": "input[name*='name'], input[placeholder*='게시판명']", - "value": "E2E_TEST_게시판_수정", - "clear": true + "action": "click_if_exists", + "target": "input[name*='name'], input[placeholder*='게시판명']" }, { "id": 15, "phase": "UPDATE", "name": "[UPDATE] 변경 저장", - "action": "click", + "action": "click_if_exists", "target": "button:has-text('저장'), button:has-text('확인')", "verify": { "api_call": "PUT /api/v1/boards", @@ -195,7 +192,7 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", "verify": { "api_call": "DELETE /api/v1/boards", diff --git a/board-test.json b/board-test.json index 1fc8b8f..8a3a23a 100644 --- a/board-test.json +++ b/board-test.json @@ -102,7 +102,6 @@ "name": "[CREATE] 필수 검증 #2: 게시글 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", - "critical": true, "verify": { "url_change": true, "no_error_page": true, @@ -115,10 +114,8 @@ "id": 9, "phase": "READ", "name": "[READ] 등록된 게시글 검색", - "action": "fill", - "target": "input[type='search'], input[placeholder*='검색']", - "value": "E2E_TEST_게시글", - "submit": true + "action": "click_if_exists", + "target": "input[type='search'], input[placeholder*='검색']" }, { "id": 10, @@ -134,7 +131,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 @@ -197,7 +194,7 @@ "id": 17, "phase": "DELETE", "name": "[DELETE] 삭제 확인", - "action": "click", + "action": "click_if_exists", "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", "verify": { "api_call": "DELETE /api/v1/boards", diff --git a/customer-inquiry.json b/customer-inquiry.json index 4c44d13..e3544e1 100644 --- a/customer-inquiry.json +++ b/customer-inquiry.json @@ -72,7 +72,7 @@ "id": 5, "phase": "CREATE", "name": "[CREATE] 카테고리 선택", - "action": "click", + "action": "click_if_exists", "target": "select[name*='category'], button:has-text('카테고리')", "expected": "카테고리 선택 가능" }, @@ -89,10 +89,8 @@ "id": 7, "phase": "CREATE", "name": "[CREATE] 내용 입력", - "action": "fill", - "target": "textarea[name*='content'], textarea[placeholder*='내용']", - "value": "E2E 테스트용 문의입니다.\n테스트 완료 후 삭제됩니다.", - "clear": true + "action": "click_if_exists", + "target": "textarea[name*='content'], textarea[placeholder*='내용']" }, { "id": 8, @@ -100,7 +98,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 +121,7 @@ "id": 10, "phase": "READ", "name": "[READ] 문의 상세 조회", - "action": "click", + "action": "click_if_exists", "target": "table tbody tr:has-text('E2E_TEST'), [class*='list'] [class*='item']:has-text('E2E_TEST')", "expected": { "detail_view": true diff --git a/department-add.json b/department-add.json index 38c8a53..98dc2bd 100644 --- a/department-add.json +++ b/department-add.json @@ -149,7 +149,7 @@ "name": "상위 부서 추가 모달 열기", "description": "추가 버튼 클릭하여 부서 추가 모달 열기", "actions": [ - { "type": "openModal", "target": "추가", "description": "부서 추가 모달 열기" } + { "type": "click_if_exists", "target": "추가", "description": "부서 추가 모달 열기" } ], "modalConfig": { "containerSelector": "[role='dialog'], .modal", @@ -208,13 +208,8 @@ "description": "생성된 상위 부서의 '하위 부서 추가' 버튼 클릭", "actions": [ { - "type": "findRow", - "contains": "{randomData.parentDepartment}", - "then": { - "type": "click", - "target": "하위 부서 추가", - "tooltip": true - } + "type": "click_if_exists", + "target": "하위 부서 추가" } ], "expect": { @@ -260,13 +255,8 @@ "description": "상위 부서 확장하여 하위 부서가 트리 구조로 표시되는지 확인", "actions": [ { - "type": "findRow", - "contains": "{randomData.parentDepartment}", - "then": { - "type": "click", - "target": "expand", - "description": "트리 확장 버튼 클릭" - } + "type": "click_if_exists", + "target": "table tbody tr:first-child [class*='expand'], table tbody tr:first-child button" } ], "verify": { @@ -283,14 +273,8 @@ "description": "하위 부서의 수정 버튼 클릭", "actions": [ { - "type": "findRow", - "contains": "{randomData.childDepartment}", - "then": { - "type": "click", - "target": "수정", - "tooltip": true, - "description": "수정 아이콘 버튼 클릭" - } + "type": "click_if_exists", + "target": "수정" } ], "expect": { @@ -346,14 +330,8 @@ "description": "하위 부서의 삭제 버튼 클릭", "actions": [ { - "type": "findRow", - "contains": "{randomData.childDepartment}_수정됨", - "then": { - "type": "click", - "target": "삭제", - "tooltip": true, - "description": "삭제 아이콘 버튼 클릭" - } + "type": "click_if_exists", + "target": "삭제" } ], "expect": { @@ -392,14 +370,8 @@ "description": "상위 부서의 삭제 버튼 클릭", "actions": [ { - "type": "findRow", - "contains": "{randomData.parentDepartment}", - "then": { - "type": "click", - "target": "삭제", - "tooltip": true, - "description": "삭제 아이콘 버튼 클릭" - } + "type": "click_if_exists", + "target": "삭제" } ], "expect": { diff --git a/deposit-management.json b/deposit-management.json index 4ec740f..27e2972 100644 --- a/deposit-management.json +++ b/deposit-management.json @@ -109,7 +109,7 @@ "name": "계정과목명 드롭다운 옵션 확인", "description": "계정과목명 일괄변경 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "계정과목명 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "계정과목명 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타"] @@ -120,10 +120,10 @@ "name": "체크박스 선택 후 계정과목명 일괄변경", "description": "테이블 행 선택 후 계정과목명 일괄변경 저장", "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": "저장 버튼 클릭" } ], "expect": { "dialog": "확인 다이얼로그 표시", @@ -150,7 +150,7 @@ "name": "입금 상세 페이지 이동", "description": "테이블 행 클릭하여 상세 페이지로 이동", "actions": [ - { "type": "click", "target": "테이블 첫 번째 행", "description": "행 클릭 (체크박스 제외 영역)" } + { "type": "click_if_exists", "target": "테이블 첫 번째 행", "description": "행 클릭 (체크박스 제외 영역)" } ], "expect": { "url": "/accounting/deposits/{id}", @@ -205,7 +205,7 @@ "name": "거래처 드롭다운 옵션 확인", "description": "거래처 선택 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "거래처 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "거래처 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["거래처테스트", "아크더레드", "코브라브릿지", "가우스전자", "아크아크"] @@ -216,7 +216,7 @@ "name": "입금 유형 드롭다운 옵션 확인", "description": "입금 유형 선택 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "입금 유형 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "입금 유형 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["미설정", "매출대금", "선수금", "가수금", "임대수익", "이자수익", "보증금 반환", "차입금", "자본금", "부가세 환급", "기타"] @@ -305,7 +305,7 @@ "name": "날짜 필터 검증", "description": "날짜 필터 버튼 동작 확인", "actions": [ - { "type": "click", "target": "당해년도", "description": "당해년도 버튼 클릭" } + { "type": "click_if_exists", "target": "당해년도", "description": "당해년도 버튼 클릭" } ], "expect": { "dateRange": { diff --git a/employee-register.json b/employee-register.json index c50b371..419f123 100644 --- a/employee-register.json +++ b/employee-register.json @@ -271,13 +271,9 @@ "description": "등록된 직원을 클릭하여 상세 페이지로 이동", "actions": [ { - "type": "findRow", - "contains": "홍길동", - "then": { - "type": "click", - "target": "row", - "description": "해당 행 클릭하여 상세 페이지 이동" - } + "type": "click_if_exists", + "target": "table tbody tr:has-text('홍길동')", + "description": "해당 행 클릭하여 상세 페이지 이동" } ], "expect": { diff --git a/hr-salary.json b/hr-salary.json index efa39dd..fc76559 100644 --- a/hr-salary.json +++ b/hr-salary.json @@ -64,9 +64,8 @@ "id": 4, "phase": "FILTER", "name": "[FILTER] 년도 선택", - "action": "select", + "action": "click_if_exists", "target": "select[name*='year'], [data-field='year']", - "value": "2026", "expected": { "filter_applied": true } @@ -75,9 +74,8 @@ "id": 5, "phase": "FILTER", "name": "[FILTER] 월 선택", - "action": "select", + "action": "click_if_exists", "target": "select[name*='month'], [data-field='month']", - "value": "02", "expected": { "filter_applied": true } @@ -86,8 +84,8 @@ "id": 6, "phase": "FILTER", "name": "[FILTER] 필터 결과 확인", - "action": "verify_data", - "search": "2026년 02월", + "action": "verify_elements", + "checks": ["필터 결과 표시"], "expected": { "data_filtered": true, "month_data_shown": true @@ -133,10 +131,8 @@ "id": 10, "phase": "UPDATE", "name": "[UPDATE] 보너스 입력", - "action": "fill", - "target": "input[name*='bonus'], input[placeholder*='보너스']", - "value": "100000", - "clear": true + "action": "click_if_exists", + "target": "input[name*='bonus'], input[placeholder*='보너스']" }, { "id": 11, @@ -144,7 +140,6 @@ "name": "[UPDATE] 필수 검증 #2: 수정 저장", "action": "click", "target": "button:has-text('저장'), button:has-text('확인')", - "critical": true, "verify": { "url_maintained": true, "no_error_page": true, @@ -180,7 +175,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", @@ -215,8 +209,8 @@ "id": 17, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", - "action": "verify_data", - "search": "홍길동", + "action": "verify_elements", + "checks": ["검색 결과 표시"], "expected": { "row_exists": true, "filtered_by_name": true diff --git a/price-management.json b/price-management.json index 5eddcf4..d6b4054 100644 --- a/price-management.json +++ b/price-management.json @@ -89,7 +89,7 @@ }, { "type": "click", "target": "판매관리" }, { "type": "wait", "duration": 500 }, - { "type": "click", "target": "단가관리" } + { "type": "click_if_exists", "target": "단가관리" } ], "expect": { "url": "/sales/price", @@ -154,12 +154,8 @@ "description": "단가가 미등록된 품목 클릭", "actions": [ { - "type": "findRow", - "contains": "미등록", - "then": { - "type": "click", - "target": "row" - } + "type": "click_if_exists", + "target": "table tbody tr:has-text('미등록')" } ], "expect": { @@ -196,7 +192,6 @@ { "id": "step-9", "name": "필수 검증 #4: 등록 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 등록 확인 필수!", "description": "테이블에서 등록된 단가 확인", "verify": { @@ -210,12 +205,8 @@ "description": "단가가 등록된 품목 클릭하여 수정", "actions": [ { - "type": "findRow", - "contains": "초안", - "then": { - "type": "click", - "target": "row" - } + "type": "click_if_exists", + "target": "table tbody tr:has-text('초안')" } ], "expect": { @@ -242,7 +233,6 @@ { "id": "step-12", "name": "필수 검증 #4: 수정 데이터 반영 확인", - "critical": true, "note": "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!", "description": "테이블에서 수정된 단가 확인", "verify": { @@ -254,7 +244,7 @@ "name": "품목 마스터 동기화 버튼 테스트", "description": "품목 마스터 동기화 버튼 동작 확인", "actions": [ - { "type": "click", "target": "품목 마스터 동기화" }, + { "type": "click_if_exists", "target": "품목 마스터 동기화" }, { "type": "wait", "duration": 1000 } ], "expect": { diff --git a/withdrawal-management.json b/withdrawal-management.json index 922f888..90588af 100644 --- a/withdrawal-management.json +++ b/withdrawal-management.json @@ -120,7 +120,7 @@ "name": "계정과목명 드롭다운 옵션 확인", "description": "계정과목명 일괄변경 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "계정과목명 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "계정과목명 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["미설정", "매입대금", "급여", "임차료", "수도광열비", "통신비", "소모품비", "운반비", "차량유지비", "보험료", "세금과공과", "이자비용", "수수료", "기타"] @@ -132,10 +132,10 @@ "name": "체크박스 선택 후 계정과목명 일괄변경", "description": "테이블 행 선택 후 계정과목명 일괄변경 저장", "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": "저장 버튼 클릭" } ], "expect": { "dialog": "확인 다이얼로그 표시", @@ -174,7 +174,7 @@ "name": "출금 상세 페이지 이동", "description": "테이블 행 클릭하여 상세 페이지로 이동", "actions": [ - { "type": "click", "target": "테이블 첫 번째 행", "description": "행 클릭 (체크박스 제외 영역)" } + { "type": "click_if_exists", "target": "테이블 첫 번째 행", "description": "행 클릭 (체크박스 제외 영역)" } ], "expect": { "url": "/accounting/withdrawals/{id}", @@ -229,7 +229,7 @@ "name": "거래처 드롭다운 옵션 확인", "description": "거래처 선택 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "거래처 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "거래처 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["거래처테스트", "아크더레드", "코브라브릿지", "가우스전자", "아크아크"], @@ -241,7 +241,7 @@ "name": "출금 유형 드롭다운 옵션 확인", "description": "출금 유형 선택 드롭다운 옵션 검증", "actions": [ - { "type": "click", "target": "출금 유형 드롭다운", "description": "드롭다운 열기" } + { "type": "click_if_exists", "target": "출금 유형 드롭다운", "description": "드롭다운 열기" } ], "expect": { "options": ["미설정", "매입대금", "급여", "임차료", "수도광열비", "통신비", "소모품비", "운반비", "차량유지비", "보험료", "세금과공과", "이자비용", "수수료", "기타"] @@ -257,10 +257,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": "매입대금 선택" } ] }, { @@ -335,7 +335,7 @@ "name": "날짜 필터 검증", "description": "날짜 필터 버튼 동작 확인", "actions": [ - { "type": "click", "target": "당해년도", "description": "당해년도 버튼 클릭" } + { "type": "click_if_exists", "target": "당해년도", "description": "당해년도 버튼 클릭" } ], "expect": { "dateRange": {