我收到这个错误,而测试与硒
[18912:1216:0116/175151.966:ERROR:ssl_client_socket_impl.cc(960)] handshake failed; returned -1, SSL error code 1, net_error -101
当前代码是
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)
是否有其他方法可以忽略/解决此错误?
根据Chromium的命令行开关列表(适用于您的情况),您需要使用--ignore-certificate-errors-spki-list
作为webdriver选项参数。
您的代码片段options.add_argument('--ignore-certificate-errors-spki-list')
以正确的方式实现了这一点(cf。 doc,分别是Chromium for kIgnoreCertificateErrorsSPKIList[]
的代码库)。在一个稍微偏离主题的注意事项上,--ignore-certificate-errors
(在各种StackOverflow问题中建议)已弃用。
[18912:1216: 016/175151.966:ERROR:ssl_client_socket_impl.cc(960)]握手失败;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;
}
如前所述,主要问题是握手失败-特别是当ChromeDriver请求与Chrome中的SSL页面握手时。开发团队知道这个错误(或者广泛地说,它已经在多个场合被报告)。
你不能修复这个错误,不幸的是!幸运的是,这个错误不会中断您的程序。如果您只对消息本身感到困扰,可以随意通过options.add_argument('log-level=INT')
压缩所有警告消息,而INT
可能是记录的日志级别之一:
进行日志级别:设置最小日志级别。有效值为0 ~ 3:
INFO = 0, WARNING = 1, LOG_ERROR = 2, LOG_FATAL = 3.
默认为0。
引用自StackOverflow问题
因此,您可以使用options.add_argument('log-level=3')
来抑制所有类型的信息、警告、错误或致命消息(可能建议仅对错误使用级别2)。请记住,您不会看到任何其他与错误相关的消息,这些消息可能会在生产中造成混乱!