feat: 根目录文档、脚本、gitignore

This commit is contained in:
2026-10-08 16:15:33 +08:00
commit e98660ce4e
284 changed files with 26838 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
# -*- coding: utf-8 -*-
"""页面级联调验证(playwright + 系统 Chrome headless)"""
import io, sys, time, json
from playwright.sync_api import sync_playwright
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
BASE = 'http://localhost:8088'
token = io.open('tmp/pw_token.txt', encoding='utf-8').read().strip()
STORY_ID = 6566 # 研发需求(有冒烟数据:pass 审查状态)
USERSTORY_ID = 324 # 用户需求
MEETING_ID = 75 # 会议
checks = []
def check(name, ok, note=''):
checks.append((name, ok, note))
print(('PASS ' if ok else 'FAIL ') + name + (' | ' + note if note else ''))
with sync_playwright() as p:
browser = p.chromium.launch(channel='chrome', headless=True, args=['--disable-gpu'])
page = browser.new_page(viewport={'width': 1500, 'height': 950})
page.on('console', lambda m: None)
# 真实 UI 登录(store.token 不从 localStorage 初始化,必须走 doLogin)
page.goto(BASE, wait_until='domcontentloaded')
page.wait_for_timeout(2500)
page.locator('input[placeholder="用户名"]').fill('admin')
page.locator('input[placeholder="密码"]').fill('123456')
page.locator('text="登录"').first.click()
page.wait_for_timeout(6000)
check('登录跳转', '/login' not in page.url, page.url[-40:])
# 1) 研发需求详情页
page.goto(f'{BASE}/#/product-story-info/{STORY_ID}', wait_until='domcontentloaded')
page.wait_for_timeout(6000)
text = page.inner_text('body')
check('研发详情-需求ID区块', '需求 ID' in text or '需求ID' in text)
check('研发详情-AI指标区块', 'AI 指标' in text or 'AI指标' in text or '功能点数' in text)
check('研发详情-代码审查报告区块', '代码审查报告' in text)
check('研发详情-审查状态pass显示', 'pass' in text or '通过' in text)
check('研发详情-提交测试报告区块', '提交测试报告' in text)
check('研发详情-工作日志区块', '工作日志' in text)
check('研发详情-测试用例区块', '测试用例' in text)
page.screenshot(path='tmp/pw_story_detail.png', full_page=False)
# 点击审查报告里的在线查看(如存在)
try:
btn = page.locator('text=在线查看').first
if btn.count() > 0:
btn.click()
page.wait_for_timeout(3000)
dlg_txt = page.inner_text('body')
check('MD在线渲染(审查报告)', 'AI 代码审查报告' in dlg_txt or '审查事项' in dlg_txt)
page.screenshot(path='tmp/pw_mdpreview.png', full_page=False)
page.keyboard.press('Escape')
except Exception as e:
check('MD在线渲染(审查报告)', False, str(e)[:80])
# 2) 用户需求详情-需求讨论会议 tab
page.goto(f'{BASE}/#/product-user-story-info/{USERSTORY_ID}', wait_until='domcontentloaded')
page.wait_for_timeout(5000)
try:
tab = page.locator('text=需求讨论会议').first
check('用户需求-会议tab存在', tab.count() > 0)
if tab.count() > 0:
tab.click()
page.wait_for_timeout(3000)
except Exception as e:
check('用户需求-会议tab存在', False, str(e)[:80])
page.screenshot(path='tmp/pw_userstory_tab.png', full_page=False)
# 3) 会议纪要详情页
page.goto(f'{BASE}/#/product-meeting-info/{MEETING_ID}', wait_until='domcontentloaded')
page.wait_for_timeout(5000)
text3 = page.inner_text('body')
check('会议详情-附件区块', '附件' in text3)
page.screenshot(path='tmp/pw_meeting.png', full_page=False)
browser.close()
failed = [c for c in checks if not c[1]]
print(f'\n== 汇总: {len(checks)-len(failed)}/{len(checks)} 通过 ==')
for c in failed:
print(' 未过:', c[0], c[2])