Files
cmshoppe/docs/tasks/T-585.md
T
chengmaandClaude Opus 4.8 668ae1d6fe docs(tasks): add T-585 auto-detect Chrome path (registry+dirs, Chrome-only, fill-if-empty)
detect_chrome_path():注册表 App Paths(HKLM/HKCU) → 标准目录(含
LOCALAPPDATA 用户级安装,当前默认漏的) → 空;Chrome-only 不碰 Edge。
启动仅在路径空/失效时自动填、不覆盖有效设置;⑤加「自动检测」按钮 +
命中/未命中反馈。winreg 平台守卫可 mock,Linux 测试不崩。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 15:49:47 +08:00

63 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: T-585
title: Chrome 路径自动检测(注册表+标准目录,Chrome-only,仅空/失效才填)+ ⑤「自动检测」按钮
phase: 7
deps: [T-557]
status: TODO
created: 2026-07-10
---
## 问题 / 背景
`chrome_path` 默认硬编码 `C:\Program Files\Google\Chrome\Application\chrome.exe`(`appconfig.py:74`),对**用户级安装**(`%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe`,免管理员安装,很常见)、`Program Files (x86)`、其它盘、便携版全部失效——路径不存在则启动失败(`chrome.py:61` 空则报错,实际是路径不存在的 launch 失败)。小白遇到只能用 T-557「选择...」手动翻 chrome.exe,是"开箱即用"要消灭的摩擦。
产品原则对齐(运营日常零配置 + 逃生口 + 反馈):**自动检测填路径(小白无感)+ 保留手动「选择...」(逃生口)+ 检测结果给反馈(不做看不见的决定)**。
## 方案(改哪个文件、改成什么)
### 检测函数(`app/chrome.py`,可 mock、跨平台不崩)
- 新增 `detect_chrome_path() -> str | ""`,按可靠性顺序返回**第一个存在**的 Chrome 可执行路径:
1. **注册表 App Paths**:`HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe` 默认值,再 `HKCU` 同键(用户级安装);`winreg` 仅 Windows,`import` 与调用需平台守卫 + try/except,非 Windows/读失败静默跳过。
2. **标准目录兜底**,按序取第一个 `os.path.isfile`:`%ProgramFiles%\Google\Chrome\Application\chrome.exe`、`%ProgramFiles(x86)%\...`、**`%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe`**(当前默认漏的)。
3. 都没有 → 返回 `""`。
- **Chrome-only**:不检测/不返回 Edge、Chromium 等(本软件依赖专属 user-data-dir + 蝦皮登录态持久化,换浏览器会乱登录态)。
- 纯函数、注册表访问与目录探测均可 mock;Linux/WSL 测试用 fixture 目录 + mock 注册表,不真读 `winreg`。
### 启动自动填(仅空/失效才填,不覆盖有效设置)
- 在配置加载/`prepare_data_dir` 之后、GUI 起来前的合适入口:若 `chrome_path` **为空、或指向的文件不存在** → 调 `detect_chrome_path()`,命中则写入配置(持久化)。
- **绝不覆盖已设且存在的路径**(便携版/自定义路径的逃生口保护)。触发条件严格是"空 or 指向文件不存在"。
### ⑤设置「自动检测」按钮 + 反馈
- `app/gui/tabs/settings.py`:Chrome 路径行在「选择...」旁加「自动检测」按钮,点击调 `detect_chrome_path()`:
- 命中 → 填入 `chrome_path_edit` 并提示「已自动定位 Chrome:<路径>」;
- 未命中 → 提示「未找到 Chrome,请点『选择...』手动指定,或先安装 Chrome」(指路,不是死胡同)。
- 启动自动填命中时,也在状态栏/日志留一条「已自动定位 Chrome」反馈(不做看不见的决定)。
### 文档同步
- `docs/04-architecture.md`(Chrome 启动/路径来源)、`docs/troubleshooting.md`(Chrome 找不到的排查改为"先点自动检测")。
## 验收要点
- `detect_chrome_path()`:mock 注册表返回某路径且文件存在 → 返回它;注册表无 → 落到标准目录,命中 `%LOCALAPPDATA%` fixture → 返回该路径;全无 → 返回 `""`。
- 非 Windows/`winreg` 不可用 → 不抛异常,走目录兜底(Linux 测试可跑)。
- 只返回 Chrome,不返回 Edge/Chromium(构造 Edge 存在但 Chrome 不存在的场景,断言返回 `""` 或不误取 Edge)。
- 启动自动填:`chrome_path` 为空 → 检测命中后写入;指向不存在文件 → 覆盖为检测结果;**已设且文件存在 → 不改**(断言不覆盖)。
- ⑤「自动检测」按钮:命中填入 + 成功提示;未命中给指路提示、不清空原值。
- 既有 T-557「选择...」手动选择不回归。
- 验证命令(unittest,不引入 pytest):
- `py -3.10 -m unittest tests.test_gui tests.test_appconfig`(chrome 检测测试放合适模块,若新建 test_chrome 则一并跑)
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不覆盖用户已设且存在的 `chrome_path`(便携版/自定义逃生口)。
- 不检测/不自动使用 Edge、Chromium 等非 Chrome 浏览器。
- 不改 `chrome.py` 启动/CDP 逻辑本身、`chrome_user_data_dir`、端口分配。
- 不真读注册表于测试(mock);不引入新第三方依赖。
- 不改 ①采集/②生成/③更新/DB/AI/cmhub。
## 执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)