You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Chrome Driver二次初始化添加Proxy报错的排查与解决

Selenium二次初始化Web3Driver时代理配置报错的原因与修复

问题描述

我定义了Web3Driver类,功能类似常规Selenium Driver,带有独立代理、指纹等属性,代码如下:

class Web3Driver:
    def __init__(self, wallet_id):
        self.wallet = db.get_wallet(wallet_id)
        self.mnemonic = self.wallet[2]
        possible_symbols = string.ascii_letters + string.digits
        combination_length = 15
        self.password = ''.join(random.choice(possible_symbols) for _ in range(combination_length))
        user_agent = self.wallet[13]
        chrome_options = Options()
        chrome_options.add_argument("--start-maximized")
        chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
        chrome_options.add_argument(f'user-agent={user_agent}')
        chrome_options.add_extension('10.33.0_0.crx')
        service = Service('chromedriver.exe')
        webdriver.DesiredCapabilities.CHROME['proxy'] = {
            "httpProxy": f'{self.wallet[12]}',
            "proxyType": 'MANUAL',
        }
        driver = webdriver.Chrome(service=service, options=chrome_options)
        self.driver = driver
        self.wait = WebDriverWait(self.driver, 10)
        logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s",
                            datefmt="%Y-%m-%d %H:%M:%S", filename=f"wallet_{wallet_id}.log")

首次通过web3driver = Web3Driver(wallet_id)初始化对象一切正常,但关闭Driver后再次初始化时出现以下异常:

Exception in thread Thread-1 (manage_tasks):
Traceback (most recent call last):
  File "C:\Users\childoflogos\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\childoflogos\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\manage_tasks.py", line 92, in manage_tasks
    tasks.bridge_to_zksync(task[0])
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\tasks.py", line 10, in bridge_to_zksync
    web3driver = Web3Driver(wallet_id)
                 ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\selenium_driver.py", line 45, in __init__
    driver = webdriver.Chrome(service=service, options=chrome_options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 49, in __init__
    super().__init__(
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\chromium\webdriver.py", line 54, in __init__
    super().__init__(
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 206, in __init__
    self.start_session(capabilities)
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 291, in start_session
    response = self.execute(Command.NEW_SESSION, caps)["value"]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 346, in execute
    self.error_handler.check_response(response)
  File "C:\Users\childoflogos\Desktop\airdrop_hunter\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: cannot parse capability: proxy
from invalid argument: unrecognized proxy type: MANUAL
Stacktrace:
Backtrace:
    GetHandleVerifier [0x006AA813+48355]
    (No symbol) [0x0063C4B1]
    (No symbol) [0x00545358]
    (No symbol) [0x0055B42D]
    (No symbol) [0x005603E4]
    (No symbol) [0x0055A99B]
    (No symbol) [0x0058FCEE]
    (No symbol) [0x0058F9A8]
    (No symbol) [0x00590AD7]
    (No symbol) [0x0059093C]
    (No symbol) [0x0058A536]
    (No symbol) [0x005682DC]
    (No symbol) [0x005693DD]
    GetHandleVerifier [0x0090AABD+2539405]
    GetHandleVerifier [0x0094A78F+2800735]
    GetHandleVerifier [0x0094456C+2775612]
    GetHandleVerifier [0x007351E0+616112]
    (No symbol) [0x00645F8C]
    (No symbol) [0x00642328]
    (No symbol) [0x0064240B]
    (No symbol) [0x00634FF7]
    BaseThreadInitThunk [0x769800C9+25]
    RtlGetAppContainerNamedObjectPath [0x77927B4E+286]
    RtlGetAppContainerNamedObjectPath [0x77927B1E+238]

首次添加代理到Selenium Driver Capabilities的方式正常,请问错误原因是什么?如何修复?

错误原因

webdriver.DesiredCapabilities.CHROME是全局静态字典,首次初始化时修改它的proxy配置能正常生效,但关闭Driver后,Selenium内部可能已经对这个全局字典做了调整或污染。二次初始化时,直接修改全局字典会导致代理配置格式冲突,使得MANUAL类型无法被正确识别。

修复方案

方案1:复制全局Capabilities再修改

不直接修改全局Capabilities,而是创建副本后添加代理配置,避免污染全局状态:

# 替换原有的代理配置代码
capabilities = webdriver.DesiredCapabilities.CHROME.copy()
capabilities['proxy'] = {
    "httpProxy": f'{self.wallet[12]}',
    "proxyType": 'MANUAL',
}
# 初始化Driver时传入capabilities参数
driver = webdriver.Chrome(service=service, options=chrome_options, desired_capabilities=capabilities)

方案2:通过ChromeOptions配置代理(推荐)

Selenium 4+推荐直接用ChromeOptions配置代理,无需操作全局Capabilities,稳定性更高:

# 替换原有的代理配置代码
chrome_options.add_argument(f'--proxy-server={self.wallet[12]}')

如果需要更精细的代理控制,也可以用Proxy类:

from selenium.webdriver.common.proxy import Proxy, ProxyType

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = self.wallet[12]
proxy.ssl_proxy = self.wallet[12]  # 若需要HTTPS代理

chrome_options.add_experimental_option('proxy', proxy.to_capabilities())

之后正常初始化Driver即可:

driver = webdriver.Chrome(service=service, options=chrome_options)

内容的提问来源于stack exchange,提问作者tegularis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:47:13