- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동 - 스크린샷을 screenshots/ 폴더로 이동 - 백업 파일 보존 (.backup) - 처방 관련 추가 스크립트 포함 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
134 lines
5.4 KiB
Python
134 lines
5.4 KiB
Python
#!/usr/bin/env python3
|
|
"""JavaScript 디버깅을 위한 Playwright 테스트"""
|
|
|
|
import asyncio
|
|
from playwright.async_api import async_playwright
|
|
|
|
async def debug_herb_info():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True)
|
|
page = await browser.new_page()
|
|
|
|
# 콘솔 메시지 캡처
|
|
console_messages = []
|
|
page.on("console", lambda msg: console_messages.append({
|
|
"type": msg.type,
|
|
"text": msg.text,
|
|
"args": msg.args
|
|
}))
|
|
|
|
# 네트워크 요청 캡처
|
|
network_requests = []
|
|
page.on("request", lambda req: network_requests.append({
|
|
"url": req.url,
|
|
"method": req.method
|
|
}))
|
|
|
|
# 네트워크 응답 캡처
|
|
network_responses = []
|
|
async def log_response(response):
|
|
if "/api/" in response.url:
|
|
try:
|
|
body = await response.text()
|
|
network_responses.append({
|
|
"url": response.url,
|
|
"status": response.status,
|
|
"body": body[:200] if body else None
|
|
})
|
|
except:
|
|
pass
|
|
page.on("response", log_response)
|
|
|
|
try:
|
|
# 페이지 접속
|
|
print("페이지 접속 중...")
|
|
await page.goto("http://localhost:5001")
|
|
await page.wait_for_load_state("networkidle")
|
|
|
|
# JavaScript 실행하여 직접 함수 호출
|
|
print("\n직접 JavaScript 함수 테스트...")
|
|
|
|
# loadHerbInfo 함수 존재 확인
|
|
has_function = await page.evaluate("typeof loadHerbInfo === 'function'")
|
|
print(f"1. loadHerbInfo 함수 존재: {has_function}")
|
|
|
|
# loadAllHerbsInfo 함수 존재 확인
|
|
has_all_herbs = await page.evaluate("typeof loadAllHerbsInfo === 'function'")
|
|
print(f"2. loadAllHerbsInfo 함수 존재: {has_all_herbs}")
|
|
|
|
# displayHerbCards 함수 존재 확인
|
|
has_display = await page.evaluate("typeof displayHerbCards === 'function'")
|
|
print(f"3. displayHerbCards 함수 존재: {has_display}")
|
|
|
|
# 약재 정보 페이지로 이동
|
|
await page.click('a[data-page="herb-info"]')
|
|
await page.wait_for_timeout(2000)
|
|
|
|
# herbInfoGrid 요소 확인
|
|
grid_exists = await page.evaluate("document.getElementById('herbInfoGrid') !== null")
|
|
print(f"4. herbInfoGrid 요소 존재: {grid_exists}")
|
|
|
|
# herbInfoGrid 내용 확인
|
|
grid_html = await page.evaluate("document.getElementById('herbInfoGrid')?.innerHTML || 'EMPTY'")
|
|
print(f"5. herbInfoGrid 내용 길이: {len(grid_html)} 문자")
|
|
if grid_html and grid_html != 'EMPTY':
|
|
print(f" 처음 100자: {grid_html[:100]}...")
|
|
|
|
# API 호출 직접 테스트
|
|
print("\n\nAPI 응답 직접 테스트...")
|
|
api_response = await page.evaluate("""
|
|
fetch('/api/herbs/masters')
|
|
.then(res => res.json())
|
|
.then(data => ({
|
|
success: data.success,
|
|
dataLength: data.data ? data.data.length : 0,
|
|
firstItem: data.data ? data.data[0] : null
|
|
}))
|
|
.catch(err => ({ error: err.toString() }))
|
|
""")
|
|
print(f"API 응답: {api_response}")
|
|
|
|
# displayHerbCards 직접 호출 테스트
|
|
if api_response.get('dataLength', 0) > 0:
|
|
print("\n\ndisplayHerbCards 직접 호출...")
|
|
await page.evaluate("""
|
|
fetch('/api/herbs/masters')
|
|
.then(res => res.json())
|
|
.then(data => {
|
|
if (typeof displayHerbCards === 'function') {
|
|
displayHerbCards(data.data);
|
|
} else {
|
|
console.error('displayHerbCards 함수가 없습니다');
|
|
}
|
|
})
|
|
""")
|
|
await page.wait_for_timeout(1000)
|
|
|
|
# 다시 확인
|
|
grid_html_after = await page.evaluate("document.getElementById('herbInfoGrid')?.innerHTML || 'EMPTY'")
|
|
print(f"displayHerbCards 호출 후 내용 길이: {len(grid_html_after)} 문자")
|
|
|
|
card_count = await page.evaluate("document.querySelectorAll('.herb-card').length")
|
|
print(f"herb-card 요소 개수: {card_count}")
|
|
|
|
# 콘솔 메시지 출력
|
|
print("\n\n=== 콘솔 메시지 ===")
|
|
for msg in console_messages:
|
|
if 'error' in msg['type'].lower():
|
|
print(f"❌ {msg['type']}: {msg['text']}")
|
|
else:
|
|
print(f"📝 {msg['type']}: {msg['text']}")
|
|
|
|
# API 응답 상태 확인
|
|
print("\n\n=== API 응답 ===")
|
|
for resp in network_responses:
|
|
if '/api/herbs/masters' in resp['url']:
|
|
print(f"URL: {resp['url']}")
|
|
print(f"상태: {resp['status']}")
|
|
print(f"응답: {resp['body'][:100] if resp['body'] else 'No body'}")
|
|
|
|
finally:
|
|
await browser.close()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(debug_herb_info()) |