verify-online.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. # 浏览器走查: 登录 → 5 页(dashboard/recordings/logs/reports/pipeline) → 0 pageerror/console.error 断言
  3. # 环境: 需要 playwright + chromium(宿主机/带 GUI 环境);纯 Docker/无浏览器环境请改用 check-online.mjs(零依赖 12 项断言)
  4. # 环境变量: PLAYWRIGHT_BASE_URL(默认 https://recording.sh-lami.com)、SMARTBADGE_USERNAME、SMARTBADGE_PASSWORD(均必填)
  5. import asyncio
  6. import os
  7. import sys
  8. try:
  9. from playwright.async_api import async_playwright
  10. except ImportError:
  11. print('playwright 未安装。浏览器走查需在宿主机执行: pip install playwright && playwright install chromium')
  12. print('Docker/无浏览器环境请跳过本脚本,使用: node scripts/check-online.mjs')
  13. sys.exit(8)
  14. BASE = os.environ.get('PLAYWRIGHT_BASE_URL', 'https://recording.sh-lami.com/')
  15. USER = os.environ.get('SMARTBADGE_USERNAME') or sys.exit('缺少 SMARTBADGE_USERNAME(环境变量),不再有内置默认值')
  16. PASS = os.environ.get('SMARTBADGE_PASSWORD') or sys.exit('缺少 SMARTBADGE_PASSWORD(环境变量),不再有内置默认值')
  17. errors = []
  18. async def main():
  19. async with async_playwright() as p:
  20. browser = await p.chromium.launch()
  21. page = await browser.new_page()
  22. page.on('pageerror', lambda e: errors.append(f'PAGEERROR: {e}'))
  23. page.on('console', lambda m: errors.append(f'CONSOLE[{m.type}]: {m.text}') if m.type in ('error', 'warning') else None)
  24. await page.goto(BASE + 'login', wait_until='networkidle')
  25. await page.fill('input >> nth=0', USER)
  26. await page.fill('input >> nth=1', PASS)
  27. await page.click('button:has-text("登录"), button:has-text("登 录")')
  28. await page.wait_for_timeout(3000)
  29. await page.goto(BASE + 'dashboard', wait_until='networkidle')
  30. await page.wait_for_timeout(4000)
  31. print('dashboard url:', page.url, 'title:', await page.title())
  32. for path in ['recordings', 'logs', 'reports', 'pipeline']:
  33. await page.goto(BASE + path, wait_until='networkidle')
  34. await page.wait_for_timeout(4000)
  35. print(path, 'rows:', await page.locator('table tbody tr, .ui-table tbody tr, [role="row"]').count())
  36. await browser.close()
  37. asyncio.run(main())
  38. print('--- 错误捕获 ---')
  39. print('\n'.join(errors) if errors else '0 errors')
  40. raise SystemExit(1 if errors else 0)