- download: desktop_download_apps SingleChildScrollView 加 primary:true (Scrollbar 缺 ScrollPosition) - contact-stores: checkDomainAvailability async 后 setState 加 mounted 保护 (dispose 后 setState) - buy-service: _loadData 加 data 结构校验 + mounted 保护 (API 400 无效参数时 data 为错误结构 -> RangeError)
52 lines
2.4 KiB
JavaScript
52 lines
2.4 KiB
JavaScript
// 探测 v2:正确加载 + 截图 + 检测 canvaskit 隐藏 input
|
||
const { chromium } = require('playwright');
|
||
const BASE = 'http://127.0.0.1:8099';
|
||
|
||
(async () => {
|
||
const browser = await chromium.launch({ headless: true });
|
||
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
||
const page = await ctx.newPage();
|
||
const logs = [];
|
||
page.on('pageerror', e => logs.push(`[PAGEERROR] ${e.message.slice(0, 120)}`));
|
||
|
||
console.log('=== 访问 /login (load 模式) ===');
|
||
await page.goto(BASE + '/login', { waitUntil: 'load', timeout: 60000 });
|
||
await page.waitForTimeout(6000); // 等 Flutter 渲染
|
||
|
||
await page.screenshot({ path: 'login.png', fullPage: true });
|
||
console.log('截图: login.png');
|
||
|
||
// 检查所有 input(含 display:none)
|
||
const inputs = await page.evaluate(() => {
|
||
return [...document.querySelectorAll('input')].map(e => ({
|
||
type: e.type,
|
||
hidden: e.hidden || e.style.display === 'none' || e.offsetParent === null,
|
||
cls: e.className.slice(0, 50),
|
||
pos: e.getBoundingClientRect ? (() => { const r = e.getBoundingClientRect(); return {x: Math.round(r.x), y: Math.round(r.y), w: Math.round(r.width), h: Math.round(r.height)}; })() : null,
|
||
}));
|
||
});
|
||
console.log(`所有 input (${inputs.length}):`, JSON.stringify(inputs));
|
||
|
||
// 检查 flt-glass-pane 内的 semantics
|
||
const semTextboxes = await page.locator('[role="textbox"]').count();
|
||
console.log(`role=textbox: ${semTextboxes}`);
|
||
|
||
console.log('\n=== 尝试点击用户名输入框区域,看是否触发 input ===');
|
||
// canvaskit 点击中间偏上区域(假设用户名框)
|
||
await page.mouse.click(640, 400);
|
||
await page.waitForTimeout(1500);
|
||
const inputsAfterClick = await page.evaluate(() => {
|
||
return [...document.querySelectorAll('input')].map(e => ({
|
||
hidden: e.hidden || e.style.display === 'none',
|
||
pos: (() => { const r = e.getBoundingClientRect(); return {x: Math.round(r.x), y: Math.round(r.y), w: Math.round(r.width)}; })(),
|
||
}));
|
||
});
|
||
console.log('点击后 input:', JSON.stringify(inputsAfterClick));
|
||
console.log('是否有 activeElement 是 input:', await page.evaluate(() => document.activeElement && document.activeElement.tagName));
|
||
|
||
console.log('\n=== pageerror 日志 ===');
|
||
console.log(logs.slice(0, 5).join('\n'));
|
||
|
||
await browser.close();
|
||
})().catch(e => { console.error('失败:', e.message); process.exit(1); });
|