ChromeDriver ERR_SSL_PROTOCOL_ERROR несмотря на --ignore-certificate-errors - PullRequest
6 голосов
/ 05 июня 2019

Я пытаюсь запустить интеграционные тесты на локальном хосте (без HTTPS), используя селен с ChromeDriver.

Для Chrome требуется сертификат https, но из этого вопроса я понимаю, что могу обойти это, используя arg --ignore-certificate-errors

Я также добавил к своим возможностям acceptInsecureCerts, поскольку это похоже на соответствующий курс действий ( документы )

Ответ от хромедривера все еще не тот, что я ожидал:

Этот сайт не может предоставить приложению безопасного соединения отправленный неверный ответ. ERR_SSL_PROTOCOL_ERROR

Мой код указан ниже:

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

# make options (principally to ignore certificate)
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')

# add acceptInsecureCerts
capabilities = options.to_capabilities()
capabilities['acceptInsecureCerts'] = True

print(capabilities) # see below

driver = webdriver.Remote(
    command_executor=SELENIUM_HUB,
    desired_capabilities=capabilities
)
print(driver.__dict__) # see further below

app_login_url = 'http://app:8000/accounts/login/'

driver.get(app_login_url)

Мои возможности:

{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
                        'extensions': []},
'platform': 'ANY',
'version': ''}

Вот моя информация о драйвере, похоже, только acceptInsecureCerts arg было учтено:

{'_file_detector': <selenium.webdriver.remote.file_detector.LocalFileDetector object at 0x7fb42bde10f0>,
'_is_remote': True,
'_mobile': <selenium.webdriver.remote.mobile.Mobile object at 0x7fb42bb5e400>,
'_switch_to': <selenium.webdriver.remote.switch_to.SwitchTo object at 0x7fb42bdd4898>,
'capabilities': {'acceptInsecureCerts': True,
                'acceptSslCerts': True,
                'applicationCacheEnabled': False,
                'browserConnectionEnabled': False,
                'browserName': 'chrome',
                'chrome': {'chromedriverVersion': '74.0.3729.6 '
                                                    '(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29})',
                            'userDataDir': '/tmp/.com.google.Chrome.vc1ZvB'},
                'cssSelectorsEnabled': True,
                'databaseEnabled': False,
                'goog:chromeOptions': {'debuggerAddress': 'localhost:40815'},
                'handlesAlerts': True,
                'hasTouchScreen': False,
                'javascriptEnabled': True,
                'locationContextEnabled': True,
                'mobileEmulationEnabled': False,
                'nativeEvents': True,
                'networkConnectionEnabled': False,
                'pageLoadStrategy': 'normal',
                'platform': 'Linux',
                'proxy': {},
                'rotatable': False,
                'setWindowRect': True,
                'strictFileInteractability': False,
                'takesHeapSnapshot': True,
                'takesScreenshot': True,
                'timeouts': {'implicit': 0,
                            'pageLoad': 300000,
                            'script': 30000},
                'unexpectedAlertBehaviour': 'ignore',
                'version': '74.0.3729.169',
                'webStorageEnabled': True,
                'webdriver.remote.sessionid': '1cf77f237e966bac6ca15d4d9c107423'},
'command_executor': <selenium.webdriver.remote.remote_connection.RemoteConnection object at 0x7fb42be0cf98>,
'error_handler': <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fb427d08a20>,
'session_id': '1cf77f237e966bac6ca15d4d9c107423',
'w3c': False}

Почему я до сих пор вижу ERR_SSL_PROTOCOL_ERROR?

Ответы [ 3 ]

6 голосов
/ 08 июня 2019

Это сообщение об ошибке ...

This site can’t provide a secure connection app sent an invalid response. ERR_SSL_PROTOCOL_ERROR

... означает, что ChromeDriver не смог инициировать / создать новый WebBrowser , т.е. Chrome Browser сеанс на вашем локальном хосте.

Поскольку вы видите эту проблему на локальном хосте (без HTTPS) в соответствии с этим комментарием , решение с закрытыми глазами должно было бы добавить argument --allow-insecure-localhost до chromeOptions() следующим образом:

'goog:chromeOptions': {'args': ['--allow-insecure-localhost'],
            'extensions': []}

Однако ваша основная проблема, по-видимому, связана с возможностями , где вы установили platform, задавая s ANY следующим образом:

{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
            'extensions': []},
'platform': 'ANY',
'version': ''}

Согласно WebDriver - W3C Living Document , в разделе platformName упоминается, что следующие имена платформ широко используются с понятной семантикой, и при сопоставлении возможностей может быть достигнута наибольшая совместимость достигается за счет соблюдения их в качестве действительных синонимов для известных операционных систем:

