_v2.mjs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { chromium } from 'playwright';
  2. const b = await chromium.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe' });
  3. const ctx = await b.newContext({ viewport: { width: 1440, height: 900 } });
  4. const p = await ctx.newPage();
  5. const errs = [];
  6. p.on('pageerror', e => errs.push(e.message.slice(0,120)));
  7. p.on('console', m => { if (m.type()==='error') errs.push(m.text().slice(0,120)); });
  8. const clear = () => p.evaluate(() => document.querySelectorAll('vite-error-overlay').forEach(e=>e.remove()));
  9. // 登录页(新版落地页)
  10. await p.goto('http://localhost:4200/login', { waitUntil: 'networkidle' });
  11. await clear(); await p.waitForTimeout(1500);
  12. await p.screenshot({ path: '../../.shots/v2-login.png' });
  13. const loginProbe = await p.evaluate(() => ({
  14. landing: !!document.querySelector('.landing'),
  15. landingHidden: !!document.querySelector('.landing') && getComputedStyle(document.querySelector('.landing')).display === 'none',
  16. cards: document.querySelectorAll('.lp-card').length,
  17. inputs: document.querySelectorAll('ui-input').length,
  18. }));
  19. console.log('=== 登录页 ==='); console.log(JSON.stringify(loginProbe));
  20. await p.fill('ui-input input >> nth=0', '13800138000');
  21. await p.fill('ui-input input >> nth=1', '123456');
  22. await p.click('button[type="submit"], ui-button button');
  23. await p.waitForTimeout(3000);
  24. console.log('登录后:', p.url());
  25. // 「我的」页:配色缩略图 + 使用端是否移除
  26. await p.goto('http://localhost:4200/desktop/mine', { waitUntil: 'networkidle' });
  27. await clear(); await p.waitForTimeout(2000);
  28. await p.screenshot({ path: '../../.shots/v2-mine.png' });
  29. const mineProbe = await p.evaluate(() => {
  30. const thumbs = [...document.querySelectorAll('.thumb')].map(t => {
  31. const nav = t.querySelector('.thumb-nav');
  32. const main = t.querySelector('.thumb-main');
  33. return {
  34. palette: t.getAttribute('data-preview-palette'),
  35. navBg: nav ? getComputedStyle(nav).backgroundColor : null,
  36. mainBg: main ? getComputedStyle(main).backgroundColor : null,
  37. };
  38. });
  39. return {
  40. thumbs,
  41. hasUsageSection: /使用端/.test(document.body.innerText),
  42. hasAutoDetect: /恢复自动识别/.test(document.body.innerText),
  43. };
  44. });
  45. console.log('\n=== 我的页 ===');
  46. console.log('配色缩略图(每格应是不同色):');
  47. mineProbe.thumbs.forEach(t => console.log(` ${(t.palette||'').padEnd(10)} nav=${t.navBg} main=${t.mainBg}`));
  48. console.log(`「使用端」区块存在: ${mineProbe.hasUsageSection} 「恢复自动识别」存在: ${mineProbe.hasAutoDetect}`);
  49. console.log(errs.length ? '\n⚠ '+errs.slice(0,2).join(' | ') : '\n✅ 无控制台错误');
  50. await b.close();