Selenium使用带认证代理时add_to_capabilities报错解决方案咨询
解决Selenium中带用户名密码的代理配置问题
问题背景
之前长期使用的Selenium代理配置代码报错,提示AttributeError: 'Proxy' object has no attribute 'add_to_capabilities',且代理为带用户名密码的认证类型,无法直接通过--proxy-server参数配置。
报错信息
(selenium) C:\DEVNEU\Python-Diverses\Selenium>python test.py Checking Browser driver... Traceback (most recent call last): File "C:\DEVNEU\Python-Diverses\Selenium\test.py", line 25, in <module> prox.add_to_capabilities(capabilities) ^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'Proxy' object has no attribute 'add_to_capabilities'. Did you mean: 'to_capabilities'?
解决方案
1. 修复代理配置方法报错
Selenium版本更新后,Proxy对象的add_to_capabilities()方法已被移除,需改用to_capabilities()方法生成配置并更新到capabilities中。
2. 配置带用户名密码的认证代理
Chrome不再支持直接在代理URL中嵌入用户名密码(如http://user:pass@host:port),可通过Chrome DevTools协议(CDP)注入认证凭证,无需额外依赖库。
完整示例代码
import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.proxy import Proxy, ProxyType from selenium.webdriver.support.ui import WebDriverWait print(f"Checking Browser driver...") os.environ['WDM_LOG'] = '0' options = Options() options.add_argument("start-maximized") options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1}) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--disable-blink-features=AutomationControlled') srv = Service() # 代理信息 HOSTNAME = "196.247.168.34" PORT = "12345" PROXY_USER = "your_proxy_username" # 替换为实际代理用户名 PROXY_PASS = "your_proxy_password" # 替换为实际代理密码 # 配置代理基础信息 prox = Proxy() prox.proxy_type = ProxyType.MANUAL prox.http_proxy = prox.ssl_proxy = f"{HOSTNAME}:{PORT}" capabilities = webdriver.DesiredCapabilities.CHROME # 替换原add_to_capabilities方法 capabilities.update(prox.to_capabilities()) driver = webdriver.Chrome(service=srv, options=options, desired_capabilities=capabilities) waitWD = WebDriverWait(driver, 5) # 通过CDP配置代理认证 driver.execute_cdp_cmd('Network.enable', {}) driver.execute_cdp_cmd('Network.setAuthCredentials', { 'origin': f'http://{HOSTNAME}:{PORT}', 'username': PROXY_USER, 'password': PROXY_PASS }) driver.get("https://whatismyipaddress.com/") input("Press!") driver.quit()
备选方案(监听认证请求)
如果上述方法无效,可通过监听Network.authRequired事件来动态响应认证请求:
# 在driver启动后添加以下代码 def handle_auth(event): if event['params']['type'] == 'proxy': driver.execute_cdp_cmd('Network.continueWithAuth', { 'requestId': event['params']['requestId'], 'authChallengeResponse': { 'response': 'ProvideCredentials', 'username': PROXY_USER, 'password': PROXY_PASS } }) driver.add_event_listener('Network.authRequired', handle_auth) driver.execute_cdp_cmd('Network.enable', {})
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

