首页 > 解决方案 > Chrome 在 docker 容器中返回状态码 400

问题描述

我在 docker 容器中运行量角器硒测试。我必须测试一个不安全的网站。对于进行 API 调用以从支持的 chrome 取回一些数据的函数之一,返回状态代码 400。我在量角器配置文件中添加了以下内容:

铬 args("--headless", "--no-sandbox", "--disable-dev-shm-usage")

directConnection: true,
disableChecks: true

能力:

acceptInsecureCerts: true
acceptSslCerts: true

我还在 .env 文件中添加了以下内容:

NODE_TLS_REJECT_UNAUTHORIZED=0

以下是我得到的网络日志:

{
  method: 'Network.responseReceived',
  params: {
    frameId: '721A00F872D1255AA1DAE58D2DF5D75E',
    loaderId: '70EAE0F82B0AB6BDE6489BC26D77DA34',
    requestId: '117.239',
    response: {
      connectionId: 309,
      connectionReused: true,
      encodedDataLength: 123,
      fromDiskCache: false,
      fromPrefetchCache: false,
      fromServiceWorker: false,
      headers: [Object],
      mimeType: 'application/problem+json',
      protocol: 'h2',
      remoteIPAddress: 'remote ip',
      remotePort: 443,
      securityDetails: [Object],
      securityState: 'insecure',
      status: 400,
      statusText: '',
      timing: [Object],
      url: 'https://api call link'
    },
    timestamp: 15184.562748,
    type: 'XHR'
  }
}
{
  method: 'Network.dataReceived',
  params: {
    dataLength: 185,
    encodedDataLength: 0,
    requestId: '117.239',
    timestamp: 15184.562954
  }
}
{
  method: 'Network.dataReceived',
  params: {
    dataLength: 0,
    encodedDataLength: 203,
    requestId: '117.239',
    timestamp: 15184.563471
  }
}
{
  method: 'Network.loadingFinished',
  params: {
    encodedDataLength: 326,
    requestId: '117.239',
    shouldReportCorbBlocking: false,
    timestamp: 15184.552973
  }
}

需要注意的是,当在 docker 容器外部本地运行时,此函数按预期工作,API 调用返回状态码:200

PS 在 Zelenium 中运行它与在 docker 中本地运行的结果相同。

编辑:控制台日志包含以下错误:

Failed to load resource: the server responded with a status of 400 ()

标签: dockerseleniumgoogle-chromeprotractorheadless

解决方案


状态:400

status: 400表示400 Bad RequestHTTP 400 Bad Request响应状态代码表示服务器不能或不会处理请求,因为某些东西被认为是客户端错误,例如格式错误的请求语法、无效的请求消息帧或欺骗性请求路由。


您的代码试验、相关 HTML 和完整的错误堆栈跟踪方面的一些信息将帮助我们以更好的方式分析问题。但是,根据Failed to load resource: server 响应状态为 400 ()中的讨论,网页的HTML DOM似乎包含启用AJAXJavaScript的元素。

因此,当您调用get()方法时,在与特定网页上的任何元素交互之前,您需要诱导WebDriverWait以使所需元素可点击,这将确保:

  • 相关的JavaScriptAJAX 调用已完成渲染DOM 树
  • 所需元素已启用可见,以识别通过Seleniumclick传播的事件。

参考

您可以在以下位置找到一些相关的讨论:


tl; 博士

加载资源失败:服务器通过 Selenium 使用 ChromeDriver Chrome 响应状态为 429(请求过多)和 404(未找到)


推荐阅读