初始化 selenium webdriver 时如何修复 python-selenium 错误“连接被拒绝”?

2024-03-25

我正在非公共网页上运行非常复杂的 python-selenium 测试。在大多数情况下,这些测试运行良好,但有时这些测试之一在 Webdriver 本身的初始化期间会失败。

提示:当尝试初始化网络驱动程序时,即执行以下操作时,会发生此错误:

# Start of the tests
mydriver =  webdriver.Firefox(firefox_profile=profile, log_path=logfile)
# ERROR HAPPENS HERE

# Doing other stuff here
....
# Doing tests here
....
# Doing shutdown here
mydriver.quit()

以下是此类错误的完整示例:

___________ ERROR at setup of TestSuite.test_synaptic_events_fitting ___________

>   lambda: ihook(item=item, **kwds),
    when=when,
            )

/usr/local/lib/python2.7/dist-packages/flaky/flaky_pytest_plugin.py:273: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
conftest.py:157: in basedriver
    mydriver = firefox.get_driver(*args)
bsp_usecase_tests/tools/firefox.py:44: in get_driver
    driver = webdriver.Firefox(firefox_profile=profile, log_path=logfile)  #### INITIALIZING OF WEBDRIVER HERE
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py:158: in __init__
    keep_alive=True)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:154: in __init__
    self.start_session(desired_capabilities, browser_profile)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:243: in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py:311: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7efd3b702f90>
response = {'status': 500, 'value': '{"value":{"error":"unknown error","message":"connection refused","stacktrace":"stack backtra...s::imp::thread::{{impl}}::new::thread_start\n                        at /checkout/src/libstd/sys/unix/thread.rs:84"}}'}

    def check_response(self, response):
        """
            Checks that a JSON response from the WebDriver does not have an error.

            :Args:
             - response - The JSON response from the WebDriver server as a dictionary
               object.

            :Raises: If the response contains an error message.
            """
        status = response.get('status', None)
        if status is None or status == ErrorCode.SUCCESS:
            return
        value = None
        message = response.get("message", "")
        screen = response.get("screen", "")
        stacktrace = None
        if isinstance(status, int):
            value_json = response.get('value', None)
            if value_json and isinstance(value_json, basestring):
                import json
                try:
                    value = json.loads(value_json)
                    if len(value.keys()) == 1:
                        value = value['value']
                    status = value.get('error', None)
                    if status is None:
                        status = value["status"]
                        message = value["value"]
                        if not isinstance(message, basestring):
                            value = message
                            message = message.get('message')
                    else:
                        message = value.get('message', None)
                except ValueError:
                    pass

        exception_class = ErrorInResponseException
        if status in ErrorCode.NO_SUCH_ELEMENT:
            exception_class = NoSuchElementException
        elif status in ErrorCode.NO_SUCH_FRAME:
            exception_class = NoSuchFrameException
        elif status in ErrorCode.NO_SUCH_WINDOW:
            exception_class = NoSuchWindowException
        elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
            exception_class = StaleElementReferenceException
        elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
            exception_class = ElementNotVisibleException
        elif status in ErrorCode.INVALID_ELEMENT_STATE:
            exception_class = InvalidElementStateException
        elif status in ErrorCode.INVALID_SELECTOR \
                or status in ErrorCode.INVALID_XPATH_SELECTOR \
                or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
            exception_class = InvalidSelectorException
        elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
            exception_class = ElementNotSelectableException
        elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE:
            exception_class = ElementNotInteractableException
        elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
            exception_class = InvalidCookieDomainException
        elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
            exception_class = UnableToSetCookieException
        elif status in ErrorCode.TIMEOUT:
            exception_class = TimeoutException
        elif status in ErrorCode.SCRIPT_TIMEOUT:
            exception_class = TimeoutException
        elif status in ErrorCode.UNKNOWN_ERROR:
            exception_class = WebDriverException
        elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
            exception_class = UnexpectedAlertPresentException
        elif status in ErrorCode.NO_ALERT_OPEN:
            exception_class = NoAlertPresentException
        elif status in ErrorCode.IME_NOT_AVAILABLE:
            exception_class = ImeNotAvailableException
        elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
            exception_class = ImeActivationFailedException
        elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
            exception_class = MoveTargetOutOfBoundsException
        elif status in ErrorCode.JAVASCRIPT_ERROR:
            exception_class = JavascriptException
        elif status in ErrorCode.SESSION_NOT_CREATED:
            exception_class = SessionNotCreatedException
        elif status in ErrorCode.INVALID_ARGUMENT:
            exception_class = InvalidArgumentException
        elif status in ErrorCode.NO_SUCH_COOKIE:
            exception_class = NoSuchCookieException
        elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
            exception_class = ScreenshotException
        elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
            exception_class = ElementClickInterceptedException
        elif status in ErrorCode.INSECURE_CERTIFICATE:
            exception_class = InsecureCertificateException
        elif status in ErrorCode.INVALID_COORDINATES:
            exception_class = InvalidCoordinatesException
        elif status in ErrorCode.INVALID_SESSION_ID:
            exception_class = InvalidSessionIdException
        elif status in ErrorCode.UNKNOWN_METHOD:
            exception_class = UnknownMethodException
        else:
            exception_class = WebDriverException
        if value == '' or value is None:
            value = response['value']
        if isinstance(value, basestring):
            if exception_class == ErrorInResponseException:
                raise exception_class(response, value)
            raise exception_class(value)
        if message == "" and 'message' in value:
            message = value['message']

        screen = None
        if 'screen' in value:
            screen = value['screen']

        stacktrace = None
        if 'stackTrace' in value and value['stackTrace']:
            stacktrace = []
            try:
                for frame in value['stackTrace']:
                    line = self._value_or_default(frame, 'lineNumber', '')
                    file = self._value_or_default(frame, 'fileName', '<anonymous>')
                    if line:
                        file = "%s:%s" % (file, line)
                    meth = self._value_or_default(frame, 'methodName', '<anonymous>')
                    if 'className' in frame:
                        meth = "%s.%s" % (frame['className'], meth)
                    msg = "    at %s (%s)"
                    msg = msg % (meth, file)
                    stacktrace.append(msg)
            except TypeError:
                pass
        if exception_class == ErrorInResponseException:
            raise exception_class(response, message)
        elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
            raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
