从 Chrome-Headless in Docker Container 请求 webSocketDebuggerUrl
Requesting webSocketDebuggerUrl from Chrome-Headless in Docker Container
设置
尝试在我的 docker-compose 中 运行 chrome 无头容器(图片:https://hub.docker.com/r/alpeware/chrome-headless-trunk)并从另一个容器连接到它。
问题
要实际连接到容器内的 chrome,我首先需要检索 webSocketDebuggerUrl,它位于 chrome-headless 的 http://0.0.0.0:9222/json/version。
问题是:我对这条路径的请求总是失败
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 的错误消息说 "host is specified",我只需将 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-compose 中 运行 chrome 无头容器(图片:https://hub.docker.com/r/alpeware/chrome-headless-trunk)并从另一个容器连接到它。
问题
要实际连接到容器内的 chrome,我首先需要检索 webSocketDebuggerUrl,它位于 chrome-headless 的 http://0.0.0.0:9222/json/version。
问题是:我对这条路径的请求总是失败
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 的错误消息说 "host is specified",我只需将 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 })