stealth.min.js是社区开发的js脚本,专为puppeteer/playwright设计,用于抹除navigator.webdriver等自动化痕迹;但它原生不支持selenium,直接注入会失败,因chromedriver的cdp机制与上下文环境不兼容。

stealth.min.js 是什么,它真能隐藏 Selenium 环境?
stealth.min.js 是一个社区维护的 JavaScript 注入脚本,专为 Puppeteer 和 Playwright 设计,用来抹除浏览器中暴露自动化痕迹的 DOM 属性、全局变量和 Navigator 接口特征(比如 navigator.webdriver、chrome.runtime、Object.defineProperty(navigator, 'webdriver', ...))。但它**原生不支持 Selenium + ChromeDriver** —— 直接用 driver.execute_script() 加载会失败或无效,因为 ChromeDriver 的 CDP 协议层与 Puppeteer 的注入机制不同,且部分 patch 依赖 Puppeteer 特有的上下文环境。
为什么在 Selenium 中直接加载 stealth.min.js 失败?
常见错误现象包括:ReferenceError: window.chrome is not defined、Cannot redefine property: webdriver、或注入后 navigator.webdriver 仍为 true。根本原因有三点:
- Selenium 启动的 Chrome 实例默认禁用部分扩展 API(如
chrome.runtime),而stealth.min.js试图访问它们 - 脚本依赖
Page.addScriptToEvaluateOnNewDocument的完整生命周期钩子,Selenium 的execute_cdp_cmd调用时机和权限受限 - ChromeDriver 版本与 Chromium 内核版本不匹配时,某些 Navigator 属性(如
permissions、mediaDevices)无法被安全重写
在 Selenium 中真正有效的替代方案
与其强行塞入 stealth.min.js,不如用更可控、兼容性更强的组合方式:
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
- 启动时通过
ChromeOptions禁用已知检测点:options.add_experimental_option("excludeSwitches", ["enable-automation"])和options.add_experimental_option('useAutomationExtension', False) - 用
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})注入最小化 patch,只覆盖关键字段:强制设navigator.webdriver = undefined、删除cdc_开头的 window 变量、重写PluginArray和MimeTypeArray返回空数组 - 配合真实 User-Agent 轮换(用
fake_useragent)和屏幕分辨率设置(如options.add_argument("--window-size=1920,1080")),避免单点暴露
示例关键 patch 片段:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
window.chrome = {runtime: {}};
Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5]});
'''
})
哪些检测项它根本防不住,必须另做处理?
stealth.min.js 或其 Selenium 移植版对以下检测完全无效:
- Canvas 指纹:网站调用
canvas.getContext('2d').getImageData()提取渲染差异,需额外用canvas` anti-fingerprinting补丁或启用--disable-gpu - WebGL 指纹:同理,需禁用或 mock
WebGLRenderingContext - 鼠标移动轨迹/点击节奏:纯 JS 注入无法模拟人类悬停、变速移动,必须靠
ActionChains+ 随机延迟 - 字体枚举检测(
document.fonts或fonts.enumerate()):需提前在系统级安装常见中文字体,并在 Chrome 启动参数中指定--font-render-hinting=medium
真正难防的不是某个 JS 脚本有没有生效,而是整套行为链是否自然 —— navigator.webdriver 改了,但鼠标 100ms 匀速直线点击,照样被识别为 bot。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










