如何使用Puppeteer绕过Chrome的‘无可用密钥’原生弹窗?
解决Puppeteer自动化登录时Chrome“无可用密钥”原生弹窗问题
针对你遇到的2024年4月Chrome新增的“无可用密钥”原生弹窗问题,可通过以下方案解决:
核心解决方案:禁用Chrome密钥/密码相关功能
1. 补充启动参数
在现有启动参数中添加针对密钥、密码管理器的禁用项:
args: [ "--autoplay-policy=user-gesture-required", "--disable-backgrounding-occluded-windows", "--disable-breakpad", "--disable-client-side-phishing-detection", "--disable-component-update", "--disable-default-apps", "--disable-dev-shm-usage", "--disable-domain-reliability", "--disable-extensions", // 新增:禁用密码管理器与WebAuthn功能 "--disable-features=PasswordManager,WebAuthentication", "--disable-password-generation", "--disable-save-password-bubble", "--disable-form-autofill", "--disable-blink-features=AutomationControlled" ]
2. 更新用户偏好配置
修改UserPreferencePlugin的配置,直接关闭密钥服务与密码管理器:
puppeteer.use( UserPreferencePlugin({ userPrefs: { safebrowsing: { enabled: false, enhanced: false, }, // 新增:禁用凭证服务与密码管理器 credentials_enable_service: false, profile: { password_manager_enabled: false, }, webauthn: { enable_webauthn: false, } }, }) );
3. 调整Stealth插件配置
避免过度删除Stealth插件的evasion项,保留必要的自动化特征隐藏逻辑(如果之前删除的项影响了效果,可恢复默认配置):
const stealth = StealthPlugin(); // 若之前的删除操作导致问题,可注释掉以下两行,使用默认evasion配置 // stealth.enabledEvasions.delete("iframe.contentWindow"); // stealth.enabledEvasions.delete("media.codecs"); puppeteer.use(stealth);
完整代码示例
import puppeteer from "puppeteer-extra"; import AnonymizeUAPlugin from "puppeteer-extra-plugin-anonymize-ua"; import StealthPlugin from "puppeteer-extra-plugin-stealth"; import AdblockerPlugin from "puppeteer-extra-plugin-adblocker"; import UserPreferencePlugin from "puppeteer-extra-plugin-user-preferences"; const stealth = StealthPlugin(); // 按需调整evasion项,建议保留默认配置以更好隐藏自动化特征 puppeteer.use(stealth); puppeteer.use(AnonymizeUAPlugin()); puppeteer.use(AdblockerPlugin({ blockTrackers: true })); puppeteer.use( UserPreferencePlugin({ userPrefs: { safebrowsing: { enabled: false, enhanced: false, }, credentials_enable_service: false, profile: { password_manager_enabled: false, }, webauthn: { enable_webauthn: false, } }, }) ); // 启动浏览器 const browser = await puppeteer.launch({ args: [ "--autoplay-policy=user-gesture-required", "--disable-backgrounding-occluded-windows", "--disable-breakpad", "--disable-client-side-phishing-detection", "--disable-component-update", "--disable-default-apps", "--disable-dev-shm-usage", "--disable-domain-reliability", "--disable-extensions", "--disable-features=PasswordManager,WebAuthentication", "--disable-password-generation", "--disable-save-password-bubble", "--disable-form-autofill", "--disable-blink-features=AutomationControlled" ], // 调试时可设置为false可视化窗口 headless: "new" });
额外提示
- 确保Puppeteer及所有插件为最新版本,避免版本兼容问题;
- 若仍有问题,可尝试添加
--no-sandbox和--disable-setuid-sandbox参数(注意生产环境使用的安全风险)。
内容的提问来源于stack exchange,提问作者alchuang
相关产品推荐
相关产品推荐

