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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
23f942440a
commit
668ae1d6fe
@@ -0,0 +1,62 @@
|
||||
---
|
||||
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。
|
||||
|
||||
## 执行记录
|
||||
|
||||
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)
|
||||
Reference in New Issue
Block a user