frontend_markdown.html 2.5 KB

1234567891011121314151617181920212223242526
  1. <!doctype html>
  2. <html lang="zh-CN"><meta charset="utf-8"><title>Vue前端回归检查</title>
  3. <style>body{font:14px system-ui;background:#f5f7fa;color:#40566b;margin:24px}iframe{width:100%;height:760px;border:1px solid #dce4e9;border-radius:8px}pre{white-space:pre-wrap}.pass{color:#187b60}.fail{color:#b94f42}</style>
  4. <h1>Vue前端回归检查</h1><pre id="result">正在检查…</pre><iframe title="Frontend under test" src="/static/index.html"></iframe>
  5. <script>
  6. document.querySelector('iframe').addEventListener('load',async event=>{
  7. const frame=event.target.contentWindow, checks=[];
  8. const wait=async predicate=>{for(let n=0;n<100;n++){if(predicate())return;await new Promise(resolve=>setTimeout(resolve,50));}throw Error('页面加载超时');};
  9. const check=(condition,name)=>{if(!condition)throw Error(name);checks.push('PASS '+name);};
  10. try{
  11. await wait(()=>frame.document.querySelector('.session-button'));
  12. frame.document.querySelector('.session-button').click();
  13. await wait(()=>frame.document.querySelector('.markdown h1'));
  14. const doc=frame.document;
  15. check(doc.querySelector('.markdown h1').textContent==='Markdown 标题','Vue会话历史与Markdown标题');
  16. check(doc.querySelector('.markdown strong')?.textContent==='加粗' && doc.querySelector('.markdown em') && doc.querySelector('.markdown del'),'行内格式');
  17. check(doc.querySelector('.markdown ul ul li') && doc.querySelector('.markdown input:checked:disabled'),'嵌套列表与任务列表');
  18. check(doc.querySelector('.markdown blockquote') && doc.querySelector('.markdown-table table tbody td'),'引用与GFM表格');
  19. check(doc.querySelector('.markdown pre code')?.textContent.includes(' print("<hello>")'),'代码缩进与HTML原文');
  20. check(doc.querySelector('.markdown a')?.rel==='noopener noreferrer','外链属性');
  21. check(!doc.querySelector('.markdown script,.markdown style,.markdown svg,.markdown iframe,.markdown [onerror],.markdown [onload],.markdown a[href^="javascript:"]') && !frame.__xss,'HTML与危险URL清理');
  22. check([...doc.querySelectorAll('[role="tab"]')].some(tab=>tab.textContent.includes('智能体测试')),'智能体测试页入口');
  23. document.getElementById('result').className='pass';document.getElementById('result').textContent=checks.join('\n')+'\n\n'+checks.length+'项通过';
  24. }catch(error){document.getElementById('result').className='fail';document.getElementById('result').textContent=checks.join('\n')+'\nFAIL '+error.stack;}
  25. });
  26. </script></html>