>       raise exception_class(message, screen, stacktrace)
E       WebDriverException: Message: connection refused

/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py:237: WebDriverException

这些测试作为 jenkins 计划的一部分在 docker 容器内运行,以确保始终具有完全相同的环境。以下是所使用的软件包及其版本的列表:

  • 蟒蛇2.7.12
  • pytest 3.6.1
  • 硒3.8.0
  • 壁虎驱动程序 0.19.1
  • 火狐浏览器62.0
  • 片状3.4.0

该错误大约出现在所有测试的 1% 左右。大约有 15 种不同的测试,并且错误似乎是随机出现的(即并不总是相同的测试)。

这是 firefox/selenium/geckodriver 中的错误吗?有办法解决这个问题吗?

下面的代码片段不是我正在使用的代码!这只是如何解决上述问题的一个想法。这可能是解决我原来问题的好方法吗?

while counter<5:
    try:
        webdriver = webdriver.Firefox(firefox_profile=profile, log_path=logfile) 
        break
    except WebDriverException:
        counter +=1

有一个更好的方法吗?


这个错误信息...

{'status': 500, 'value': '{"value":{"error":"unknown error","message":"connection refused","stacktrace":"stack backtra...s::imp::thread::{{impl}}::new::thread_start\n at /checkout/src/libstd/sys/unix/thread.rs:84"}}'}

...意味着Gecko驱动程序无法启动/产生新的网页浏览会话 i.e. 火狐浏览器会议。

