setContent
时,puppeteer 正在关闭我的页面。
如何调试为什么会发生这种情况?
代码:
chrome = await puppeteer.launch();
page = await chrome.newPage();
await page.setUserAgent(ua);
await page.setViewport({width: Number(width), height: Number(height)});
console.warn("here4");
if (input) {
console.warn("input found");
await page.setContent(input);
}
console.warn("here5");
日志:
2025-01-20T00:54:47.099Z puppeteer:browsers:launcher Launching /home/user/.cache/puppeteer/chrome-headless-shell/linux-132.0.6834.83/chrome-headless-shell-linux64/chrome-headless-shell --allow-pre-commit-input --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-crash-reporter --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-hang-monitor --disable-infobars --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-search-engine-choice-screen --disable-sync --enable-automation --export-tagged-pdf --force-color-profile=srgb --generate-pdf-document-outline --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --disable-features=Translate,AcceptCHFrame,MediaRouter,OptimizationHints,ProcessPerSiteUpToMainFrameThreshold,IsolateSandboxedIframes --enable-features=PdfOopif --headless --hide-scrollbars --mute-audio about:blank --remote-debugging-port=0 --user-data-dir=/tmp/puppeteer_dev_chrome_profile-BQX8Ok { detached: true, env: {}, stdio: [ 'pipe', 'ignore', 'pipe' ] }
2025-01-20T00:54:47.116Z puppeteer:browsers:launcher Launched 2692983
here4
input found
2025-01-20T00:54:47.490Z puppeteer:browsers:launcher Trying to kill 2692983
2025-01-20T00:54:47.490Z puppeteer:browsers:launcher Browser process 2692983 exists
/home/user/v14-staging/apps/node_modules/puppeteer-core/lib/cjs/puppeteer/common/CallbackRegistry.js:80
this._reject(callback, new Errors_js_1.TargetCloseError('Target closed'));
编辑: 打印“Trying to Kill”的函数是 Process 类上的kill() https://github.com/puppeteer/puppeteer/blob/89f4f3b1079874b2dd91c727bc058c1b6e09096e/packages/browsers/src/launch.ts#L408 然而,看起来这只是对目标被关闭做出的反应。
在协议跟踪中,在我执行
page.setViewport
之后,我看到:
2025-01-21T00:02:12.267Z 木偶师:协议:发送 ► [
'{“method”:“Target.closeTarget”,“params”:{“targetId”:“F8275C626B6FC4F650B5D03DA59FECD9”},“id”:4}'
]
但我不会在我的代码中发送它
代码中只有两个地方发送此消息:webworker 和 page。最合乎逻辑的地方是这里的页面: https://github.com/puppeteer/puppeteer/blob/89f4f3b1079874b2dd91c727bc058c1b6e09096e/packages/puppeteer-core/src/cdp/Page.ts#L1143
所以看起来在我调用 page.setViewport 之后有东西正在调用 page.close()
编辑2: 搞乱了代码,如果我在打开页面后等待,看起来好像有东西正在调用 page.close()
看起来 puppeteer 不喜欢您在加载任何内容之前调用
page.setViewport
。
如果你这样做,看起来就像调用了 page.close() 。
如果有人尝试使用 puppeteer 调试问题,我建议从 shell 中使用此行启动它:
env DEBUG="puppeteer:*" node puppeteer_script.js "$@" <&0
这应该可以帮助您找到问题。
编辑:
实际上划掉我上面的答案。
我认为提前终止的真正原因是我正在使用异步函数进行屏幕截图,但忘记了通话中的
await
。
因此父函数在承诺解决之前关闭了浏览器。