fix: 采集后关闭自动新建商品页

- 新增 close_tab 和 create_tab_info,区分断开 CDP 连接与关闭浏览器 target

- open_product 标记商品页是否本轮自动新建,collect 结束后只关闭自动新建 tab

- 保留用户原本打开的商品 tab,③ 更新流程暂不自动关闭页面

- 补充 editor tab 生命周期测试并同步架构、API、任务和进度文档
This commit is contained in:
chengma
2026-06-27 16:39:12 +08:00
parent 789e82991f
commit e6d7de3d7c
9 changed files with 186 additions and 15 deletions
+22 -3
View File
@@ -30,6 +30,19 @@ def http_get(path, host=None):
return s.get(f"{_base(host)}{path}", timeout=10).json()
def close_tab(target_id, host=None):
"""Close a Chrome target/page by target id."""
if not target_id:
return False
import requests
s = requests.Session()
s.trust_env = False
response = s.get(f"{_base(host)}/json/close/{target_id}", timeout=10)
return response.ok
class CDP:
"""单个 target 的 CDP 客户端:命令同步、事件回调异步。"""
@@ -133,8 +146,8 @@ def find_product_tab(item_id, host=None):
return None
def create_tab(url, host=None):
"""用 browser 级 Target.createTarget 新建 tab,返回其 page websocket。"""
def create_tab_info(url, host=None):
"""用 browser 级 Target.createTarget 新建 tab,返回其 page target 信息。"""
ver = http_get("/json/version", host=host)
b = CDP(ver["webSocketDebuggerUrl"])
try:
@@ -145,6 +158,12 @@ def create_tab(url, host=None):
while time.time() < end:
for t in http_get("/json", host=host):
if t.get("id") == tid and t.get("webSocketDebuggerUrl"):
return t["webSocketDebuggerUrl"]
return t
time.sleep(0.5)
raise TimeoutError("等待新 tab websocket 超时")
def create_tab(url, host=None):
"""用 browser 级 Target.createTarget 新建 tab,返回其 page websocket。"""
return create_tab_info(url, host=host)["webSocketDebuggerUrl"]