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
相关产品推荐
相关产品推荐

