自动化报错:Could not start a new session.java.util.concurrent.TimeoutException

在selenium grid 上浏览器升级后,自动化时不时得报Could not start a new session. java.util.concurrent.TimeoutException 得错误

selenium版本 :4.9.1
grid上浏览器版本:115.0.5790.170
chromedriver 版本: 115.0.5790.102 也替换过更高版本的也是报这个错

工作上很困扰,好几天没解决掉,望各位江湖英雄解惑

以下是报错日志

@pytest.fixture
    def Driver():
>       Driver = DRIVER()

C:\Program Files\Python37\lib\site-packages\FMpytestCommon\fixture.py:15: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
C:\Program Files\Python37\lib\site-packages\FMpytestCommon\driver.py:17: in __init__
    self._driver = self.get_browser()
C:\Program Files\Python37\lib\site-packages\FMpytestCommon\driver.py:31: in get_browser
    return self.get_remote_browser(remote_driver_url, broswer_type)
C:\Program Files\Python37\lib\site-packages\FMpytestCommon\driver.py:45: in get_remote_browser
    'acceptSslCerts': True
C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py:286: in __init__
    self.start_session(capabilities, browser_profile)
C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py:378: in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py:440: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x0000029DC38E4B88>
response = {'status': 500, 'value': '{\n  "value": {\n    "error": "session not created",\n    "message": "Could not start a new ..."className": "java.lang.Thread",\n        "lineNumber": 829,\n        "classLoaderName": null\n      }\n    ]\n  }\n}'}

    def check_response(self, response: Dict[str, Any]) -> None:
        """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 not status or status == ErrorCode.SUCCESS:
            return
        value = None
        message = response.get("message", "")
        screen: str = response.get("screen", "")
        stacktrace = None
        if isinstance(status, int):
            value_json = response.get("value", None)
            if value_json and isinstance(value_json, str):
                import json
    
                try:
                    value = json.loads(value_json)
                    if len(value) == 1:
                        value = value["value"]
                    status = value.get("error", None)
                    if not status:
                        status = value.get("status", ErrorCode.UNKNOWN_ERROR)
                        message = value.get("value") or value.get("message")
                        if not isinstance(message, str):
                            value = message
                            message = message.get("message")
                    else:
                        message = value.get("message", None)
                except ValueError:
                    pass
    
        exception_class: Type[WebDriverException]
        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_SHADOW_ROOT:
            exception_class = NoSuchShadowRootException
        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 not value:
            value = response["value"]
        if isinstance(value, str):
            raise exception_class(value)
        if message == "" and "message" in value:
            message = value["message"]
    
        screen = None  # type: ignore[assignment]
        if "screen" in value:
            screen = value["screen"]
    
        stacktrace = None
        st_value = value.get("stackTrace") or value.get("stacktrace")
        if st_value:
            if isinstance(st_value, str):
                stacktrace = st_value.split("\n")
            else:
                stacktrace = []
                try:
                    for frame in st_value:
                        line = frame.get("lineNumber", "")
                        file = frame.get("fileName", "<anonymous>")
                        if line:
                            file = f"{file}:{line}"
                        meth = frame.get("methodName", "<anonymous>")
                        if "className" in frame:
                            meth = f"{frame['className']}.{meth}"
                        msg = "    at %s (%s)"
                        msg = msg % (meth, file)
                        stacktrace.append(msg)
                except TypeError:
                    pass
        if exception_class == UnexpectedAlertPresentException:
            alert_text = None
            if "data" in value:
                alert_text = value["data"].get("text")
            elif "alert" in value:
                alert_text = value["alert"].get("text")
            raise exception_class(message, screen, stacktrace, alert_text)  # type: ignore[call-arg]  # mypy is not smart enough here
>       raise exception_class(message, screen, stacktrace)
E       selenium.common.exceptions.SessionNotCreatedException: Message: Could not start a new session. java.util.concurrent.TimeoutException
E       Build info: version: '4.11.0', revision: '040bc5406b'
E       System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-211-generic', java.version: '11.0.20'
E       Driver info: driver.version: unknown 
E       Host info: host: '2fbdf7383444', ip: '172.23.0.13'
E       Stacktrace:
E           at org.openqa.selenium.grid.distributor.local.LocalDistributor.startSession (LocalDistributor.java:652)
E           at org.openqa.selenium.grid.distributor.local.LocalDistributor.newSession (LocalDistributor.java:565)
E           at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.handleNewSessionRequest (LocalDistributor.java:829)
E           at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.lambda$run$1 (LocalDistributor.java:785)
E           at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128)
E           at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628)
E           at java.lang.Thread.run (Thread.java:829)

C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py:245: SessionNotCreatedException

【以下回答由 GPT 生成】

这个问题可能是由于Selenium Grid无法启动新会话引起的。以下是一些可能的解决方案:

  1. 检查Selenium Grid的配置:检查Grid的配置文件,确保正确配置了节点和浏览器的连接。确认节点的配置中指定的浏览器驱动程序和版本与节点上实际安装的浏览器驱动程序和版本匹配。

  2. 检查网络连接:确保Selenium Grid服务器和节点之间的网络连接正常。尝试使用其他网络连接运行测试,以确定是否与网络连接有关。

  3. 检查防火墙设置:如果有防火墙或安全组配置,确保它们允许Selenium Grid服务器和节点之间的通信。

  4. 检查Grid和节点日志:查看Selenium Grid和节点的日志文件,查找任何有关这个问题的错误或警告信息。日志文件通常位于Grid和节点的安装目录下。

  5. 更新到最新版本:尝试更新Selenium Grid和浏览器驱动程序的版本,以确保它们与您使用的Selenium版本兼容。

  6. 检查测试代码:确保测试代码中的会话启动代码正确。尝试在不使用Grid的情况下直接连接到单个节点来测试会话启动是否正常。

无论您选择哪种解决方案,请确保在尝试之前备份任何关键文件或数据。如果这些解决方案都没有解决问题,建议咨询Selenium Grid的官方文档和社区论坛,以获取更多帮助和支持。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
"Could not start a new session. java.util.concurrent.TimeoutException" 错误表示在尝试启动新会话时发生超时。

______这可能是由于升级后的浏览器与Selenium Grid不兼容或配置问题导致的。

还有最后一段也显示"C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py:245: SessionNotCreatedException"
______无法创建新的会话

下面解答参考GPT1、确保使用兼容的浏览器版本:确保您使用的浏览器版本与Selenium Grid兼容,并且与您的自动化脚本所需的WebDriver相匹配。您可以查看Selenium和浏览器之间的兼容性矩阵,以确认版本兼容性。

2、检查驱动程序版本:如果您正在使用Selenium WebDriver,确保您使用的浏览器驱动程序版本与您的浏览器和Selenium Grid版本兼容。不同的浏览器版本可能需要特定版本的驱动程序。

3、检查Selenium Grid配置:检查Selenium Grid的配置文件,确保所有设置正确并且与浏览器和环境兼容。确保网格节点和主机之间的通信正常。

4、重启Selenium Grid和节点:有时,重新启动Selenium Grid和节点可以解决一些临时问题。

网络问题:确保您的网络连接稳定,网络不稳定可能会导致会话启动超时。尝试连接其他网站或服务以检查网络是否正常工作。

资源占用:如果您的机器资源(CPU、内存等)正在被其他应用程序占用,可能会影响会话的启动。尝试关闭不必要的应用程序,释放资源。

防火墙关一下

1.更新你的selenium grid服务器和节点的版本和驱动
2.调整你的selenium grid服务器和节点的配置和参数
3.重启你的selenium grid服务器和节点

自动化报错:Could not start a new session.java.util.concurrent.TimeoutException得解决方法

1有可能是偶尔的连接超时 ,刷新
2防火墙没打开
3我犯的错误 ,是没把zookeeper集群打开!!


1. 检查网络连接:确保Selenium Grid服务器和节点之间的网络连接正常。确保服务器和节点能够相互访问,并且没有任何网络问题。

2. 检查Selenium Grid配置:检查Selenium Grid的配置文件,确保正确配置了节点和浏览器的版本。确保版本与您的浏览器和驱动程序版本匹配。您提到的Selenium版本是4.9.1,确保您在配置中使用的是相应的版本。

3. 检查浏览器驱动程序版本:您提到您曾尝试更高版本的ChromeDriver,但仍然遇到相同的问题。确保您使用的ChromeDriver版本与您的浏览器版本兼容。您可以尝试使用与您的浏览器版本完全匹配的ChromeDriver版本。

4. 检查节点状态:检查Selenium Grid节点的状态,确保节点正常运行并且可用于会话。您可以尝试重启节点并重新连接到Grid5. 调整超时设置:尝试调整Selenium Grid的超时设置。您可以增加会话超时时间或降低超时时间,看看是否有所改善。您可以在Grid配置文件中设置超时选项。

6. 检查日志:查看Selenium Grid的日志文件,以获取更多关于错误的详细信息。日志文件通常位于Grid服务器的日志目录中。检查日志可以帮助您确定问题的根本原因。