能否在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
相关产品推荐
相关产品推荐

