编程语言
首页 > 编程语言> > python – ChromeDriver ERR_SSL_PROTOCOL_ERROR尽管–ignore-certificate-errors

python – ChromeDriver ERR_SSL_PROTOCOL_ERROR尽管–ignore-certificate-errors

作者:互联网

我正在尝试使用chlenium和ChromeDriver在本地主机(没有HTTPS)上运行集成测试.

Chrome需要https证书,但从this问题我明白我可以使用arg –ignore-certificate-errors来规避这个问题

我还添加了我的功能acceptInsecureCerts,因为这似乎是适当的行动方案(docs)

chromedriver的反应仍然不是我所期待的:

This site can’t provide a secure connection app sent an invalid response.
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?

解决方法:

此错误消息…

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

…暗示ChromeDriver无法在您的localhost上启动/生成新的WebBrowser,即Chrome浏览器会话.

正如您在本地主机上看到此问题(没有HTTPS),根据this comment,盲目折叠解决方案是通过chromeOptions()添加参数–allow-insecure-localhost,如下所示:

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

但是,您的主要问题似乎是您已将平台设置为ANY的功能,如下所示:

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

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

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.

注意:此列表并非详尽无遗.

从New Session返回功能时,返回更具体的platformName是有效的,允许用户正确识别运行WebDriver实现的操作系统.

因此,而不是传递“平台”:在desiredCapabilities对象中的“ANY”,更具体的“平台”:“linux”将是更理想的方法.

You can find a relevant and related discussion in 07002

有关ChromeDriver,Chrome和Selenium Client版本的更多信息可以帮助我们更好地分析问题.但是,根据ChromeDriver历史记录,ChromeDriver的最新几个版本中解决了与处理证书错误相关的以下问题:

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

结论

>确保添加以下参数/功能:

> –allow-insecure-localhost
> acceptInsecureCerts
> –ignore-certificate-errors

>当您使用’chromedriverVersion’时:’74 .0.3729.6’确保您也使用’chrome’:’74 .0′(根据ChromeDriver v74.0.3729.6发行说明)
>确保您使用的是最新发布的Selenium v​​3.141.59客户端.

标签:selenium-grid,python,selenium,google-chrome,selenium-chromedriver
来源: https://codeday.me/bug/20190929/1832549.html