/** * 对照实验:不注入任何 localStorage,直接访问远程 SPA * 目的:判断"启动即崩"是部署本身的 bug,还是测试注入方式触发 * 流程: * 1. /admin/login → 登录页应正常渲染(不依赖 token) * 2. /admin/dashboard → 无 token 应重定向 /login * 3. UI 真实登录(填账号密码 + 滑块)→ 看登录后是否也崩 */ const { test, expect } = require('@playwright/test'); var BASE_URL = 'http://cfc.iwintrue.com'; test('CONTROL: 无注入访问 login + dashboard', async ({ page }) => { var consoleMessages = []; var pageErrors = []; page.on('console', function (msg) { consoleMessages.push('[' + msg.type() + '] ' + msg.text().substring(0, 200)); }); page.on('pageerror', function (err) { pageErrors.push(String(err) + '\nSTACK: ' + (err.stack || '').substring(0, 400)); }); // --- 1. login 页 --- await page.goto(BASE_URL + '/admin/login', { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForTimeout(6000); console.log('STEP1_LOGIN URL=' + page.url()); var loginHtml = await page.evaluate(function () { var app = document.getElementById('app'); return app ? app.innerHTML.substring(0, 400) : 'NO #app'; }); console.log('STEP1_LOGIN APP_HTML=' + loginHtml); var loginVisible = await page.locator('.login-container, .el-form, input[type=password]').count(); console.log('STEP1_LOGIN_FORM_ELTS=' + loginVisible); await page.screenshot({ path: 'test-artifacts/control-1-login.png' }); // --- 2. dashboard 无 token --- await page.goto(BASE_URL + '/admin/dashboard', { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForTimeout(6000); console.log('STEP2_DASH URL=' + page.url()); await page.screenshot({ path: 'test-artifacts/control-2-dashboard-notoken.png' }); // --- 3. UI 真实登录 --- var inputCount = await page.locator('input').count(); console.log('STEP3_INPUT_COUNT=' + inputCount); // 若在登录页,尝试填表 var hasPhone = await page.locator('input[placeholder*="手机"], input[placeholder*="账号"], input[type=text]').first().isVisible().catch(function () { return false; }); console.log('STEP3_HAS_INPUT=' + hasPhone); if (await page.locator('input').count() > 0) { var inputs = page.locator('input'); var n = await inputs.count(); for (var k = 0; k < n; k++) { console.log('INPUT_' + k + ' placeholder=' + await inputs.nth(k).getAttribute('placeholder')); } } await page.screenshot({ path: 'test-artifacts/control-3-login-form.png' }); console.log('--- PAGE ERRORS (' + pageErrors.length + ') ---'); pageErrors.forEach(function (e) { console.log('ERR: ' + e.substring(0, 500)); }); console.log('--- CONSOLE (' + consoleMessages.length + ') ---'); consoleMessages.forEach(function (m) { console.log('CON: ' + m.substring(0, 300)); }); expect(true).toBeTruthy(); });