In a comment https://github.com/mozilla/geckodriver/issues/957#issuecomment-330520308在讨论中删除“/session/{session id}”不再起作用 https://github.com/mozilla/geckodriver/issues/957@andrestt 提到:

当最后一个窗口关闭时,geckodriver 隐式结束(前一个)会话。如果driver.quit()作为后续命令调用它将失败,因为会话已被隐式删除。

在这些情况下,GeckoDriver 应检测到会话已在以下情况下隐式关闭:driver.close()或忽略来自的响应driver.quit()如果会议已经结束。

在这种情况下,会生成以下跟踪日志:

1505753594121   webdriver::server   DEBUG   Last window was closed, deleting session
1505753594121   webdriver::server   DEBUG   Deleting session
1505753594121   geckodriver::marionette DEBUG   Stopping browser process
1505753594364   webdriver::server   DEBUG   <- 200 OK {"value": []}
1505753594523   webdriver::server   DEBUG   -> DELETE /session/a8312282-af00-4931-94d4-0d401abf01c9 
1505753594524   webdriver::server   DEBUG   <- 500 Internal Server Error {"value":{"error":"session not created","message":"Tried to run command without establishing a connection","stacktrace":"stack backtrace:\n   0:           0x4f388c - backtrace::backtrace::trace::h736111741fa0878e\n   1:           0x4f38c2 - backtrace::capture::Backtrace::new::h63b8a5c0787510c9\n   2:           0x442c61 - webdriver::error::WebDriverError::new::hc4fe6a1ced4e57dd\n   3:           0x42a926 - <webdriver::server::Dispatcher<T, U>>::run::hba9181b5aacf8f04\n   4:           0x402c59 - std::sys_common::backtrace::__rust_begin_short_backtrace::h19de262639927233\n   5:           0x40c065 - std::panicking::try::do_call::h6c1659fc4d01af51\n   6:           0x5e38ec - panic_unwind::__rust_maybe_catch_panic\n                        at /checkout/src/libpanic_unwind/lib.rs:98\n   7:           0x420d32 - <F as alloc::boxed::FnBox<A>>::call_box::h953e5f59694972c5\n   8:           0x5dc00b - alloc::boxed::{{impl}}::call_once<(),()>\n                        at /checkout/src/liballoc/boxed.rs:661\n                         - std::sys_common::thread::start_thread\n                        at /checkout/src/libstd/sys_common/thread.rs:21\n                         - std::sys::imp::thread::{{impl}}::new::thread_start\n                        at /checkout/src/libstd/sys/unix/thread.rs:84"}}
1505753594533   webdriver::server   DEBUG   -> DELETE /session/a8312282-af00-4931-94d4-0d401abf01c9 
1505753594542   webdriver::server   DEBUG   <- 500 Internal Server Error {"value":{"error":"session not created","message":"Tried to run command without establishing a connection","stacktrace":"stack backtrace:\n   0:           0x4f388c - backtrace::backtrace::trace::h736111741fa0878e\n   1:           0x4f38c2 - backtrace::capture::Backtrace::new::h63b8a5c0787510c9\n   2:           0x442c61 - webdriver::error::WebDriverError::new::hc4fe6a1ced4e57dd\n   3:           0x42a926 - <webdriver::server::Dispatcher<T, U>>::run::hba9181b5aacf8f04\n   4:           0x402c59 - std::sys_common::backtrace::__rust_begin_short_backtrace::h19de262639927233\n   5:           0x40c065 - std::panicking::try::do_call::h6c1659fc4d01af51\n   6:           0x5e38ec - panic_unwind::__rust_maybe_catch_panic\n                        at /checkout/src/libpanic_unwind/lib.rs:98\n   7:           0x420d32 - <F as alloc::boxed::FnBox<A>>::call_box::h953e5f59694972c5\n   8:           0x5dc00b - alloc::boxed::{{impl}}::call_once<(),()>\n                        at /checkout/src/liballoc/boxed.rs:661\n                         - std::sys_common::thread::start_thread\n                        at /checkout/src/libstd/sys_common/thread.rs:21\n                         - std::sys::imp::thread::{{impl}}::new::thread_start\n                        at /checkout/src/libstd/sys/unix/thread.rs:84"}}
1505753594549   webdriver::server   DEBUG   -> GET /shutdown 
1505753594551   webdriver::server DEBUG <- 404 Not Found {"value":{"error":"unknown command","message":"GET /shutdown did not match a known command","stacktrace":"stack backtrace:\n 0: 0x4f388c - backtrace::backtrace::trace::h736111741fa0878e\n 1: 0x4f38c2 - backtrace::capture::Backtrace::new::h63b8a5c0787510c9\n 2: 0x442d88 - webdriver::error::WebDriverError::new::hea6d4dbf778b2b24\n 3: 0x43c65f - <webdriver::server::HttpHandler<U> as hyper::server::Handler>::handle::hd03629bd67672697\n 4: 0x403a04 - std::sys_common::backtrace::__rust_begin_short_backtrace::h32e6ff325c0d7f46\n 5: 0x40c036 - std::panicking::try::do_call::h5f902dc1eea01ffe\n 6: 0x5e38ec - panic_unwind::__rust_maybe_catch_panic\n at /checkout/src/libpanic_unwind/lib.rs:98\n 7: 0x4209a2 - <F as alloc::boxed::FnBox<A>>::call_box::h032bafb4b576d1cd\n 8: 0x5dc00b - alloc::boxed::{{impl}}::call_once<(),()>\n 

虽然您看到的错误的错误代码是“状态”:500我提供的错误样本是404 未找到,表面看起来不一样,核心原因类似:

"message":"connection refused" 

due to:

imp::thread::{{impl}}::new::thread_start

from:

/checkout/src/libstd/sys/unix/thread.rs:84

从另一个角度来看,当你使用Gecko驱动程序, Selenium and Firefox确保二进制文件兼容,如下所示:


Analysis

发生了重大变化壁虎驱动程序自从可用以来二进制壁虎驱动程序 0.19.1。其中一些变化是:

  • GeckoDriver v0.22.0 (2018-09-15):
    • 用于 [脚本超时] 和 [超时] 错误的 HTTP 状态代码已从请求超时 (408) 更改为内部服务器错误 (500),以便不破坏 HTTP/1.1Keep-Alive支持,因为 HTTP 客户端将旧状态代码解释为意味着它们应该复制请求。
    • HTTP/1.1Keep-Alive持久连接的超时时间已增加至 90 秒。
    • 现在,当没有活动会话时,会返回 [无效会话 ID] 错误。
    • geckodriver 连接到 Marionette 时的握手已通过在失败时终止 Firefox 进程来强化。
    • 握手读取超时已减少到 10 秒,而不是永远等待。
  • GeckoDriver v0.21.0 (2018-06-15):
    • 没有返回值的 WebDriver 命令现在可以正确返回{value: null}而不是一本空字典。
    • 强制使用 IPv4 网络堆栈。
    • On certain system configurations, where localhost resolves to an IPv6 address, geckodriver would attempt to connect to Firefox on the wrong IP stack, causing the connection attempt to time out after 60 seconds. We now ensure that geckodriver uses IPv4 consistently to both connect to Firefox and for allocating a free port.

  • GeckoDriver v0.20.1 (2018-04-06):
    • 避免尝试终止已停止的 Firefox 进程。
    • With the change to allow Firefox enough time to shut down in 0.20.0, geckodriver started unconditionally killing the process to reap its exit status. This caused geckodriver to inaccurately report a successful Firefox shutdown as a failure.

  • GeckoDriver v0.20.0 (2018-03-08):
    • geckodriver 的回溯不再替代丢失的 Marionette 堆栈跟踪。
    • 现在,Firefox 进程有足够的时间来关闭,从而为 Firefox 关闭挂起监视器提供了足够的时间来启动。
    • Firefox has an integrated background monitor that observes long-running threads during shutdown. These threads will be killed after 63 seconds in the event of a hang. To allow Firefox to shut down these threads on its own, geckodriver has to wait that time and some additional seconds.


Solution

  • Upgrade Selenium到目前的水平版本3.14.0 https://docs.seleniumhq.org/download/.
  • Upgrade Gecko驱动程序 to Gecko驱动程序 v0.22.0 https://github.com/mozilla/geckodriver/releases level.
  • Upgrade Firefox版本为火狐浏览器 v62.0.2 levels.
  • 如果你的基地网页客户端版本太旧,然后通过卸载雷沃卸载程序 https://www.revouninstaller.com/revo_uninstaller_free_download.html并安装最新的 GA 和发布版本网页客户端.
  • 始终调用driver.quit() within tearDown(){}方法关闭并销毁网络驱动程序 and 网页客户端优雅地实例。
  • 执行你的Test作为非 root 用户。

Update

根据您的问题更新粗略,您可以引发多次试验的循环来初始化 selenium webdriver 实例,如下所示:

  • 确保不存在悬空实例壁虎驱动程序通过调用taskkill命令 (Windows 操作系统特定) 如下:

    os.system("taskkill /f /im geckodriver.exe /T") 
    
  • 确保不存在悬空实例壁虎驱动程序通过调用kill()命令 (跨平台) 如下:

    from selenium import webdriver
    import psutil
    from selenium.common.exceptions import WebDriverException
    
    for counter in range(5):
        try:
            webdriver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe') 
            print("WebDriver and WebBrowser initialized ...")
            break
        except WebDriverException:
            #Cross platform
            PROCNAME = "geckodriver"
            for proc in psutil.process_iter():
                # check whether the process name matches
                if proc.name() == PROCNAME:
                    proc.kill()        
            print("Retrying ...")
    print("Out of loop ...")
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初始化 selenium webdriver 时如何修复 python-selenium 错误“连接被拒绝”? 的相关文章

随机推荐

  • python:更改符号变量并分配数值

    为了计算导数和其他表达式 我使用了 sympy 包并表示T sy Symbol T 现在我已经计算出正确的表达式 E T 2 F deriv T T rho where def F deriv rho T rho ret 0 for n i
  • 如何将VueJS中的属性对象传递给组件来修改它?

    将 VueJS 中的属性对象传递给组件并在那里修改它的最佳实践是什么 例如 人员表 姓名 名字 年龄 性别等 单击某个条目后 会弹出一个对话框 您可以在其中修改该条目 如果我通过 props 将条目传递给组件并修改它 我会收到 错误消息 避
  • D3.js:饼图,仅向外部区域添加边框

    我在 D3 中得到了一个饼图 并用笔画分隔了每个切片 但是 我想仅向切片的外部区域添加边框 而不是在连续线上添加边框 而是尊重原始切片中的笔划创建的间隙 请参阅我的图片以进行澄清 关于如何做到这一点有什么想法吗 See http jsfid
  • npm更新成功,但仍然显示旧版本

    当我做一个npm v我发现我仍然使用 5 6 0 并不断收到执行操作的提示npm i npm 但我已经做了一个sudo npm install npm latest g并用 a 进行双重检查npm outdated g depth 0看到我
  • MySQL命名约定,字段名应该包含表名吗?

    有朋友告诉我 我应该在同一个表的字段名中包含表名 我想知道为什么 而且应该是这样吗 例子 Table Users Fields user id username password last login time 我发现前缀 user 毫无意
  • “范围的坐标或尺寸无效”

    我正在开发一个与 REST API 链接并将数据放入 Google 表格的 Google Apps 脚本 我已经成功完成一次此操作 但是在访问一些不同的数据时 我收到错误消息 范围的坐标或尺寸无效 当它们在我的其他脚本上完美运行时 访问的所
  • 假设不变的 ASCII 编码,用 Rubyist 方法解码该编码字符串

    我的程序是二进制协议的解码器 该二进制协议中的字段之一是编码的String 中的每个角色String是可打印的 并且代表一个整数值 根据我正在解码的协议的规范 它表示的整数值取自下表 其中列出了所有可能的字符 Character Value
  • 依赖项的 Maven 项目变量

    我有一个加载小程序的 html 文件 html需要通过名称引用jar 并且由于maven根据artifactid 版本等对其进行命名 因此html需要随着项目的发展动态更新 似乎资源过滤是可行的方法 但我无法弄清楚要插入的变量应该是什么样子
  • jQuery 动画小数递增/递减

    我想一步一步地动画两个十进制数之间的差异 已经发现乔斯 克劳克罗夫特的解决方案 http www josscrowcroft com 2011 code jquery animate increment decrement numeric
  • 数据类中的属性

    描述 我正在尝试实现一个仅包含几个参数的简单数据类 dataclass class ReconstructionParameters img size int CR int denoise bool epochs int learning
  • 如何以可跨 Linux、Windows 和 MacOS 移植的方式收集 Python 3 中的当前架构?

    我正在尝试找到一种可移植的方式来收集当前的架构 例如x86 64 or AArch64 我将用它来填充一个标志 例如is x86 使用Python 3 它看起来像import platform platform machine 函数是正确的
  • 获取 CPU、RAM 和 GPU 信息 - UWP 应用

    是否可以在 UWP 应用程序中获取计算机的 CPU GPU 和 RAM 信息 E 在文本块中显示此信息 我想知道处理器型号 例如 Intel Core i7 xxxx 和总 RAM 我想知道处理器型号 例如 Intel Core i7 xx
  • 启发式参与者永无休止的定期恢复

    几天来我们的日志里一直充斥着这样的消息 2018 06 15 12 19 23 WARN com arjuna ats arjuna Periodic Recovery Transaction 0 ffff0a983f1e 1f3aa2ff
  • IE10 上的 WebSocket 出现 SecurityError

    我目前正在 IE10 在 Windows 8 上 下开发一个网站 使用 JavaScript 中的 WebSockets 它在 Firefox 18 和 Chrome 25 下运行良好 但在 IE10 上建立连接时出现 SecurityEr
  • 如何解决android中的OutOfMemoryError?

    我已经准备了可绘制动画的数量 当应用程序启动时 第一个动画将启动 我有两个按钮 下一个和上一个 具有相同的活动 当我单击下一个按钮时 我遇到了异常 例如 java lang OutOfMemoryError bitmap size exce
  • java中基于表单的身份验证的混乱

    谁能告诉我 我该如何处理j 安全检查java中基于表单的身份验证中的servlet 我是否必须映射 servlet 类j 安全检查web xml 文件中的名称 例如
  • 我如何在 Swift 中投射 @Binding

    很快我就可以用 Int doubleVariable 将 Int 转换为 Double 但是如何将 Binding 转换为 Binding 呢 然后我可以将 Binding var intVar Int 传递给需要 Double 绑定的函数
  • Python 正则表达式模块即使重叠 = True 也找不到所有匹配项

    我正在使用 PyPy正则表达式模块 https pypi org project regex 具有重叠匹配支持 我有以下代码 其中有一个字符串 A 我正在使用正则表达式查找在正则表达式中定义的 DNA 模式 我想找到与我的 RE 的所有匹配
  • RxJs 将流拆分为多个流

    如何根据分组方法将永无止境的流拆分为多个结束的流 a a a a a b b b b c c c c d d d e gt 到这些可观察到的 a a a a a b b b b c c c c d d d e gt 如您所见 a是在开始的时
  • 初始化 selenium webdriver 时如何修复 python-selenium 错误“连接被拒绝”?

    我正在非公共网页上运行非常复杂的 python selenium 测试 在大多数情况下 这些测试运行良好 但有时这些测试之一在 Webdriver 本身的初始化期间会失败 提示 当尝试初始化网络驱动程序时 即执行以下操作时 会发生此错误 S