我正在尝试使用带有selenium和ChromeDriver的本地主机(没有HTTPS)上的集成测试。
Chrome需要使用https证书,但是根据这个问题,我知道我可以使用arg来绕过它--ignore-certificate- errors
--ignore-certificate- errors
我也增加了自己的功能acceptInsecureCerts,因为这似乎是适当的做法(docs)
acceptInsecureCerts
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考虑了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?
ERR_SSL_PROTOCOL_ERROR
此错误消息…
This site can’t provide a secure connection app sent an invalid response. ERR_SSL_PROTOCOL_ERROR
…表示 ChromeDriver 无法启动/产生新的 WebBrowser, 即本地主机上的 Chrome浏览器 会话。
正如你所看到的这个问题,你对 本地主机(没有HTTPS) 按照此评论一眼罩的解决办法是增加argument --allow-insecure-localhost 通过chromeOptions()如下:
argument
--allow-insecure-localhost
chromeOptions()
'goog:chromeOptions': {'args': ['--allow-insecure-localhost'], 'extensions': []}
但是你的主要问题似乎是与 能力 ,你必须设置platform为集合S ANY 如下:
platform
ANY
正如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.
注意 :此列表并不详尽。
从New Session返回功能时,返回更特定的platformName是有效的,从而允许用户正确标识WebDriver实现在其上运行的操作系统。
因此"platform":"ANY", 与其 传递 期望的功能 对象, 不如说 是更具体的"platform":"linux"方法。
"platform":"ANY"
"platform":"linux"
有关 ChromeDriver , Chrome 和 Selenium Client 版本的更多信息将有助于我们以更好的方式分析问题。但是,根据 ChromeDriver的 历史记录,最近几个版本的 ChromeDriver 中解决了与 证书错误 处理相关的以下问题: __
--ignore-certificate-errors
certificateError
Security.enable
Security.setOverrideCertificateErrors
setIgnoreCertificateErrors
'chromedriverVersion': '74.0.3729.6'
'chrome': '74.0'