Selenium操控Chrome:禁止窗口自动弹出与鼠标自动跳转问题求助
解决Selenium操控Chrome时窗口自动弹出的问题
以下几种方案可以解决Chrome窗口自动弹出、获取焦点的问题,同时保留任务栏图标,无需使用headless模式:
方案1:使用Chrome启动参数直接禁用焦点获取
通过添加特定的启动参数,让Chrome启动时最小化且不获取焦点,后续操作也不会弹出窗口:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 启动时自动最小化窗口,任务栏保留图标 chrome_options.add_argument("--start-minimized") # 禁止Chrome启动或操作时获取窗口焦点 chrome_options.add_argument("--no-focus-on-launch") # 禁用弹窗拦截(避免某些操作触发弹窗强制激活窗口) chrome_options.add_argument("--disable-popup-blocking") driver = webdriver.Chrome(options=chrome_options)
--no-focus-on-launch是Chrome官方支持的参数,能有效阻止窗口在导航、打开新标签时自动激活前置,配合--start-minimized可以让窗口始终在后台最小化状态。
方案2:针对Windows系统强制阻止窗口激活
如果方案1仍有鼠标跳转问题,可以借助Windows API强制取消Chrome窗口的激活状态:
- 先安装依赖库:
pip install pywin32
- 添加控制窗口焦点的代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import win32gui import win32api import win32con def keep_chrome_background(): # 匹配Chrome主窗口的类名(不同版本可能略有差异,可自行调整) hwnd = win32gui.FindWindow("Chrome_WidgetWin_1", None) if hwnd: # 将当前激活的窗口保持为前台,强制Chrome不抢占焦点 current_focus = win32gui.GetForegroundWindow() if current_focus != hwnd: win32api.SendMessage(hwnd, win32con.WM_ACTIVATE, win32con.WA_INACTIVE, 0) # 初始化Chrome chrome_options = Options() chrome_options.add_argument("--start-minimized") driver = webdriver.Chrome(options=chrome_options) # 执行操作后调用函数阻止焦点跳转 driver.get("https://example.com") keep_chrome_background() # 打开新标签时同样调用 driver.execute_script("window.open('https://google.com');") keep_chrome_background()
方案3:Linux/Mac系统适配
- Linux:使用
wmctrl工具,在操作后执行命令wmctrl -r "Google Chrome" -b add,hidden将Chrome窗口设为隐藏但保留任务栏图标,或wmctrl -r "Google Chrome" -b remove,focused取消焦点。 - Mac:通过AppleScript命令
tell application "Google Chrome" to set visible of window 1 to true保持窗口可见但不激活,或使用osascript -e 'tell application "System Events" to set frontmost of process "Google Chrome" to false'取消前置。
内容的提问来源于stack exchange,提问作者Quốc Thiệu
相关产品推荐
相关产品推荐

