115 lines
4.4 KiB
Python
115 lines
4.4 KiB
Python
"""
|
|
JRXML Agent E2E test — Playwright automation.
|
|
Tests: page load, upload image, send message, wait for response.
|
|
Usage: python test_e2e.py
|
|
Prerequisites: Servers must be running (start.bat or with_server.py)
|
|
"""
|
|
import os, sys, time, base64, tempfile
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
FRONTEND = "http://localhost:5173"
|
|
API = "http://localhost:8000"
|
|
TEST_IMAGE = r"D:\Idea Project\agent_jrxml\test_invoice_e2e.png"
|
|
|
|
def run():
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(headless=True)
|
|
page = browser.new_page(viewport={"width": 1280, "height": 900})
|
|
|
|
# Capture console errors
|
|
errors = []
|
|
page.on("console", lambda msg: errors.append(msg.text) if msg.type == "error" else None)
|
|
|
|
# 1. Navigate and wait
|
|
print("[1] Loading frontend...")
|
|
page.goto(FRONTEND, timeout=15000)
|
|
page.wait_for_load_state("networkidle")
|
|
page.wait_for_timeout(1000)
|
|
|
|
# Screenshot initial state
|
|
page.screenshot(path=r"D:\Idea Project\agent_jrxml\e2e_01_initial.png", full_page=True)
|
|
print(" Screenshot: e2e_01_initial.png")
|
|
|
|
# Verify sidebar loads
|
|
sidebar = page.locator(".sidebar")
|
|
assert sidebar.is_visible(), "Sidebar not visible"
|
|
print(" OK: Sidebar visible")
|
|
|
|
# 2. Create new session (click +)
|
|
print("[2] Creating new session...")
|
|
page.locator(".btn-icon").click()
|
|
page.wait_for_timeout(500)
|
|
page.screenshot(path=r"D:\Idea Project\agent_jrxml\e2e_02_session.png")
|
|
print(" OK: New session created")
|
|
|
|
# 3. Upload test image
|
|
print("[3] Uploading test image...")
|
|
upload_input = page.locator('input[type="file"]')
|
|
upload_input.set_input_files(TEST_IMAGE)
|
|
page.wait_for_timeout(500)
|
|
# Verify file chip appears
|
|
chip = page.locator(".chip").first
|
|
assert chip.is_visible(), "File chip not visible after upload"
|
|
print(f" OK: File chip visible — {chip.inner_text()}")
|
|
|
|
# 4. Type message and send
|
|
print('[4] Sending message...')
|
|
textarea = page.locator("textarea").first
|
|
textarea.fill("根据这张图片生成车历卡报表模板")
|
|
page.wait_for_timeout(200)
|
|
page.screenshot(path=r"D:\Idea Project\agent_jrxml\e2e_03_input.png")
|
|
|
|
# Click send button or press Enter
|
|
page.locator('button[type="submit"]').click()
|
|
print(" Sent!")
|
|
|
|
# 5. Wait for streaming response
|
|
print("[5] Waiting for AI response...")
|
|
try:
|
|
# Wait up to 3 minutes for a success or error message
|
|
page.wait_for_selector('.message.assistant', timeout=180000)
|
|
page.wait_for_timeout(2000)
|
|
page.screenshot(path=r"D:\Idea Project\agent_jrxml\e2e_04_response.png", full_page=True)
|
|
|
|
# Check for success/error
|
|
messages = page.locator('.message.assistant').all()
|
|
for m in messages:
|
|
text = m.inner_text()
|
|
if "成功" in text:
|
|
print(f" ✅ SUCCESS: {text[:100]}")
|
|
elif "失败" in text or "错误" in text:
|
|
print(f" ❌ ERROR: {text[:100]}")
|
|
elif "JRXML" in text:
|
|
print(f" 📄 JRXML generated ({len(text)} chars)")
|
|
except Exception as e:
|
|
page.screenshot(path=r"D:\Idea Project\agent_jrxml\e2e_04_timeout.png", full_page=True)
|
|
print(f" ⚠️ Timeout waiting for response: {e}")
|
|
|
|
# 6. Check download button
|
|
print("[6] Checking download button...")
|
|
download_btn = page.locator(".btn-download").first
|
|
if download_btn.is_visible():
|
|
text = download_btn.inner_text()
|
|
print(f" Download button: '{text}'")
|
|
if "暂无" not in text:
|
|
print(" ✅ Download link available!")
|
|
else:
|
|
print(" ⚠️ Download shows '暂无下载文件'")
|
|
else:
|
|
print(" ⚠️ Download button not found")
|
|
|
|
# Console errors
|
|
if errors:
|
|
print(f"\n[!] Console errors ({len(errors)}):")
|
|
for e in errors[:5]:
|
|
print(f" {e[:200]}")
|
|
else:
|
|
print("\n ✅ No console errors")
|
|
|
|
print("\n=== E2E test complete ===")
|
|
browser.close()
|
|
|
|
if __name__ == "__main__":
|
|
os.makedirs(r"D:\Idea Project\agent_jrxml", exist_ok=True)
|
|
run()
|