Puppeteer 等待所有图像加载然后截图

2024-03-15

我在用傀儡师 https://github.com/GoogleChrome/puppeteer尝试在所有图像加载后截取网站的屏幕截图,但无法使其正常工作。

这是到目前为止我正在使用的代码https://www.digg.com https://www.digg.com作为示例网站:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.digg.com/');

    await page.setViewport({width: 1640, height: 800});

    await page.evaluate(() => {
        return Promise.resolve(window.scrollTo(0,document.body.scrollHeight));
    });

    await page.waitFor(1000);

    await page.evaluate(() => {
        var images = document.querySelectorAll('img');

        function preLoad() {

            var promises = [];

            function loadImage(img) {
                return new Promise(function(resolve,reject) {
                    if (img.complete) {
                        resolve(img)
                    }
                    img.onload = function() {
                        resolve(img);
                    };
                    img.onerror = function(e) {
                        resolve(img);
                    };
                })
            }

            for (var i = 0; i < images.length; i++)
            {
                promises.push(loadImage(images[i]));
            }

            return Promise.all(promises);
        }

        return preLoad();
    });

    await page.screenshot({path: 'digg.png', fullPage: true});

    browser.close();
})();

有一个内置选项 https://github.com/puppeteer/puppeteer/blob/v18.2.1/docs/api/puppeteer.page.goto.md#remarks为了那个原因:

await page.goto('https://www.digg.com/', {"waitUntil" : "networkidle0"});

networkidle0- 当网络连接数不超过 0 且至少 500 毫秒时,认为导航已完成

networkidle2- 当网络连接不超过 2 个并持续至少 500 毫秒时,认为导航已完成。

当然,如果您使用的是像 Twitter 这样的无限滚动单页应用程序,那么它就不起作用了。

Puppeteer GitHub 问题 #1552 https://github.com/puppeteer/puppeteer/issues/1552解释背后的动机networkidle2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Puppeteer 等待所有图像加载然后截图 的相关文章

