Ошибка инициализации драйвера при запуске тестов pytest

Проблема (Вопрос) заключается …
При запуске тестов из консоли тест падает на инициализации драйверов
Я попытался сделать …

  1. Запустил терминал
  2. cd go to project
  3. Активировал виртуал инваирмент source venv/bin/activate
  4. Запустил тест pytest /path-to-test
    У меня получилось …

request = <SubRequest 'login_admin' for <Function 'test_create_tiny_url'>>

    @pytest.fixture(scope="function")
    def login_admin(request):
        # script_dir = os.path.dirname(__file__)
        # rel_path = "chromedriver"
        # abs_file_path = os.path.join(script_dir, rel_path)
>       driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())

conftest.py:33: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
venv/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py:75: in __init__
    desired_capabilities=desired_capabilities)
venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:156: in __init__
    self.start_session(capabilities, browser_profile)
venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:251: in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:320: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f54ae0f5da0>
response = {'sessionId': '3aca649ba5d551f259ace9e34088e6aa', 'status': 13, 'value': {'message': "unknown error: Chrome failed to ...r info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-39-generic x86_64)"}}

    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:
            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)
>       raise exception_class(message, screen, stacktrace)
E       selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
E         (unknown error: DevToolsActivePort file doesn't exist)
E         (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
E         (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-39-generic x86_64)

venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: WebDriverException

Версии ОС и софта следующие …

Linux Mint19

а ты передаешь в

  driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())

chrome_options ?

у меня вот так

from selenium.webdriver.chrome.options import Options as ChromeOption

chrome_option = ChromeOption()
driver_instance = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_option)

Я у себя вот так инициаллизирую драйвер и работает локально

        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument("--disable-gpu")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument("--test-type")
        chrome_options.add_argument("--disable-setuid-sandbox")
        chrome_options.add_argument("--disable-infobars")

        _driver = webdriver.Chrome(executable_path=ChromeDriverManager().install(), chrome_options=chrome_options)

Options это вы задаете параемтр с которым нужно открыть браузер, увы мне это непомогло.
Вся проблема в том что этот же тест запускается с PyCharm как с терминала так и черз гарячие клавиши. но с терминала линукса не хочет

Аналогично, первому комментарияю, тест не может драйвер запустить, тут не в опциях дело, но все равно спасибо за помощь.

А у вас хром там есть? Если его запустить с такой командной строки будет работать? Может там нужно типа google-chrome-stable?

Капитанский, конечно, совет, но если Pycharm может, а терминал нет - надо искать различия, может IDE версии поставила глобально и оттуда запускает, может параметры какие-то дописывает или рабочие директории, может использует другой питон - в общем надо поиграть в игру найди отличие =)
И я бы попытался получше локализовать. Открываешь терминал, python импортируешь минимальное количество библиотек, запускаешь хром, ловишь ошибку и смотришь на версии всего…

1 лайк

Линукс - удалёнка, или та же машина, на которой бежит PyCharm?
Судя по конфигурации, хром не в headless-mode (если я ничего не пропустил). Соответственно, он может крэшится просто из-за неподдерживаемого режима.
Кстати, да, там указан путь к хрому - он там, действительно, есть?

попробуйте скопировать команду которой вы запускаите на удаленной машине, и выполнить ее локально, сравните результат!

1 лайк

А из PyCharm тесты запускаются?
Если какие то проблемы с драйвером, то в целях отладки, вместо ChromeDriverManager().install() я бы положил рядом с проектом chromedriver (ChromeDriver - WebDriver for Chrome - Downloads), и прописал бы путь к нему - наверняка с этим проблема.
По крайней мере, у меня проблем с запуском ни из PyCharm, ни из консоли не было.