debug-control.spec.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * 对照实验:不注入任何 localStorage,直接访问远程 SPA
  3. * 目的:判断"启动即崩"是部署本身的 bug,还是测试注入方式触发
  4. * 流程:
  5. * 1. /admin/login → 登录页应正常渲染(不依赖 token)
  6. * 2. /admin/dashboard → 无 token 应重定向 /login
  7. * 3. UI 真实登录(填账号密码 + 滑块)→ 看登录后是否也崩
  8. */
  9. const { test, expect } = require('@playwright/test');
  10. var BASE_URL = 'http://cfc.iwintrue.com';
  11. test('CONTROL: 无注入访问 login + dashboard', async ({ page }) => {
  12. var consoleMessages = [];
  13. var pageErrors = [];
  14. page.on('console', function (msg) {
  15. consoleMessages.push('[' + msg.type() + '] ' + msg.text().substring(0, 200));
  16. });
  17. page.on('pageerror', function (err) {
  18. pageErrors.push(String(err) + '\nSTACK: ' + (err.stack || '').substring(0, 400));
  19. });
  20. // --- 1. login 页 ---
  21. await page.goto(BASE_URL + '/admin/login', { waitUntil: 'domcontentloaded', timeout: 60000 });
  22. await page.waitForTimeout(6000);
  23. console.log('STEP1_LOGIN URL=' + page.url());
  24. var loginHtml = await page.evaluate(function () {
  25. var app = document.getElementById('app');
  26. return app ? app.innerHTML.substring(0, 400) : 'NO #app';
  27. });
  28. console.log('STEP1_LOGIN APP_HTML=' + loginHtml);
  29. var loginVisible = await page.locator('.login-container, .el-form, input[type=password]').count();
  30. console.log('STEP1_LOGIN_FORM_ELTS=' + loginVisible);
  31. await page.screenshot({ path: 'test-artifacts/control-1-login.png' });
  32. // --- 2. dashboard 无 token ---
  33. await page.goto(BASE_URL + '/admin/dashboard', { waitUntil: 'domcontentloaded', timeout: 60000 });
  34. await page.waitForTimeout(6000);
  35. console.log('STEP2_DASH URL=' + page.url());
  36. await page.screenshot({ path: 'test-artifacts/control-2-dashboard-notoken.png' });
  37. // --- 3. UI 真实登录 ---
  38. var inputCount = await page.locator('input').count();
  39. console.log('STEP3_INPUT_COUNT=' + inputCount);
  40. // 若在登录页,尝试填表
  41. var hasPhone = await page.locator('input[placeholder*="手机"], input[placeholder*="账号"], input[type=text]').first().isVisible().catch(function () { return false; });
  42. console.log('STEP3_HAS_INPUT=' + hasPhone);
  43. if (await page.locator('input').count() > 0) {
  44. var inputs = page.locator('input');
  45. var n = await inputs.count();
  46. for (var k = 0; k < n; k++) {
  47. console.log('INPUT_' + k + ' placeholder=' + await inputs.nth(k).getAttribute('placeholder'));
  48. }
  49. }
  50. await page.screenshot({ path: 'test-artifacts/control-3-login-form.png' });
  51. console.log('--- PAGE ERRORS (' + pageErrors.length + ') ---');
  52. pageErrors.forEach(function (e) { console.log('ERR: ' + e.substring(0, 500)); });
  53. console.log('--- CONSOLE (' + consoleMessages.length + ') ---');
  54. consoleMessages.forEach(function (m) { console.log('CON: ' + m.substring(0, 300)); });
  55. expect(true).toBeTruthy();
  56. });