You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer截图为上一页面而非当前页,两次调用screenshot才生效问题求解

异常触发原因

核心问题是 Puppeteer 页面导航监听的调用时序错误:

  • page.waitForNavigation() 用于监听即将触发的页面跳转事件,正确逻辑是先启动该监听,再执行会触发跳转的操作(如点击搜索按钮),最后等待监听和操作同时完成。你的代码中先执行了await searchLink.click()触发搜索跳转,之后才调用waitForNavigation,此时跳转的启动信号已经发出,waitForNavigation要么无法捕获到跳转完成事件,要么直接超时,导致后续截图默认在旧页面执行。
  • 两次截图能生效完全是巧合:第一次不带await的page.screenshot是异步耗时操作,无意中给页面跳转留了足够的缓冲时间,执行到第二次截图时页面刚好加载完成,才拿到了正确结果。只要修改逻辑破坏这个时间差,功能自然失效。

修复方案

调整导航监听和点击操作的顺序,跳转完成后仅需一次截图即可,修复后的代码片段如下:

let searchLink = await page.$('input[alt="Search"]')
// 先启动跳转监听,再执行点击操作,等待跳转完全结束
await Promise.all([
  page.waitForNavigation(),
  searchLink.click()
])

// 若目标列表是客户端异步渲染的,可加一行等待列表元素加载完成,更稳妥
// await page.waitForSelector('目标列表的CSS选择器')

// 跳转完成后只需一次截图即可拿到正确结果
await page.screenshot({path: '/screen_shots/page.png'})

// 后续关闭浏览器逻辑记得加await
await browser.close()

内容的提问来源于stack exchange,提问作者Fred J.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:54:06