如何在无头模式下访问Undetected Chrome的代理认证弹窗?
解决Undetected Chrome无头模式下代理认证弹窗问题
代理认证弹窗属于系统级对话框,并非网页JS生成的Alert,所以Selenium的Alert API无法捕获,这是你遇到NoAlertPresentException的核心原因。以下是几种可行的解决方案:
方法1:通过Chrome扩展自动完成代理认证
创建轻量Chrome扩展,在浏览器启动时自动注入代理凭证,无头模式下也能正常工作:
步骤1:创建扩展文件
新建文件夹proxy-auth-extension,添加以下两个文件:
manifest.json(扩展配置):
{ "manifest_version": 3, "name": "Proxy Auto Auth", "version": "1.0", "permissions": ["proxy", "webRequest", "webRequestAuthProvider"], "background": { "service_worker": "background.js" }, "host_permissions": ["<all_urls>"] }
background.js(认证逻辑):
chrome.webRequest.onAuthRequired.addListener( (details, callback) => { callback({ authCredentials: { username: "你的代理用户名", password: "你的代理密码" } }); }, { urls: ["<all_urls>"] }, ["blocking"] );
步骤2:在代码中加载扩展
修改Python代码,添加扩展加载参数并启用无头模式:
import time import os from selenium.webdriver.chrome.options import Options import undetected_chromedriver as uc host_ip = 'X.XXX.XXX.XXX' port = 'XXXXX' ipCheckURL = "http://whatismyipaddress.com" extension_path = os.path.abspath("./proxy-auth-extension") chrome_options = Options() chrome_options.add_argument(f'--proxy-server=http://{host_ip}:{port}') chrome_options.add_argument(f'--load-extension={extension_path}') # Chrome 112+ 推荐使用新无头模式 chrome_options.add_argument('--headless=new') ucdriver = uc.Chrome(options=chrome_options, use_subprocess=True) ucdriver.get(ipCheckURL) time.sleep(5) ucdriver.quit()
方法2:使用Selenium Wire接管代理认证
Selenium Wire可在请求层面处理代理认证,避免弹出系统对话框,结合undetected-chromedriver使用:
import time from selenium.webdriver.chrome.options import Options from seleniumwire import webdriver username = "你的代理用户名" password = "你的代理密码" host_ip = 'X.XXX.XXX.XXX' port = 'XXXXX' ipCheckURL = "http://whatismyipaddress.com" chrome_options = Options() chrome_options.add_argument('--headless=new') seleniumwire_options = { 'proxy': { 'http': f'http://{username}:{password}@{host_ip}:{port}', 'https': f'https://{username}:{password}@{host_ip}:{port}', 'no_proxy': 'localhost,127.0.0.1' }, 'disable_encoding': True } # 启用undetected-chromedriver模式 driver = webdriver.Chrome( options=chrome_options, seleniumwire_options=seleniumwire_options, uc=True ) driver.get(ipCheckURL) time.sleep(5) driver.quit()
方法3:Chrome启动参数配置(部分代理有效)
部分代理支持通过Chrome认证白名单参数传递凭证,尝试以下配置:
import time from selenium.webdriver.chrome.options import Options import undetected_chromedriver as uc username = "你的代理用户名" password = "你的代理密码" host_ip = 'X.XXX.XXX.XXX' port = 'XXXXX' ipCheckURL = "http://whatismyipaddress.com" chrome_options = Options() chrome_options.add_argument(f'--proxy-server=http://{host_ip}:{port}') # 指定需要认证的服务器白名单 chrome_options.add_argument(f'--auth-server-whitelist={host_ip}') # 注入认证凭证(部分Chrome版本支持) chrome_options.add_argument(f'--proxy-auth={username}:{password}') chrome_options.add_argument('--headless=new') ucdriver = uc.Chrome(options=chrome_options, use_subprocess=True) ucdriver.get(ipCheckURL) time.sleep(5) ucdriver.quit()
注意:该方法兼容性取决于Chrome版本和代理类型,部分场景下可能失效。
内容的提问来源于stack exchange,提问作者faaiz hashmi
相关产品推荐
相关产品推荐