随机推荐

  • 调试器如何只查看变量的值而不是内存地址

    最近 我一直在 Visual Studio 中广泛使用结构和类 它们中的大多数都有很多值 这使得它们在调试时很难在监视窗口中跟踪 因为监视窗口和浮动监视窗口 您可以pin 不知道准确的术语 始终显示内存地址 这会模糊值的视图 有没有办法让监
  • Grunt 未定义

    刚开始使用 grunt 当我跑步时grunt我收到这个错误 Loading Gruntfile js tasks ERROR gt gt ReferenceError grunt is not defined 这是我的 Gruntfile
  • 在 UWP 应用程序中,如何重现异常,告知仅在非 UI 线程上允许同步 UI

    我无法弄清楚不同类型的线程在 UWP 应用程序中的行为方式 首先 在 UWP 中 UI 线程似乎不是主线程 而是工作线程之一 当我在事件处理程序中插入断点等时 我在调试器中看到了这一点 我的假设是CoreApplication MainVi
  • 为什么这段代码可以用 eclipse 编译器编译,但不能用 javac (maven) 编译

    诸如此类的问题还有很多 我经历了其中的大部分 但实际上没有 但我无法想出任何答案 我的 GWT GWTP 课程之一遇到了一个奇怪的问题 该类可以使用 Eclipse 编译器正常编译 但使用 javac 编译器 Maven 则编译失败 add
  • JavaScript 警报弹出表单

    我已经搜索了整个网站和谷歌 但找不到它 所以 就在这里 我想要一种在使用警报时显示表单的方法 例如 当用户单击 发布 时 会弹出一个对话框 询问用户一些问题 例如 html 表单 并允许用户单击 提交 重置 或 取消 而无需加载新页面 我已
  • 在 R 中保存工作区图像

    在 R 会话结束时关闭 R Studio 时 系统会通过对话框询问我 将工作区图像保存到 工作目录 吗 这意味着什么 如果我选择保存工作区图像 它保存在哪里 我总是选择不保存工作区图像 保存它有什么缺点吗 我查看了 stackoverflo
  • Android Studio 更新后 AVD 无法启动

    在我安装了最近发布的 921MB 更新后 我的 AVD 不再启动 我不太记得更新的实体 可能是 API SDK 修订版 我在 Debian 上使用 Android Studio 2 3 版本 AI 162 4069837 和 API 25
  • 是否可以在没有重定向服务器的情况下使用 OAuth 2.0?

    我正在尝试创建一个与 SurveyMonkey API 交互的基于 Java 的本地客户端 SurveyMonkey 需要使用 OAuth 2 0 的长期访问令牌 我对此不太熟悉 我已经在谷歌上搜索了几个小时 我认为答案是否定的 但我只是想
  • 如何在 Notepad++ 中使用富文本?

    我喜欢Notepad 但有时我需要将一些单词设置为粗体或草书 更改字体大小等 在 Notepad 中可以吗 我们可以突出显示文本 右键单击文本Style Token gt Using 1st Style通过使用这个我们可以突出显示文本 最多
  • .NET ImageList 实现中的 ImageList 容量错误?

    我在 net 应用程序中为 ListView 使用 ImageList 时遇到一些问题 在我的实现中 这个 ImageList 根据使用情况可以容纳几千个图像 这个问题最初是在我尝试处理大量图像时出现的 当我超过 5K 图像时 我在尝试添加
  • 使用 espresso 在网页视图中查找多个元素

    我正在测试一个混合应用程序 其中每个视图都有一个网络视图 在其中一个 Web 视图中 我有一个具有相同属性的元素列表 它们具有相同的 xpath 定位器 如下所示 h4 contains data role product name 我想创
  • 如何使用 vba 正确地重新格式化具有多种变化的尺寸值?

    我正在尝试创建一个 Excel 宏 将维度值格式化为我们公司的格式 这样我们就可以轻松地将数据导入到我们的系统中 而无需手动执行数千个维度 我遇到了一些问题 供应商向我们发送的维度有很多变化 这使得我很难想出某种正则表达式来捕获所有值 即使
  • 如何确认 Twitter Web 意图已发送?

    我想确认用户在点击后发布的推文Twitter 网络意图 https dev twitter com docs intents 我怎样才能做到这一点 Example a href https twitter com intent tweet
  • Pandas——根据另一个表中的值设置行值

    我在 pandas 中有两张桌子 其中大约有 10 000 多行 如下所示 Table 1 col 1 date state ratio 50 more cols A 10 12 NY 5 A 12 05 MA NaN 我有另一个大约 10
  • 在生产构建 Angular 4 中访问环境变量

    我想部署一个带有可配置 api url 的 Angular 应用程序的生产版本 供用户测试 我使用environment ts 但在生产构建之后 我不知道如何配置变量 需要采取什么方法 environment ts 文件包含构建时配置 构建
  • robots.txt htaccess 阻止谷歌

    在我的 htaccess 文件中 我有
  • 当我尝试通过 js split 解析时,第一个元素是空字符串

    我尝试解析ini文件 第一个字符串是空字符串 但其他字符串还可以 结构 sensor1 param1 value sensor2 param1 value param2 value 我的代码是 success function data v
  • 如果我使用支持库 26,为什么选项菜单项会被挤压? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 选项菜单项的大小与支持库 25 的大小相同 但当我使用 26 0 0 时 它们都会被挤压 菜单项 XML menu me
  • 用我自己的值初始化pytorch卷积层

    我想知道是否有办法用我自己的值初始化 pytorch 卷积过滤器 例如 我有一个元组 0 8423 0 3778 3 1070 2 6518 我想用这些值初始化 2X2 过滤器 我该怎么做 我查找了一些答案 但他们大多使用火炬正态分布和其他
  • Puppeteer 等待所有图像加载然后截图

    我在用傀儡师 https github com GoogleChrome puppeteer尝试在所有图像加载后截取网站的屏幕截图 但无法使其正常工作 这是到目前为止我正在使用的代码https www digg com https www