diff --git a/chv-guest/chv-browser.py b/chv-guest/chv-browser.py index f86cdf1..15bfe82 100644 --- a/chv-guest/chv-browser.py +++ b/chv-guest/chv-browser.py @@ -138,22 +138,27 @@ def resolve_profile_dir(env=None, ismount=None): def full_chromium_executable(browsers_path=None): """完整 Chromium 可执行文件路径(数据盘安装目录下),未装返回 None。 - headless-shell 目录不算。""" + headless-shell 目录不算。布局有两种:经典 chrome-linux/chrome, + 与 CFT(Playwright 1.64.1 下的 chrome-linux64.zip)chrome-linux64/ + chrome——2026-11-08 构建 #8 驱动实证:装好的是后者,旧检查只认 + 前者而漏判,mount_full 误报未安装。""" base = browsers_path or os.environ.get( "PLAYWRIGHT_BROWSERS_PATH", PLAYWRIGHT_BROWSERS_PATH) for cand in glob.glob(os.path.join(base, "chromium-*")): if os.path.basename(cand).startswith( "chromium_headless_shell"): continue - exe = os.path.join(cand, "chrome-linux", "chrome") - if os.path.isfile(exe): - return exe + for sub in ("chrome-linux", "chrome-linux64"): + exe = os.path.join(cand, sub, "chrome") + if os.path.isfile(exe): + return exe return None def full_chromium_present(browsers_path=None): """完整 Chromium 是否已装:ms-playwright 下有 chromium-* - 目录且含 chrome-linux/chrome(headless-shell 目录不算)。""" + 目录且含 chrome-linux/chrome 或 chrome-linux64/chrome + (headless-shell 目录不算)。""" return full_chromium_executable(browsers_path) is not None diff --git a/cloud/tests/test_chv_opt_stage3.py b/cloud/tests/test_chv_opt_stage3.py index 63fb9b6..69b8405 100644 --- a/cloud/tests/test_chv_opt_stage3.py +++ b/cloud/tests/test_chv_opt_stage3.py @@ -203,6 +203,17 @@ class FullBrowsersDirTest(unittest.TestCase): open(exe, "w").write("x") self.assertEqual(BROWSER.full_chromium_executable(tmp), exe) + def test_executable_found_in_cft_layout(self): + # Playwright 1.64.1 的 CFT 包解压为 chrome-linux64/chrome。 + with tempfile.TemporaryDirectory() as tmp: + exe_dir = os.path.join( + tmp, "chromium-1248", "chrome-linux64") + os.makedirs(exe_dir) + exe = os.path.join(exe_dir, "chrome") + open(exe, "w").write("x") + self.assertEqual(BROWSER.full_chromium_executable(tmp), exe) + self.assertTrue(BROWSER.full_chromium_present(tmp)) + def test_status_reports_data_disk_dir(self): with tempfile.TemporaryDirectory() as tmp: agent, _c, _h = _agent([FakePage()], tmp,