Playwright 默认下载并使用自带的 Chromium。想用本机装的 Google Chrome(自动化登录时保留 cookie、复用插件),有四种方式,各自适用场景不同。
方式一:channel = “chrome”
最省事——channel: "chrome" 告诉 Playwright 用系统装的稳定版 Chrome:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(channel="chrome", headless=False)
page = browser.new_page()
page.goto("https://example.com")
input("回车退出")
browser.close()
- 优点:跨平台一行搞定
- 局限:不会用你日常那个 profile,不带 cookie、不带插件
其它可选 channel:msedge、chrome-beta、chrome-dev、msedge-beta。
方式二:executable_path 指定路径
Chrome 装在非默认路径,或者想用 Chromium 兼容分发(Brave、Edge、Vivaldi):
Windows:
browser = p.chromium.launch(
executable_path=r"C:\Program Files\Google\Chrome\Application\chrome.exe",
headless=False,
)
macOS:
browser = p.chromium.launch(
executable_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
headless=False,
)
Linux:
browser = p.chromium.launch(
executable_path="/usr/bin/google-chrome",
headless=False,
)
跟方式一一样,不带 cookie / 插件——只是换了浏览器可执行文件。
方式三:launchPersistentContext 复用 profile
想让 Playwright 用日常那个 Chrome 用户目录(复用登录态、书签、扩展):
browser = p.chromium.launch_persistent_context(
user_data_dir=r"C:\Users\<你>\AppData\Local\Google\Chrome\User Data",
channel="chrome",
headless=False,
)
page = browser.pages[0] if browser.pages else browser.new_page()
page.goto("https://example.com")
注意:这个方式要求 Chrome 没在运行,否则报:
Failed to launch: browser closed. Profile is already in use
解法:
- 关掉所有 Chrome 窗口再跑
- 或者复制一份 profile 出来单独用:
xcopy "C:\...\User Data" "D:\pw-profile" /E /I
想只用某个 Profile(不是 Default):
browser = p.chromium.launch_persistent_context(
user_data_dir=r"D:\pw-profile",
args=["--profile-directory=Profile 1"],
channel="chrome",
headless=False,
)
方式四:CDP 连接已启动的 Chrome(推荐)
方式三最大的痛点是”Chrome 必须关闭”。想在 Chrome 正常开着的情况下让 Playwright 接管它,走 CDP(Chrome DevTools Protocol)。
第一步:以 debug 模式启动 Chrome,指定端口:
"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9222 ^
--user-data-dir="D:\pw-chrome-profile"
--user-data-dir 指向一个专用目录,避免和日常 Chrome 抢占用。
第二步:Playwright 连上去:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
ctx = browser.contexts[0]
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://example.com")
优势:
- Chrome 一直开着,做完自动化 Playwright 断开就行
- 保留登录态、插件、cookie
- 可以边脚本操作边人工插手(做半自动化)
生产爬虫、账号自动登录场景基本用这个。
四种方式对比
| 方式 | Chrome 需关闭 | 保留 profile | 使用场景 |
|---|---|---|---|
channel="chrome" | 否 | 否 | 简单自动化,无需登录态 |
executable_path=... | 否 | 否 | 用其它 Chromium 分发 |
launch_persistent_context | 是 | 是 | 一次性用现有 profile |
connect_over_cdp (CDP) | 否 | 是 | 推荐:常驻 Chrome + 脚本联动 |
顺带:无痕、隐身、下载路径
无痕模式:
browser = p.chromium.launch(channel="chrome", args=["--incognito"])
指定下载目录:
context = browser.new_context(accept_downloads=True)
page = context.new_page()
async with page.expect_download() as info:
await page.click("a#download")
download = await info.value
await download.save_as("D:/downloads/file.zip")
忽略证书错误(内网自签证书):
context = browser.new_context(ignore_https_errors=True)
一句话总结
普通自动化用 channel="chrome"、要复用登录态用 CDP 连接(先手动启动 Chrome + --remote-debugging-port=9222)。launch_persistent_context 只在 Chrome 关闭时才能用。
