设置
尝试在我的 docker-compose 中将 chrome headless 作为容器运行(图片:https://hub.docker.com/r/alpeware/chrome-headless-trunk)并从另一个容器连接到它。
问题
要实际连接到容器内的 chrome,我首先需要检索 webSocketDebuggerUrl,它位于 http://0.0.0.0:9222/json/version。 chrome-headless.
问题是:我对这条路径的请求总是失败
RequestError: Error: connect ECONNREFUSED 0.0.0.0:9222
并且无法让 webSocketDebuggerUrl 连接到 chrome。
更多信息
另外,如果我访问 http://0.0.0.0:9222/json/version在我自己的浏览器中,复制 url 并将其硬编码到我的 puppeteer.connect() 中,如果我将“0.0.0.0”的地址替换为我的(链接的)容器名称(在 docker-compose 中指定),它只能按预期工作): http://chrome:9222/json/version
如果我在使用容器名称地址 ( http://chrome:9222/json/version ) 时尝试从/json/version 请求 webSocketDebuggerUrl,我会收到错误
StatusCodeError: 500 - "Host header is specified and is not an IP address or localhost."
我的代码(抽象)
const rp = require('request-promise')
const puppeteer = require('puppeteer-core')
let url = await rp({uri:'http://0.0.0.0:9222/json/version', json: true }).then(res => res.webSocketDebuggerUrl)
let browser = await puppeteer.connect({ browserWSEndpoint: url })
最佳答案
好吧,因为来自 500 的错误消息说“主机已指定”,我只是将该 header 设置为空,现在我可以成功请求 webSocketDebuggerUrl。
这个解决方案感觉有点老套,所以如果有人对如何改进它有建议,我会很高兴:
const puppeteer = require('puppeteer-core')
const rp = require('request-promise')
let websocket = await rp({uri:'http://chrome:9222/json/version', json: true, headers: {'Host': ''} })
.then(res => res.webSocketDebuggerUrl.replace('ws://','ws://chrome:9222'))
let browser = await puppeteer.connect({ browserWSEndpoint: websocket })
关于docker - 在 Docker 容器中从 Chrome-Headless 请求 webSocketDebuggerUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867751/