You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Python Selenium运行时关闭并重新开启Headless Chrome?

问题解答:Selenium运行中无法动态切换Chrome的Headless模式

结论先行:Chrome的Headless模式是启动时的核心配置参数,一旦浏览器进程启动,就无法动态开启或关闭该模式——这个参数是Chrome内核初始化阶段加载的,运行时没有提供修改该状态的接口。

以下是两种可行的替代方案,满足你“正常自动化时隐藏浏览器,需要时显示处理验证码”的需求:

方案1:启动非Headless浏览器,动态控制窗口显示/隐藏

直接用正常模式启动浏览器,平时将窗口隐藏或最小化,遇到验证码时再显示窗口处理,完成后继续隐藏。可以借助pygetwindow库实现窗口控制。

代码示例

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import chromedriver_autoinstaller
import pygetwindow as gw
import time

link = "https://www.google.com/recaptcha/api2/demo"
WINDOW_SIZE = "1920,1080"

try:
    chromedriver_autoinstaller.install()
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--incognito")
    chrome_options.add_argument("--log-level=3")
    chrome_options.add_argument(f"--window-size={WINDOW_SIZE}")
    # 启动正常模式浏览器(不添加--headless参数)
    driver = webdriver.Chrome(options=chrome_options)
    wait = WebDriverWait(driver, 10)
    
    # 获取Chrome窗口并隐藏
    chrome_window = gw.getWindowsWithTitle("Chrome")[0]
    chrome_window.hide()
    
    driver.get(link)
    
    # 遇到验证码,显示窗口等待处理
    chrome_window.show()
    print("请处理验证码,完成后按回车继续...")
    input()  # 等待用户确认
    
    # 处理完成后再次隐藏窗口
    chrome_window.hide()
    print("验证码已解决,继续执行后续逻辑")
    
    # 此处编写后续自动化代码
    
finally:
    driver.quit()

方案2:切换驱动实例,保存会话状态

当需要处理验证码时,关闭当前Headless驱动并保存会话Cookies;启动非Headless驱动加载Cookies以延续会话,处理完成后再保存新的Cookies,重新启动Headless驱动加载会话继续执行。

代码示例

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import chromedriver_autoinstaller

link = "https://www.google.com/recaptcha/api2/demo"
WINDOW_SIZE = "1920,1080"

def create_headless_driver():
    """创建Headless模式的Chrome驱动"""
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--incognito")
    chrome_options.add_argument("--log-level=3")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument(f"--window-size={WINDOW_SIZE}")
    return webdriver.Chrome(options=chrome_options)

def create_normal_driver():
    """创建正常模式的Chrome驱动"""
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--incognito")
    chrome_options.add_argument("--log-level=3")
    chrome_options.add_argument(f"--window-size={WINDOW_SIZE}")
    return webdriver.Chrome(options=chrome_options)

try:
    chromedriver_autoinstaller.install()
    
    # 1. 启动Headless驱动执行前置操作
    driver = create_headless_driver()
    driver.get(link)
    
    # 保存当前会话的Cookies和页面URL
    cookies = driver.get_cookies()
    current_url = driver.current_url
    driver.quit()
    
    # 2. 启动正常模式驱动,加载会话处理验证码
    driver = create_normal_driver()
    driver.get(current_url)
    # 加载保存的Cookies以延续会话
    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.refresh()
    
    print("请处理验证码,完成后按回车继续...")
    input()
    
    # 保存处理完验证码后的最新Cookies
    new_cookies = driver.get_cookies()
    driver.quit()
    
    # 3. 重新启动Headless驱动,加载新会话继续执行
    driver = create_headless_driver()
    driver.get(current_url)
    for cookie in new_cookies:
        driver.add_cookie(cookie)
    driver.refresh()
    
    print("验证码已解决,继续执行后续逻辑")
    
    # 此处编写后续自动化代码
    
finally:
    driver.quit()

注意事项

  • 方案1需要额外安装pygetwindow库,执行pip install pygetwindow即可。
  • 方案2中,部分网站可能会检测会话切换行为导致Cookies失效,需根据目标网站特性调整。

内容的提问来源于stack exchange,提问作者lol saso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:55:40