google-chrome - 我的容器化 Puppeteer 如何与我的主机 Chrome 通信?

标签 google-chrome docker puppeteer

我让 Puppeteer 在一个容器内工作,该容器有自己的 headless Chrome/Chromium,它将连接到在不同容器上运行的我的 Web 应用程序。一切正常。

我希望容器内的 Puppeteer 使用我的主机 Google Chrome(或 Chromium,这并不重要)运行我的 Web 应用程序。我一直在寻找类似的东西,但没有找到有关此事的文档。

我该怎么做?

最佳答案

告诉 puppeteer 连接到本地计算机上的 chrome 实例,而不是 docker 容器中的 headless 版本

  1. 通过在终端上运行 /Applications/Google\Chrome.app/Contents/MacOS/Google\Chrome --remote-debugging-port=9222 以 Debug模式运行 chrome/chromium 。这应该会给你一个 Websocket 调试 URL。这应该如下所示:ws://host.docker.internal:9222/devtools/browser/d7db2629-0930-4741-a6ca-78ff70863c20

  2. 在您的 docker 开发设置中,告诉 docker 公开端口 9222。这是我们指定的chrome的调试端口。在运行 puppeteer 的服务的 yml 部分中执行以下操作:

service-name:
  build: "..."
  volumes:
    - ....
    - ....
  ports:
    - 3010:3010
    - 9222:9222  <--- Add this

然后重新初始化/重启docker容器

docker-compose down
docker-compose up
  • 现在代码更改:
  • const browser = await puppeteer.launch({ args });
    

    const browser = await puppeteer.connect({
      browserWSEndpoint:
        "ws://host.docker.internal:9222/devtools/browser/d7db2629-0930-4741-a6ca-78ff70863c20"
    });
    

    现在,puppeteer 应该连接到本地计算机上的 chrome,并且您应该看到它实时执行所有操作! 😎

    PS:

    或者如果您不想一次又一次复制生成的网址。 你可以做

    
    const response = await axios.get(
      "http://host.docker.internal:9222/json/version",
      {
        headers: { Host: "127.0.0.1:9222" }
      }
    );
    const browserWSEndpoint = response.data.webSocketDebuggerUrl.replace(
      /127.0.0.1/g,
      "host.docker.internal"
    );
    const browser = await puppeteer.connect({ browserWSEndpoint });
    

    这可以从 chrome 获取调试 websocket url

    关于google-chrome - 我的容器化 Puppeteer 如何与我的主机 Chrome 通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175788/

    相关文章:

    wordpress - Cloudflare 灵活的 SSL 问题?

    html - 在 Chrome 的检查器开发工具 ("Inspector stylesheet"中添加新空白样式表的最快方法)

    python - 在哪里可以找到 tensorflow-serving URL?

    javascript - puppeteer 师得到错误 : Evaluation failed: TypeError: Cannot read properties of null (reading 'innerText' ) when returning multiple values

    javascript - 为什么 Service Worker 在本地主机上运行时似乎不写入 Google Chrome 中的控制台?

    css - Chrome 浏览器的 Skrollr 问题

    linux - 无法确定 Docker 中重定向的 https 端口

    mongodb - 等待其他部署开始运行,然后再创建其他部署?

    javascript - Puppeteer - 使用 '--allow-file-access-from-files' 通过 XMLHttpRequest 加载本地文件不起作用

    google-chrome - 如何使用 puppeteer 的 API page.addScriptTag 绕过 CSP(Content-Security-Policy)?