revert: Round 5 롤백 - 브라우저 크래시 문제로 복원

This commit is contained in:
김보곤
2026-02-06 00:39:28 +09:00
parent d23454d573
commit 701e05ab59
83 changed files with 1262 additions and 2611 deletions

View File

@@ -3,25 +3,14 @@
"name": "자유게시판 E2E 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
},
"description": "자유게시판의 목록, 게시글 작성, 상세, 수정, 삭제, 댓글 CRUD 전체 워크플로우 테스트",
"url": "/ko/boards/free",
"navigation": {
"targetUrl": "/boards/free",
"urlPattern": "/boards/free|/ko/boards/free",
"menuHints": [
"자유게시판",
"자유 게시판",
"게시판"
]
"menuHints": ["자유게시판", "자유 게시판", "게시판"]
},
"menuNavigation": {
"level1": "게시판",
@@ -59,10 +48,7 @@
"type": "evaluate",
"script": "document.querySelector('.sidebar-scroll, [data-sidebar=\"content\"], nav')?.scrollTo({top: 0, behavior: 'instant'})"
},
{
"type": "wait",
"duration": 300
},
{ "type": "wait", "duration": 300 },
{
"type": "evaluate",
"script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()"
@@ -86,7 +72,7 @@
"scrollStep": 200
},
{
"type": "click_if_exists",
"type": "click",
"target": "게시판"
},
{
@@ -94,7 +80,7 @@
"duration": 500
},
{
"type": "click_if_exists",
"type": "click",
"target": "자유게시판"
},
{
@@ -104,25 +90,15 @@
],
"verification": {
"title_contains": "자유게시판",
"elements": [
"table",
"button:has-text('글쓰기')"
]
"elements": ["table", "button:has-text('글쓰기')"]
}
},
{
"step": 2,
"name": "초기 게시글 목록 확인",
"action": "verify_detail",
"action": "verify_table_structure",
"verification": {
"columns": [
"No.",
"제목",
"작성자",
"조회수",
"상태",
"등록일"
],
"columns": ["No.", "제목", "작성자", "조회수", "상태", "등록일"],
"min_rows": 0
}
},
@@ -173,7 +149,7 @@
{
"step": 8,
"name": "검색 테스트 (제목)",
"action": "click_if_exists",
"action": "fill_and_wait",
"target": "input[placeholder*='제목']",
"value": "테스트",
"verification": {
@@ -183,7 +159,7 @@
{
"step": 9,
"name": "검색 결과 확인",
"action": "verify_detail",
"action": "verify_table_data",
"verification": {
"filtered": true
}
@@ -191,7 +167,7 @@
{
"step": 10,
"name": "검색어 초기화",
"action": "click_if_exists",
"action": "fill",
"target": "input[placeholder*='제목']",
"value": ""
},
@@ -232,7 +208,7 @@
{
"step": 15,
"name": "글쓰기 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('글쓰기')"
},
{
@@ -267,14 +243,14 @@
{
"step": 19,
"name": "게시글 제목 입력",
"action": "click_if_exists",
"action": "fill",
"target": "input#title",
"value": "E2E 테스트 게시글"
},
{
"step": 20,
"name": "게시글 내용 입력",
"action": "click_if_exists",
"action": "fill",
"target": "textarea#content",
"value": "이것은 E2E 자동화 테스트를 위한 게시글입니다."
},
@@ -287,7 +263,7 @@
{
"step": 22,
"name": "게시글 등록 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('등록')"
},
{
@@ -375,14 +351,14 @@
{
"step": 32,
"name": "첫 번째 댓글 작성",
"action": "click_if_exists",
"action": "fill",
"target": "textarea[placeholder*='댓글']",
"value": "첫 번째 테스트 댓글입니다."
},
{
"step": 33,
"name": "댓글 등록 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('댓글 등록'), button:has-text('등록')"
},
{
@@ -403,14 +379,14 @@
{
"step": 36,
"name": "두 번째 댓글 작성",
"action": "click_if_exists",
"action": "fill",
"target": "textarea[placeholder*='댓글']",
"value": "두 번째 테스트 댓글입니다."
},
{
"step": 37,
"name": "두 번째 댓글 등록",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('댓글 등록'), button:has-text('등록')"
},
{
@@ -431,10 +407,7 @@
"type": "evaluate",
"script": "(function(){ var allBtns = Array.from(document.querySelectorAll('button')).filter(function(b){ return b.innerText && b.innerText.trim() === '수정'; }); var commentBtn = allBtns.filter(function(b){ return b.closest('[class*=\"comment\"], [class*=\"Comment\"], [class*=\"reply\"]'); }); if(commentBtn.length > 0){ commentBtn[0].click(); return 'clicked comment edit btn'; } if(allBtns.length >= 2){ allBtns[allBtns.length - 1].click(); return 'clicked last edit btn (assumed comment)'; } return 'no comment edit btn found'; })()"
},
{
"type": "wait",
"duration": 1000
}
{ "type": "wait", "duration": 1000 }
]
},
{
@@ -456,10 +429,7 @@
"type": "evaluate",
"script": "(function(){ var btn = Array.from(document.querySelectorAll('button')).find(function(b){ return b.innerText && (b.innerText.includes('저장') || b.innerText.includes('수정 완료') || b.innerText.includes('확인')); }); if(btn){ btn.click(); return 'save clicked'; } return 'save btn not found'; })()"
},
{
"type": "wait",
"duration": 1500
}
{ "type": "wait", "duration": 1500 }
]
},
{
@@ -477,10 +447,7 @@
"type": "evaluate",
"script": "(function(){ var allBtns = Array.from(document.querySelectorAll('button')).filter(function(b){ return b.innerText && b.innerText.trim() === '삭제'; }); var commentBtns = allBtns.filter(function(b){ return b.closest('[class*=\"comment\"], [class*=\"Comment\"], [class*=\"reply\"]'); }); if(commentBtns.length > 0){ commentBtns[commentBtns.length-1].click(); return 'clicked last comment delete btn'; } if(allBtns.length >= 2){ allBtns[allBtns.length-1].click(); return 'clicked last delete btn (assumed comment)'; } return 'no comment delete btn found'; })()"
},
{
"type": "wait",
"duration": 500
}
{ "type": "wait", "duration": 500 }
]
},
{
@@ -491,10 +458,7 @@
"type": "evaluate",
"script": "(function(){ var dialog = document.querySelector('[role=\"dialog\"], [role=\"alertdialog\"], [class*=\"modal\"]:not([class*=\"tooltip\"])'); if(dialog && dialog.offsetParent !== null){ var confirmBtn = Array.from(dialog.querySelectorAll('button')).find(function(b){ return ['확인','삭제','예','OK','Yes'].some(function(t){ return b.innerText && b.innerText.includes(t); }); }); if(confirmBtn){ confirmBtn.click(); return 'confirmed delete dialog'; } } return 'no dialog or auto-handled'; })()"
},
{
"type": "wait",
"duration": 1500
}
{ "type": "wait", "duration": 1500 }
]
},
{
@@ -515,7 +479,7 @@
{
"step": 47,
"name": "게시글 수정 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('수정')"
},
{
@@ -538,14 +502,14 @@
{
"step": 50,
"name": "제목 수정",
"action": "click_if_exists",
"action": "fill",
"target": "input#title",
"value": "E2E 테스트 게시글 (수정됨)"
},
{
"step": 51,
"name": "내용 수정",
"action": "click_if_exists",
"action": "fill",
"target": "textarea#content",
"value": "수정된 내용입니다. E2E 자동화 테스트를 위한 게시글입니다."
},
@@ -558,7 +522,7 @@
{
"step": 53,
"name": "수정 저장 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button[type='submit']:has-text('저장'), button:has-text('수정')"
},
{
@@ -594,7 +558,7 @@
{
"step": 57,
"name": "목록으로 이동 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('목록으로')"
},
{
@@ -617,7 +581,7 @@
{
"step": 60,
"name": "게시글 클릭하여 상세 진입",
"action": "click_if_exists",
"action": "click",
"target": "text=E2E 테스트 게시글 (수정됨)"
},
{
@@ -641,7 +605,7 @@
{
"step": 63,
"name": "게시글 삭제 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('삭제')"
},
{
@@ -662,7 +626,7 @@
{
"step": 66,
"name": "삭제 확인 버튼 클릭",
"action": "click_if_exists",
"action": "click",
"target": "button:has-text('삭제'):last-of-type"
},
{
@@ -697,7 +661,7 @@
{
"step": 70,
"name": "콘솔 에러 확인",
"action": "verify_detail",
"action": "verify_console",
"verification": {
"no_errors": true
}