告诉 puppeteer 连接到本地机器上的 chrome 实例,而不是 docker 容器中的无头版本
通过在终端上运行 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 在调试模式下运行 chrome/chromium。这应该会给你一个 Websocket 调试 url。这应该如下所示:ws://host.docker.internal:9222/devtools/browser/d7db2629-0930-4741-a6ca-78ff70863c20。
在您的 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:
或者如果您不想一次又一次地复制生成的 url。
你可以这样做
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