From d9e6c5b6f856cd30256d053d61475577954ea9ab Mon Sep 17 00:00:00 2001 From: hjq <770690987@qq.com> Date: Tue, 23 Jun 2026 11:25:56 +0800 Subject: [PATCH] =?UTF-8?q?BOM=E5=8F=91=E6=96=99=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser_login/login.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/browser_login/login.py b/browser_login/login.py index 7ef154f..c3c887b 100644 --- a/browser_login/login.py +++ b/browser_login/login.py @@ -13,7 +13,9 @@ import urllib.request from pathlib import Path from dotenv import load_dotenv from DrissionPage import ChromiumPage, ChromiumOptions -from DrissionPage._base.chromium import handle_options +from DrissionPage._base.chromium import Chromium, handle_options +from DrissionPage._base.driver import BrowserDriver +from DrissionPage._pages.chromium_tab import ChromiumTab # ── 加载 .env ───────────────────────────────────────────────────────────────── load_dotenv(Path(__file__).parent / ".env") @@ -99,6 +101,17 @@ def cleanup_debug_port(address: str) -> None: ) +def clear_drission_singletons() -> None: + """ + 清理 DrissionPage 的全局单例缓存。 + 失败后的半初始化对象会残留在这些缓存中,后续重试会错误复用脏对象。 + """ + Chromium._BROWSERS.clear() + ChromiumPage._PAGES.clear() + ChromiumTab._TABS.clear() + BrowserDriver.BROWSERS.clear() + + def probe_devtools_endpoints(address: str, log_output: bool = True) -> dict: """探测 DevTools HTTP 端点,并返回解析后的版本信息与标签页信息。""" result = {"version": None, "list": None} @@ -166,6 +179,9 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: browser_path = resolve_browser_path() effective_headless = headless or is_docker + if is_docker: + clear_drission_singletons() + if effective_headless: co.set_argument("--headless=new") co.set_argument("--disable-gpu") @@ -227,6 +243,7 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: if is_linux_env() and fallback_page_ws and "Handshake status 404 Not Found" in str(e): log("WARN", f"[DEBUG] Browser WS 握手失败,尝试降级连接 Page WS: {fallback_page_ws}") try: + clear_drission_singletons() fallback_co = ChromiumOptions() fallback_co.set_address(fallback_page_ws) page = ChromiumPage(fallback_co) @@ -238,6 +255,7 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: log("WARN", f"[DEBUG] 尝试清理地址 {actual_address} 后重试...") try: + clear_drission_singletons() cleanup_debug_port(actual_address) time.sleep(1) page = ChromiumPage(opt)