fix: 급여 장기요양 셀렉터 수정(label→span) + 달력 토스트 스텝 제거

- hr-salary-long-term-care: steps 8,9,13,14 셀렉터를 label→span으로 변경, container를 [class*=field]→[class*=flex]로 변경 (실제 DOM 구조 반영)
- settings-calendar-crud: toast verify steps 3개 제거 (Server Actions는 토스트 미사용), 19→16 스텝
This commit is contained in:
김보곤
2026-03-05 21:51:41 +09:00
parent b95f7fc132
commit 4b5bf7a873
2 changed files with 16 additions and 39 deletions

View File

@@ -1,13 +1,13 @@
{
"id": "settings-calendar-crud",
"name": "달력 일정 CRUD 테스트",
"version": "3.2.0",
"version": "3.3.0",
"enabled": true,
"screenshotPolicy": {
"captureOnFail": true,
"captureOnPass": false
},
"description": "설정 > 달력관리 메뉴의 달력 일정 등록/조회/수정/삭제 전체 CRUD (Server Actions POST 방식)",
"description": "설정 > 달력관리 메뉴의 달력 일정 등록/조회/수정/삭제 전체 CRUD (Server Actions POST 방식, 토스트 미사용)",
"baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": {
"level1": "설정",
@@ -66,27 +66,20 @@
},
{
"id": 7,
"name": "[CREATE] 등록 토스트 확인",
"phase": "CREATE",
"action": "verify_toast",
"verify": { "contains": "등록|완료|성공" }
},
{
"id": 8,
"name": "[CREATE] API POST 검증 (Server Action)",
"phase": "CREATE",
"action": "evaluate",
"script": "(()=>{try{const apiData=window.__E2E__?window.__E2E__.getApiLogs():{logs:[]};const logs=apiData.logs||[];const posts=logs.filter(l=>l.method==='POST'&&(l.url.includes('calendar')||l.url.includes('schedule'))&&l.status>=200&&l.status<300);if(posts.length>0){return JSON.stringify({ok:true,info:'pass: ServerAction POST ×'+posts.length+' status='+posts[posts.length-1].status});}const allPosts=logs.filter(l=>l.method==='POST'&&l.ok);if(allPosts.length>0){return JSON.stringify({ok:true,info:'pass: POST calls='+allPosts.length+' (ServerAction pattern)'});}return JSON.stringify({ok:true,info:'warn: no POST captured (apiLogs='+logs.length+')'});}catch(e){return JSON.stringify({ok:true,info:'warn: API check error: '+e.message});}})()"
},
{
"id": 9,
"id": 8,
"name": "[CREATE] 모달 닫힘 확인 + 목록 새로고침",
"phase": "CREATE",
"action": "evaluate",
"script": "(async()=>{const w=ms=>new Promise(r=>setTimeout(r,ms));const isVis=el=>!!el&&el.getBoundingClientRect().width>0;const R={phase:'MODAL_CHECK'};await w(1000);const modal=document.querySelector('[role=\"dialog\"]');if(isVis(modal)){const closeBtn=Array.from(modal.querySelectorAll('button')).find(b=>/닫기|취소|Close/.test(b.innerText?.trim()));if(closeBtn){closeBtn.click();await w(500);}R.wasClosed=true;}R.ok=true;return JSON.stringify(R);})()"
},
{
"id": 10,
"id": 9,
"name": "[CREATE] 목록에서 등록 결과 확인",
"phase": "CREATE",
"action": "evaluate",
@@ -94,7 +87,7 @@
"timeout": 10000
},
{
"id": 11,
"id": 10,
"name": "[UPDATE] E2E 일정 행 클릭 → 다이얼로그 열기 → 수정 → 저장 (통합)",
"phase": "UPDATE",
"action": "evaluate",
@@ -102,29 +95,21 @@
"timeout": 25000
},
{
"id": 12,
"name": "[UPDATE] 수정 토스트 확인 (Server Action: 토스트 없을 수 있음)",
"phase": "UPDATE",
"action": "verify_toast",
"verify": { "contains": "수정|완료|성공" },
"critical": false
},
{
"id": 13,
"id": 11,
"name": "[UPDATE] API 수정 검증 (Server Action)",
"phase": "UPDATE",
"action": "evaluate",
"script": "(()=>{try{const apiData=window.__E2E__?window.__E2E__.getApiLogs():{logs:[]};const logs=apiData.logs||[];const posts=logs.filter(l=>l.method==='POST'&&(l.url.includes('calendar')||l.url.includes('schedule'))&&l.ok);return JSON.stringify({ok:true,info:'pass: ServerAction calls='+posts.length+' total='+logs.length});}catch(e){return JSON.stringify({ok:true,info:'warn: '+e.message});}})()"
},
{
"id": 14,
"id": 12,
"name": "[UPDATE] 모달 닫힘 확인",
"phase": "UPDATE",
"action": "evaluate",
"script": "(async()=>{const w=ms=>new Promise(r=>setTimeout(r,ms));const isVis=el=>!!el&&el.getBoundingClientRect().width>0;await w(500);const modal=document.querySelector('[role=\"dialog\"],[data-state=\"open\"][class*=\"Sheet\"]');if(isVis(modal)){const closeBtn=Array.from(modal.querySelectorAll('button')).find(b=>/닫기|취소|Close/.test(b.innerText?.trim()));if(closeBtn){closeBtn.click();await w(500);}}return JSON.stringify({ok:true,phase:'MODAL_CLOSE'});})()"
},
{
"id": 15,
"id": 13,
"name": "[DELETE] E2E 수정일정 행 클릭 → 삭제 (통합)",
"phase": "DELETE",
"action": "evaluate",
@@ -133,22 +118,14 @@
"critical": false
},
{
"id": 16,
"name": "[DELETE] 삭제 토스트 확인 (Server Action: 토스트 없을 수 있음)",
"phase": "DELETE",
"action": "verify_toast",
"verify": { "contains": "삭제|완료|성공" },
"critical": false
},
{
"id": 17,
"id": 14,
"name": "[DELETE] API 삭제 검증 (Server Action)",
"phase": "DELETE",
"action": "evaluate",
"script": "(()=>{try{const apiData=window.__E2E__?window.__E2E__.getApiLogs():{logs:[]};const logs=apiData.logs||[];const posts=logs.filter(l=>l.method==='POST'&&(l.url.includes('calendar')||l.url.includes('schedule'))&&l.ok);return JSON.stringify({ok:true,info:'pass: ServerAction calls='+posts.length+' total='+logs.length});}catch(e){return JSON.stringify({ok:true,info:'warn: '+e.message});}})()"
},
{
"id": 18,
"id": 15,
"name": "[DELETE] 목록에서 삭제 확인",
"phase": "DELETE",
"action": "evaluate",
@@ -156,7 +133,7 @@
"timeout": 10000
},
{
"id": 19,
"id": 16,
"name": "[SUMMARY] API 호출 통계",
"action": "evaluate",
"script": "(()=>{try{const apiData=window.__E2E__?window.__E2E__.getApiLogs():{logs:[]};const logs=apiData.logs||[];const cal=logs.filter(l=>l.url.includes('calendar')||l.url.includes('schedule'));return JSON.stringify({ok:true,info:'API total='+logs.length+' calendar='+cal.length+' POST='+cal.filter(l=>l.method==='POST').length+' success='+cal.filter(l=>l.ok).length});}catch(e){return JSON.stringify({ok:true,info:'API summary error: '+e.message});}})()"