sle*_*eep 7 python selenium selenium-chromedriver
我在使用 Selenium 进行测试时收到此错误
[18912:1216:0116/175151.966:ERROR:ssl_client_socket_impl.cc(960)] handshake failed; returned -1, SSL error code 1, net_error -101
Run Code Online (Sandbox Code Playgroud)
我当前的代码是
settings = {
'proxy':{
'https':'https://' + proxy
}
}
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors-spki-list')
options.add_argument('--ignore-ssl-errors')
self.driver = webdriver.Chrome(seleniumwire_options=settings, chrome_options=options)
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以忽略/解决此错误吗?
J. *_*old 16
根据Chromium 的命令行开关列表(适用于您的情况),您需要用作--ignore-certificate-errors-spki-listwebdriver 选项参数。
您的代码片段options.add_argument('--ignore-certificate-errors-spki-list')以正确的方式实现了这一点(参见 doc,分别是Chromium for的代码库kIgnoreCertificateErrorsSPKIList[])。稍微偏离主题一点,--ignore-certificate-errors(如各种StackOverflow 问题中所建议的)已被弃用。
无论如何,一般来说您的错误消息(见下文)
[18912:1216:0116/175151.966:错误:ssl_client_socket_impl.cc(960)]握手失败;返回 -1,SSL 错误代码 1,net_error -101
推断 Selenium ChromeDriver 和 Chrome 浏览器之间的握手在执行过程中失败。如果我们看一下ssl_client_socket_impl.cc,我们可以看到SSLClientSocketImpl::DoHandshake()(这会导致您的错误):
int SSLClientSocketImpl::DoHandshake() {
crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
int rv = SSL_do_handshake(ssl_.get());
int net_error = OK;
if (rv <= 0) {
int ssl_error = SSL_get_error(ssl_.get(), rv);
if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP && !send_client_cert_) {
return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
}
if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
DCHECK(client_private_key_);
DCHECK_NE(kSSLClientSocketNoPendingResult, signature_result_);
next_handshake_state_ = STATE_HANDSHAKE;
return ERR_IO_PENDING;
}
if (ssl_error == SSL_ERROR_WANT_CERTIFICATE_VERIFY) {
DCHECK(cert_verifier_request_);
next_handshake_state_ = STATE_HANDSHAKE;
return ERR_IO_PENDING;
}
OpenSSLErrorInfo error_info;
net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
if (net_error == ERR_IO_PENDING) {
// If not done, stay in this state
next_handshake_state_ = STATE_HANDSHAKE;
return ERR_IO_PENDING;
}
LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
<< ssl_error << ", net_error " << net_error;
NetLogOpenSSLError(net_log_, NetLogEventType::SSL_HANDSHAKE_ERROR,
net_error, ssl_error, error_info);
}
next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
return net_error;
}
Run Code Online (Sandbox Code Playgroud)
如前所述,主要问题是握手失败 - 特别是当 ChromeDriver 请求与 Chrome 中的 SSL 页面握手时。开发团队知道该错误(或者从广义上讲,该错误已被多次报告)。
不幸的是,您无法修复此错误!幸运的是,该错误不会中断您的程序。如果您只对消息本身感到困扰,请随意通过 压缩所有警告消息options.add_argument('log-level=INT'),而INT可能是记录的日志级别之一:
log-level:设置最低日志级别。有效值为 0 到 3:
Run Code Online (Sandbox Code Playgroud)INFO = 0, WARNING = 1, LOG_ERROR = 2, LOG_FATAL = 3.默认值为 0。
因此,您可以用来options.add_argument('log-level=3')抑制所有类型的信息、警告、错误或致命消息(可能建议仅使用级别 2 来处理错误)。请记住,您不会看到任何其他可能导致生产混乱的错误相关消息!
| 归档时间: |
|
| 查看次数: |
29685 次 |
| 最近记录: |