Key         System
---         ------
"linux"     Any server or desktop system based upon the Linux kernel.
"mac"       Any version of Apple’s macOS.
"windows"   Any version of Microsoft Windows, including desktop and mobile versions.

Примечание : этот список не является исчерпывающим.

При возврате возможностей из нового сеанса допустимо возвращать более конкретное имя платформы, позволяя пользователям правильно идентифицировать операционную систему, в которой работает реализация WebDriver.

Таким образом, вместо передачи "platform":"ANY" в объекте требуемых возможностей более предпочтительным будет более конкретный "platform":"linux".

Соответствующее и связанное обсуждение можно найти в Ошибка Curl, выданная для http POST to / session с параметрами: {«требуемые возможности»: {«browserName»: «chrome», «platform»: «ANY» с Selenium и PHPUnit


Дополнительная информация о ChromeDriver , Chrome и Selenium Client vrsion помогла бы нам лучше проанализировать проблему. Однако согласно истории ChromeDriver следующие проблемы, связанные с обработкой ошибок сертификата , были решены в последних нескольких выпусках ChromeDriver :

  • Разрешить обработку ошибок сертификата с помощью DevTools : Так как безголовый хром не может отображать предупреждение пользовательского интерфейса для ошибок сертификата SSL, было выпущено fix , чтобы выставлять ошибки как события DevTools и управлять действием взять через команду DevTools.
  • Предоставляет возможность обрабатывать ошибки сертификатов в Chromedriver / Selenium для безголовых : ранее определенные параметры безопасности , которые контролировались с помощью переключателей CLI в версии пользовательского интерфейса Chromium (например, --ignore-certificate-errors ) были тихо проигнорированы и могут быть установлены только через devtools. Поэтому необходимо было переопределить и обработать certificateError события в клиенте DevTools для браузера. Вышло fix , в котором реализован новый метод DevTools для переопределения обработки ошибок сертификатов в браузере, что позволило игнорировать ошибки сертификатов и в автономном режиме.
  • Обработка ошибок глобального сертификата с помощью DevTools : Ранее DevTools разрешала обработку ошибок сертификата для отдельных целей / веб-содержимого, но когда создавалась новая цель (например, щелкнув ссылку target = _blank), это было не часто невозможно отправить команды Security.enable / Security.setOverrideCertificateErrors достаточно быстро до попытки навигации. fix было опубликовано с более простым режимом «игнорировать все ошибки сертификата» вместо устаревшей старой команды переопределения в пользу новой команды setIgnoreCertificateErrors, которая также предоставляет домен Security для цели браузера, чтобы упростить применение этого переопределения глобально для всего браузера.

Заключение

  • Убедитесь, что добавлены следующие аргументы / возможности:
    • --allow-insecure-localhost
    • acceptInsecureCerts
    • --ignore-certificate-errors
  • Поскольку вы используете 'chromedriverVersion': '74.0.3729.6', убедитесь, что вы также используете 'chrome': '74.0' (согласно ChromeDriver v74.0.3729.6 Замечания к выпуску)
  • Убедитесь, что вы используете последнюю версию клиентов Selenium v3.141.59 .
4 голосов
/ 07 июня 2019

В соответствии с Исправлено "Ой, Snap!" сбои страниц и другие ошибки загрузки страниц - Компьютер - Справка Google Chrome (разверните раздел «Коды и проблемы с загрузкой страниц»), Chrome дает ERR_SSL_PROTOCOL_ERROR для ЛЮБОЙ ошибки, связанной с SSL. :

  • ошибки сертификата
  • ошибки согласования параметров соединения (например, использование версии TLS и потокового шифрования)
  • нарушения протокола узлом

Поскольку вы не можете получить более подробную информацию из Chrome, открытие страницы в другом приложении (например, Firefox или с помощью openssl s_client) может дать вам более подробную информацию о происходящем.

нюхание пакетов, например, Wireshark может показывать начальные этапы подключения, включая этап переговоров; если ваш сервер (так что у вас есть его закрытый ключ), вы также сможете расшифровать зашифрованные части - что даст вам полную картину.

0 голосов
/ 14 июня 2019

Вы запрашиваете страницу через HTTP, а не HTTPS. Chrome не будет подключаться к небезопасному HTTP серверу.

Это приводит к сбою согласования TLS / SSL.

Вы должны убедиться, что ваш сервер работает HTTPS на TCP-порту 8000.

С помощью опции --ignore-certificate-errors вы можете создать самозаверяющий сертификат и применить его к веб-серверу.

Затем измените строку URL на HTTPS.

app_login_url = 'https://app:8000/accounts/login/'
...