尽管遇到--ignore-certificate-errors

时间:2019-06-05 09:28:35

标签: python selenium google-chrome selenium-chromedriver selenium-grid

我正在尝试使用硒与ChromeDriver在本地主机(没有HTTPS)上运行集成测试。

Chrome要求使用https证书,但是从this问题开始,我了解到可以使用arg --ignore-certificate-errors来解决这个问题

我还增加了自己的能力acceptInsecureCerts,因为这似乎是适当的做法(docs

chromedriver的响应仍然不是我期望的:

  

该网站无法提供安全的连接应用,但发送的响应无效。   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参数:

{'_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

4 个答案:

答案 0 :(得分:6)

此错误消息...

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

...表示 ChromeDriver 无法在本地主机上启动/产生新的 WebBrowser ,即 Chrome浏览器会话。

根据this comment,您在本地主机(没有HTTPS)上看到此问题,盲目的解决方案是添加argument { {1}} --allow-insecure-localhost如下:

chromeOptions()

然而,您的主要问题似乎在于功能,其中您已将'goog:chromeOptions': {'args': ['--allow-insecure-localhost'], 'extensions': []} 设置为 platform ,如下所示:

ANY

根据WebDriver - W3C Living Document platformName 部分所提到的,以下平台名称通常具有易于理解的语义,并且当匹配功能时,通过将它们尊敬为可以实现最大的互操作性。知名操作系统的有效同义词:

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

注意:此列表并不详尽。

从New Session返回功能时,返回更特定的platformName是有效的,从而允许用户正确标识WebDriver实现在其上运行的操作系统。

因此,与其在{em> desiredCapabilities 对象中传递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. ,不如说是更理想的方法"platform":"ANY"

  

您可以在Curl error thrown for http POST to /session with params: {“desiredCapabilities”:{“browserName”:“chrome”,“platform”:“ANY” with Selenium and PHPUnit

中找到相关的讨论

有关 ChromeDriver Chrome Selenium Client 版本的更多信息可以帮助我们以更好的方式分析问题。但是,根据 ChromeDriver 的历史记录, ChromeDriver 的最新发行版中解决了与证书错误相关的以下问题:

  • Allow handling certificate errors via DevTools:由于无头chrome无法显示SSL证书错误的UI警告,因此发布了fix以将错误显示为DevTools事件,并控制通过DevTools命令执行的操作。
  • Provide ability to handle certificate errors in Chromedriver/Selenium for headless:以前,某些security related options是通过Chromium的UI版本(例如"platform":"linux")中的CLI开关控制的,被忽略,只能通过devtools进行设置。因此,有必要在以浏览器为目标的DevTools客户端上覆盖和处理--ignore-certificate-errors事件。发布了fix,实现了使用新的DevTools方法覆盖浏览器范围内证书错误处理的功能,该方法也允许在无头模式下忽略证书错误。
  • Global certificate error handling via DevTools:以前,DevTools允许处理单个目标/ WebContents的证书错误,但是当创建新目标(例如,单击target = _blank链接)时,通常无法发送{{ 1}} / certificateError命令在尝试导航之前足够快。使用更简单的“忽略所有证书错误”模式发布了fix,而建议使用新的Security.enable命令,而弃用旧的覆盖命令,该命令还将在浏览器目标上公开安全域,以利于应用此覆盖整个浏览器都在全球范围内。

结论

  • 确保添加了以下参数/功能:
    • Security.setOverrideCertificateErrors
    • setIgnoreCertificateErrors
    • --allow-insecure-localhost
  • 在使用acceptInsecureCerts时,请确保您也在使用--ignore-certificate-errors(根据ChromeDriver v74.0.3729.6发行说明)
  • 确保您使用的是最新发布的 Selenium v​​3.141.59 客户端。

答案 1 :(得分:4)

根据Fix "Aw, Snap!" page crashes and other page loading errors - Computer - Google Chrome Help(展开“页面加载错误代码和问题”部分), Chrome给出ERR_SSL_PROTOCOL_ERROR用于与SSL相关的任何错误。包括:

  • 证书错误
  • 连接参数协商失败(例如使用的TLS版本和流加密)
  • 同行违反协议

由于您无法从Chrome获得更多详细信息,因此在另一个应用程序(例如Firefox或使用openssl s_client)中打开页面可以为您提供有关发生情况的更多详细信息。

用例如Wireshark可以显示连接的初始阶段,包括协商阶段;如果服务器是您的服务器(因此您拥有它的私钥),则还可以进行decrypt the encrypted parts -这样可以使您看到完整的图片。

答案 2 :(得分:0)

您是通过= team.members.count 而不是HTTP来请求页面。 Chrome不会连接到不安全的HTTPS服务器。

这导致TLS / SSL协商失败。

您需要确保服务器在TCP端口8000上运行HTTP

使用HTTPS选项,您可以生成自签名证书并将其应用于Web服务器。

然后将网址行更改为使用--ignore-certificate-errors

HTTPS

答案 3 :(得分:0)

我在 MAC 上遇到了这个问题,添加 chrome 选项没有解决它。

以下解决方法为我解决了问题:

  • 导航到/usr/local/lib/python/site-packages/seleniumwire/proxy
  • 双击 ca.crt 文件
  • Keychain Access 应用中双击 Selenium Wire CA 证书
  • 展开 Trust
  • 从下拉菜单中选择 Always Trust 选项
  • 使用密码进行身份验证