Selenium ssl_client_socket_impl.Cc握手失败



我收到这个错误,而测试与硒

[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)。请记住,您不会看到任何其他与错误相关的消息,这些消息可能会在生产中造成混乱!

最新更新