单例Selenium ChromeDriver随机连接失败,求故障原因
Python Selenium ChromeDriver 连接自建服务器随机超时问题
问题现象
运行特定测试集时,约50%概率出现连接超时错误,错误触发在调用driver.get(website_url)时,其他30个使用相同配置的测试均正常运行。
报错信息
tests\certificate\test_mysoftware_Netwrk_ClientGroup.py:56: in setup_method delete_testClients() lib\mysoftware_ClientGroup.py:195: in delete_testClients driver.get(website_url) venv\lib\site-packages\selenium\webdriver\remote\webdriver.py:363: in get self.execute(Command.GET, {"url": url}) venv\lib\site-packages\selenium\webdriver\remote\webdriver.py:354: in execute self.error_handler.check_response(response) venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py:229: in check_response raise exception_class(message, screen, stacktrace) E selenium.common.exceptions.WebDriverException: Message: unknown error: net::ERR_CONNECTION_TIMED_OUT E (Session info: chrome=128.0.6613.114) E Stacktrace: E GetHandleVerifier [0x00007FF72A7BB652+29090] E (No symbol) [0x00007FF72A72E709] E (No symbol) [0x00007FF72A5EB1CA] E (No symbol) [0x00007FF72A5E3204] E (No symbol) [0x00007FF72A5D4179] E (No symbol) [0x00007FF72A5D5F42] E (No symbol) [0x00007FF72A5D443F] E (No symbol) [0x00007FF72A5D3CD1] E (No symbol) [0x00007FF72A5D3C10] E (No symbol) [0x00007FF72A5D1AD3] E (No symbol) [0x00007FF72A5D214C] E (No symbol) [0x00007FF72A5EE231] E (No symbol) [0x00007FF72A6873FE] E (No symbol) [0x00007FF72A6666EA] E (No symbol) [0x00007FF72A6865D9] E (No symbol) [0x00007FF72A666493] E (No symbol) [0x00007FF72A6309B1] E (No symbol) [0x00007FF72A631B11] E GetHandleVerifier [0x00007FF72AAD8CDD+3295277] E GetHandleVerifier [0x00007FF72AB248C3+3605523] E GetHandleVerifier [0x00007FF72AB1A787+3564247] E GetHandleVerifier [0x00007FF72A876F36+797318] E (No symbol) [0x00007FF72A73988F] E (No symbol) [0x00007FF72A735474] E (No symbol) [0x00007FF72A735600] E (No symbol) [0x00007FF72A724A9F] E BaseThreadInitThunk [0x00007FFB1DDD7374+20] E RtlUserThreadStart [0x00007FFB1FADCC91+33]
环境信息
- 系统:Windows 10
- Python版本:3.10
- Selenium版本:4.18.1
- Chrome与ChromeDriver版本:统一为128.0.6613.114
Driver配置代码
def get_driver_options(): options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("--window-size=1440, 900") options.add_argument('--ignore-certificate-errors') options.add_argument('--allow-running-insecure-content') options.add_argument("--disable-extensions") options.add_argument("--proxy-server='direct://'") options.add_argument("--proxy-bypass-list=*") options.add_argument("--start-maximized") options.add_argument('--disable-gpu') options.add_argument('--disable-dev-shm-usage') options.add_argument("--FontRenderHinting[none]") options.add_argument('--no-sandbox') options.add_argument('log-level=3') options.add_argument('--ignore-ssl-errors=yes') options.add_argument('--allow-insecure-localhost') options.add_argument('--remote-allow-origins=*') options.add_argument('--disable-search-engine-choice-screen') return options
单例WebDriver实现代码
class SdriverMeta(type): _instances = {} _lock: Lock = Lock() def __call__(cls, *args, **kwargs): if cls not in cls._instances: try: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance except Exception as e: if cls in cls._instances: del cls._instances[cls] raise return cls._instances[cls] @classmethod def get_lock(cls): return cls._lock @classmethod def reset_instance(cls): with cls._lock: if cls in cls._instances: del cls._instances[cls] class SDriver(metaclass=SdriverMeta): _instance = None def __new__(cls,headless = True): if not hasattr(cls, "_instance") or cls._instance is None: with cls._lock: cls._instance = super(SDriver, cls).__new__(cls) cls._instance.headless = headless cls._instance.driver = None return cls._instance def get_driver(self,headless = True): with SdriverMeta.get_lock(): if self.driver is None: if headless: options = get_driver_options() else: options = get_driver_headfull_options() service = Service() self.driver = webdriver.Chrome(service=service, options=options) self.driver.implicitly_wait(90) return self.driver def close_driver(self): with SdriverMeta.get_lock(): if hasattr(self, "driver") and self.driver: try: self.driver.close() self.driver.quit() except Exception as e: print(f"Failed to close the driver: {e}") finally: self.driver = None SdriverMeta.reset_instance()
触发错误的代码段
def delete_testClients(): sdriver = SDriver() headless=True driver = sdriver.get_driver(headless) website_url = default_config["website_url"] driver.get(website_url)
已排查内容
- 确认Chrome与ChromeDriver版本完全匹配,排除版本不兼容问题
- 验证目标URL正确无误
- 同配置的其他30个测试无异常,排除Driver配置本身问题
怀疑方向
推测问题可能与单例Driver的生命周期管理有关,但暂未定位具体原因,需进一步排查。
内容的提问来源于stack exchange,提问作者ajax
相关产品推荐
相关产品推荐

