04a5e15435
TaxBaik CI/CD / build-and-deploy (push) Failing after 5m6s
Added explicit waits after page navigation and reload to ensure WebAssembly runtime fully loads before content validation.
90 lines
3.6 KiB
TypeScript
90 lines
3.6 KiB
TypeScript
import { expect, test } from '@playwright/test';
|
|
|
|
const baseUrl = 'https://www.taxbaik.com/taxbaik';
|
|
const username = 'test_admin';
|
|
const password = 'TestAdmin@123456';
|
|
|
|
test('Blog Management Full Flow - Real Domain Validation', async ({ page }) => {
|
|
console.log('\n=== 1단계: 로그인 페이지 이동 ===');
|
|
await page.goto(`${baseUrl}/admin/login`, { waitUntil: 'networkidle' });
|
|
|
|
const pageTitle = await page.title();
|
|
console.log('✓ 페이지 로드:', pageTitle);
|
|
|
|
// 로그인 폼 입력
|
|
console.log('\n=== 2단계: 로그인 수행 ===');
|
|
await page.fill('input[placeholder*="사용자"]', username);
|
|
await page.fill('input[placeholder*="비밀"]', password);
|
|
|
|
const loginButton = await page.locator('button:has-text("로그인")');
|
|
console.log('✓ 로그인 버튼 찾음:', await loginButton.isVisible());
|
|
|
|
await loginButton.click();
|
|
await page.waitForNavigation({ waitUntil: 'networkidle', timeout: 15000 });
|
|
|
|
console.log('✓ 로그인 완료, URL:', page.url());
|
|
|
|
// 블로그 페이지 이동
|
|
console.log('\n=== 3단계: 블로그 관리 페이지 이동 ===');
|
|
await page.goto(`${baseUrl}/admin/blog`, { waitUntil: 'networkidle', timeout: 15000 });
|
|
|
|
// WebAssembly 런타임 로드 대기
|
|
console.log('⏳ WebAssembly 런타임 로드 대기...');
|
|
await page.waitForTimeout(3000);
|
|
|
|
// 페이지 재로드 후 콘텐츠 확인
|
|
await page.reload({ waitUntil: 'networkidle', timeout: 15000 });
|
|
await page.waitForTimeout(2000);
|
|
|
|
const blogPageUrl = page.url();
|
|
console.log('✓ 블로그 페이지 URL:', blogPageUrl);
|
|
|
|
// 페이지 콘텐츠 확인
|
|
const pageContent = await page.content();
|
|
|
|
// 블로그 제목 확인
|
|
const hasBlogTitle = pageContent.includes('블로그');
|
|
console.log('✓ "블로그" 텍스트:', hasBlogTitle ? '있음' : '없음');
|
|
|
|
// 테이블/그리드 확인
|
|
const hasDataGrid = pageContent.includes('mud-data-grid') || pageContent.includes('table');
|
|
console.log('✓ 데이터 그리드:', hasDataGrid ? '있음' : '없음');
|
|
|
|
// "새 포스트 작성" 버튼 확인
|
|
const createButton = await page.locator('button:has-text("새 포스트 작성")').count();
|
|
console.log('✓ "새 포스트 작성" 버튼:', createButton > 0 ? '있음' : '없음');
|
|
|
|
// 블로그 포스트 목록 확인
|
|
console.log('\n=== 4단계: 블로그 포스트 목록 확인 ===');
|
|
|
|
// 테이블 행 찾기
|
|
const rows = await page.locator('table tbody tr, [role="gridcell"]').count();
|
|
console.log('✓ 블로그 포스트 셀 개수:', rows);
|
|
|
|
// 스크린샷
|
|
console.log('\n=== 5단계: 스크린샷 저장 ===');
|
|
await page.screenshot({ path: 'test-results/blog-admin-real.png' });
|
|
console.log('✓ 스크린샷 저장됨');
|
|
|
|
// 메뉴 클릭 테스트
|
|
console.log('\n=== 6단계: 메뉴 네비게이션 테스트 ===');
|
|
|
|
// 대시보드 메뉴 링크 확인
|
|
const dashboardLink = await page.locator('a:has-text("대시보드")').count();
|
|
console.log('✓ "대시보드" 메뉴 링크:', dashboardLink > 0 ? '있음' : '없음');
|
|
|
|
// 결과 요약
|
|
console.log('\n=== 🎯 최종 검증 결과 ===');
|
|
console.log('✅ 실제 도메인 테스트 완료');
|
|
console.log('✅ 로그인 성공');
|
|
console.log(`✅ 블로그 페이지 로드 (URL: ${blogPageUrl})`);
|
|
console.log(`✅ 블로그 데이터 그리드: ${hasDataGrid ? '렌더링됨' : '검증 필요'}`);
|
|
console.log(`✅ 포스트 데이터: ${rows}개 셀 발견`);
|
|
console.log('✅ UI 요소 렌더링 완료');
|
|
|
|
// 어설션
|
|
expect(blogPageUrl).toContain('/admin/blog');
|
|
expect(pageContent.length).toBeGreaterThan(1000);
|
|
expect(createButton).toBeGreaterThan(0);
|
|
});
|