Запрос webSocketDebuggerUrl из Chrome-Headless в Docker-контейнере - PullRequest
0 голосов
/ 20 декабря 2018

Настройка

Попытка запустить Chrome без монитора в качестве контейнера (Изображение: https://hub.docker.com/r/alpeware/chrome-headless-trunk) в моем docker-compose и подключение к нему из другого контейнера.

Проблема

Чтобы на самом деле подключиться к Chrome внутри контейнера, мне сначала нужно получить webSocketDebuggerUrl, который доступен по адресу http://0.0.0.0:9222/json/version Chrome-Headless.

Проблема в том, что мой запрос к этомупуть всегда терпит неудачу с

RequestError: Ошибка: подключите 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

Если я пытаюсь запросить webSocketDebuggerUrl из / json / version, используя адрес имени контейнера (http://chrome:9222/json/version) я получаю ошибку

StatusCodeError: 500 - «Заголовок хоста указан и не является IP-адресом или локальным хостом.»

Мой код (абстракция)

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 })

1 Ответ

0 голосов
/ 20 декабря 2018

Ну, так как errorMessage из 500 сказал "хост указан", я просто установил этот заголовок пустым, и теперь я могу успешно запросить 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 })
...