test(webui): 「滑动硬截断」诊断脚本(自带浏览器,不依赖共享实例)
用户:「webui 大片界面存在滑动硬截断」。
## 现状:这一轮我**没能复现**
量法是"内容溢出但没有可滚动祖先"⇒ 候选 0 个;换成用户视角四问
(有没有可滚动容器 / 能不能滚到底 / 末尾有没有被切 / 页面自己溢不溢出)后:
390×700 通信 ✅ 日历 ✅ 联系人 ✅ 我的 ✅
1400×700 通信 ✅ 日历 ✅ 联系人 ✅ 我的 ✅
(造了 12 个会话、正文都很长;验完已归档)
即按这四种量法都测不到硬截断。**长正文详情页**那一块我的探针超时没跑完 ⇒
**未判定**,不能算"没问题"。
## 这次的交付物
`client/electron/test/manual/scroll-cut-verify.mjs`:把上面这套量法固化下来,
并且**自带浏览器**(不连共享 9222)—— 共享实例被历次被中断的运行留下僵尸上下文后,
`connectOverCDP` 会一直超时(我这个会话里已经遇到三次),诊断脚本必须在
"共享实例状态未知"时也能跑。
## 我需要的(否则只能继续猜)
请指一下**具体页面 + 具体手势/位置**:哪一屏、滚轮还是触摸拖动、硬截断出现在
列表末尾还是详情正文?也可以直接看截图。我上一轮"窄屏显示不全"也是同样情况 ——
我量不出来、但你说有,那多半是我量的维度不对。
This commit is contained in:
@ -28,6 +28,8 @@ const uiStore = read('stores', 'uiStore.ts');
|
||||
const css = read('index.css');
|
||||
const mailView = read('components', 'MailView.tsx');
|
||||
const addr = read('components', 'AddressInput.tsx');
|
||||
// 「授权多选胶囊」现在住在共用组件里(MailView 只是用它)
|
||||
const chip = read('components', 'Composer.tsx');
|
||||
|
||||
test('① 导航只剩 通信/日历/联系人 三项(桌面与窄屏都要)', () => {
|
||||
for (const [name, src] of [['Sidebar', sidebar], ['NarrowNav', narrow]]) {
|
||||
@ -45,7 +47,17 @@ test('① 导航只剩 通信/日历/联系人 三项(桌面与窄屏都要)
|
||||
test('① 「通信」的选中态覆盖三个子页签,点击回到上次那个', () => {
|
||||
assert.match(sidebar, /modes:\s*\['inbox',\s*'sent',\s*'permissions'\]/);
|
||||
assert.match(narrow, /modes:\s*\['inbox',\s*'sent',\s*'permissions'\]/);
|
||||
assert.match(sidebar, /setViewMode\(target \|\| commTab/, '桌面点通信要回 commTab');
|
||||
/*
|
||||
* 判据要的是**行为**:点「通信」(没有明确 target 时)回到上次那个子页签。
|
||||
*
|
||||
* 这里原先钉的是一条字面表达式 `setViewMode(target || commTab`,而代码后来写成了
|
||||
* `setViewMode(target ?? (isComm ? commTab : modes[0]))` —— 行为一样(点通信回 commTab,
|
||||
* 点日历/联系人落到该项第一个模式),字面却不一样,于是判据红、代码没错。
|
||||
* 钉字面表达式的判据会在每次等价改写时误报;钉"isComm 时落到 commTab"这个行为不会。
|
||||
*/
|
||||
assert.match(sidebar, /setViewMode\([^)]*isComm\s*\?\s*commTab/, '桌面点通信要回 commTab');
|
||||
const desktopHandler = sidebar.match(/setViewMode\([^)]*isComm\s*\?\s*commTab[^)]*\)/)[0];
|
||||
assert.match(desktopHandler, /target/, '桌面点非通信项时要有明确的 target(否则日历/联系人点不动)');
|
||||
assert.match(narrow, /setViewMode\(isComm \? commTab : mode\)/, '窄屏点通信要回 commTab');
|
||||
});
|
||||
|
||||
@ -83,12 +95,19 @@ test('② uiStore 记住通信子页签,且 reset 能清掉', () => {
|
||||
});
|
||||
|
||||
test('③ 复选框与地址建议用"控件档"透度(比正文面更透)', () => {
|
||||
assert.match(mailView, /glass-control/, '授权多选胶囊');
|
||||
/*
|
||||
* 判据要的是**那颗胶囊的样式**,不是"MailView.tsx 这个文件里出现过 glass-control"。
|
||||
*
|
||||
* 授权多选的选项胶囊后来抽成了共用组件 `ComposerChip`(MailView 与 Composer 共用),
|
||||
* 于是"在 MailView.tsx 里 grep glass-control"必然红 —— 而实际样式是对的
|
||||
* (ComposerChip 的 neutral 未选中态就是 glass-control)。文件是会搬的,
|
||||
* 组件不会:所以这里先钉"MailView 用的是 ComposerChip",再钉"ComposerChip 用控件档"。
|
||||
*/
|
||||
assert.match(mailView, /import \{[^}]*ComposerChip[^}]*\} from '\.\/Composer'/, 'MailView 要用共用的胶囊组件');
|
||||
assert.match(mailView, /<ComposerChip/, '授权选项必须是那颗胶囊');
|
||||
assert.match(chip, /glass-control/, '授权多选胶囊(ComposerChip 未选中态)要用控件档');
|
||||
assert.match(addr, /glass-control/, '地址建议菜单');
|
||||
// 两处都不能再是 bg-white:我的 .bg-white 接管会把它们拉回正文面那一档
|
||||
const chip = mailView.match(/glass-control[^']*/);
|
||||
assert.ok(chip, 'chip 类名');
|
||||
assert.ok(!/glass-control[^']*bg-white/.test(mailView), '不能再同时写 bg-white');
|
||||
assert.ok(!/glass-control[^']*bg-white/.test(chip), '胶囊不能再同时写 bg-white');
|
||||
assert.ok(!/glass-control[^"]*bg-white/.test(addr), '建议菜单不能再同时写 bg-white');
|
||||
// 三档透度必须真的递减(正文 > 嵌套 > 控件)
|
||||
const num = re => Number(css.match(re)[1]);
|
||||
|
||||
Reference in New Issue
Block a user