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.
相关产品推荐
相关产品推荐

