Selenium ssl_client_socket_impl.cc 握手失败

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:

INFO = 0, 
WARNING = 1, 
LOG_ERROR = 2, 
LOG_FATAL = 3.
Run Code Online (Sandbox Code Playgroud)

默认值为 0。

引用摘自StackOverflow 问题。

因此,您可以用来options.add_argument('log-level=3')抑制所有类型的信息、警告、错误或致命消息(可能建议仅使用级别 2 来处理错误)。请记住,您不会看到任何其他可能导致生产混乱的错误相关消息!

  • 我在 Edge 和 Edge 驱动程序中看到同样的错误。由于 Edge 也基于 Chromium,因此此错误是否也会影响 Edge 驱动程序? (2认同)