我正在尝试使用硒与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
?
答案 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"
。
中找到相关的讨论
有关 ChromeDriver , Chrome 和 Selenium Client 版本的更多信息可以帮助我们以更好的方式分析问题。但是,根据 ChromeDriver 的历史记录, ChromeDriver 的最新发行版中解决了与证书错误相关的以下问题:
"platform":"linux"
)中的CLI开关控制的,被忽略,只能通过devtools进行设置。因此,有必要在以浏览器为目标的DevTools客户端上覆盖和处理--ignore-certificate-errors
事件。发布了fix,实现了使用新的DevTools方法覆盖浏览器范围内证书错误处理的功能,该方法也允许在无头模式下忽略证书错误。 certificateError
命令在尝试导航之前足够快。使用更简单的“忽略所有证书错误”模式发布了fix,而建议使用新的Security.enable
命令,而弃用旧的覆盖命令,该命令还将在浏览器目标上公开安全域,以利于应用此覆盖整个浏览器都在全球范围内。Security.setOverrideCertificateErrors
setIgnoreCertificateErrors
--allow-insecure-localhost
acceptInsecureCerts
时,请确保您也在使用--ignore-certificate-errors
(根据ChromeDriver v74.0.3729.6发行说明)答案 1 :(得分:4)
根据Fix "Aw, Snap!" page crashes and other page loading errors - Computer - Google Chrome Help(展开“页面加载错误代码和问题”部分), Chrome给出ERR_SSL_PROTOCOL_ERROR
用于与SSL相关的任何错误。包括:>
由于您无法从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
选项