当使用客户端函数填充 DOM 时,如何等待从 puppeteer 中的 page.evaluate 函数加载所有图像

2024-04-29

我试图让代码执行等待所有图像加载之前木偶师截屏。当调用 initData() 函数时,我的 DOM 会被填充,该函数是在客户端 js 文件中定义的。延迟或超时是一种选择,但我确信必须有一种更有效的方法来做到这一点。

    (async (dataObj) => {
             const url = dataObj.url;
             const payload = dataObj.payload;
             const browser = await puppeteer.launch({ headless: false,devtools:false});
             const page = await browser.newPage();
             await page.goto(url,{'waitUntil': 'networkidle0'});

             await page.evaluate((payload) => {
               initData(payload);
                //initData is a client side function that populates the DOM, need to wait 
                //here till the images are loaded. 
               },payload)

             await page.setViewport({ width: 1280, height: 720 })
             await page.screenshot({ path: 'test.png' });
             await browser.close();
    })(dataObj)

提前致谢。


正如另一个答案中提到的 https://stackoverflow.com/a/51652947/8492116,图像元素有一个complete财产。您可以编写一个函数,在获取文档中的所有图像后返回 true:

function imagesHaveLoaded() { return Array.from(document.images).every((i) => i.complete); }

你可以像这样等待这个函数:

await page.waitForFunction(imagesHaveLoaded);

将两者与原始代码放在一起并添加超时,这样它就不会无限期地等待,我们得到:

function imagesHaveLoaded() {
    return Array.from(document.images).every((i) => i.complete);
}

(async (dataObj) => {
         const url = dataObj.url;
         const payload = dataObj.payload;
         const browser = await puppeteer.launch({ headless: false, devtools: false});
         const page = await browser.newPage();
         await page.goto(url, { waitUntil: 'networkidle0' });

         await page.evaluate((payload) => {
           initData(payload);
         }, payload);

         await page.waitForFunction(imagesHaveLoaded, { timeout: YOUR_DESIRED_TIMEOUT });

         await page.setViewport({ width: 1280, height: 720 })
         await page.screenshot({ path: 'test.png' });
         await browser.close();
})(dataObj)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当使用客户端函数填充 DOM 时,如何等待从 puppeteer 中的 page.evaluate 函数加载所有图像 的相关文章

随机推荐

  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • 如何在 Android WebView 中从远程 URL 访问本地资源?

    要加载 HTML 中的资源 我使用 URLfile android asset my image png 当我在本地加载 HTML 时 它可以工作 例如 使用WebView loadData method 但是 我无法从远程网站加载本地资源
  • 使用 JsonWriter 时,WriteStartConstructor 的用途是什么?

    标题说明了一切 我看到它 及其相应的结尾 吐出以下内容 new Foo 但我不明白什么new实际上是在反序列化时执行的 文档只是说它编写了一个 Json 构造函数 但没有说 Json 构造函数是什么is 此方法是作为增强功能的一部分引入的
  • React textarea 的值是只读的,但需要更新

    我的 React 应用程序中有一个文本区域 其中填充了一个值 我希望更新此文本区域并提交表单以更新数据库中的行
  • 在 iOS 8 中呈现相机权限对话框

    当我的应用程序在 iOS 8 上第一次尝试访问摄像头时 会向用户显示一个摄像头权限对话框 很像 iOS 7 中用于访问麦克风的麦克风对话框 在 iOS 7 中 可以预先调用麦克风权限对话框并查看是否授予了权限 请参阅这个问题 https s
  • 将数据导入 Django 的好方法

    我想定期将数据导入 Django 项目 我需要告诉我的数据提供者我想要以什么格式接收数据 我应该以 Json XML CSV 格式请求吗 在 Django 中通常如何处理这个问题 Django 有一个用于导入数据的完整框架 称为 Fixtu
  • 无法使用 process.ErrorDataReceived c# 获取进程错误输出

    我已经建立了Form我使用了一段时间的应用程序 现在我想捕捉StandardError我的流程及其standartOutput 我查看了答案SO and MSDN https msdn microsoft com en us library
  • jquery 可以操作用 DOM 创建的临时文档吗?

    我想要实现的目标是通过传递一个大的 html 字符串来操作使用 jquery 使用 DOM 创建的文档 考虑以下示例 var doctype document implementation createDocumentType html v
  • 如何在库的上下文中实例化 Spring?

    我正在寻找一个示例 该示例展示了如何在打包在普通旧的 不可执行的 java 库 JAR 中的一组类的上下文中实例化 Spring 容器 这里的核心目的是提供依赖注入 主要用于日志记录 我认为最根本的问题是不可执行的 jar 没有单一的启动点
  • 如何接收在 PHP 中使用“application/octet-stream”发送的 POST 数据?

    这就是我正在处理的事情 我们的一个计划有一个支持表格 用户可以使用它来请求支持 此表单的作用是 它向 PHP 脚本执行 HTTP POST 请求 该脚本应该收集信息并将其转发到支持电子邮件地址 POST 请求包含三个类型的文本字段Conte
  • 如何提取数字(以及比较形容词或范围)

    我正在用 Python 开发两个 NLP 项目 它们都有类似的任务提取数值和比较运算符来自句子 如下所示 greater than 10 weight not more than 200lbs height in 5 7 feets fas
  • 测试 WebApi 控制器时如何生成 Asp.net 用户身份

    我正在使用 Web API 2 在 web api 控制器中我使用过GetUserId使用 Asp net Identity 生成用户 ID 的方法 我必须为该控制器编写 MS 单元测试 如何从测试项目访问用户 ID 我在下面附上了示例代码
  • 从实体框架模型构建数据库架构

    我发现 EF 可以根据现有数据库架构更新模型 然而 我完全从头开始 那我不想建表了rebuild它们位于 EF 模型文件中 有没有一种方法可以绘制模型文件 并自动为我创建 SQL 表 不幸的是 您必须等待 EF 版本 2 这是一个链接 ht
  • HQL 对象命名参数

    我想知道是否可以从 HQL 中名为参数的对象中检索特定列 Example public class Product private int id private Supplier supplier private String name p
  • MDI应用程序中父窗体的问题

    我使用按钮作为容器中的控件 父窗体 当子窗体出现时 父窗体中的控件 按钮 图片 标签 出现在子窗体上并将其覆盖 我看不到子窗体 有谁知道如何防止这种情况 我不想将这些控件设置为 Control Visible false 因为当我最小化子表
  • 使用 Slick String 插值有条件地更新字段

    我有两个Options val name Option String val shared Option Boolean 我想建立一个UPDATE查询那个SET如果上述值是这些字段Some 但如果它们是 则保持不变None 我已经成功地实现
  • 页面内容中 html 实体的 Rspec 测试

    我正在编写一个请求规范 并想测试字符串 Reports Aging Reports 是否存在 如果我直接将字符放入匹配器表达式中 我会收到错误 无效的多字节字符 所以我尝试了以下操作 page should have content Rep
  • 尝试从 Excel 添加附件到电子邮件,但仅知道文件名的第一部分

    我有一个宏 每天用来将自动生成的文件附加到电子邮件中 文件名需要采用某种格式 其中包括日期和时间 并且由于这是自动的 因此只能固有地知道日期 无需手动检查文件 我在用 Attachments Add and format date etc
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • 当使用客户端函数填充 DOM 时,如何等待从 puppeteer 中的 page.evaluate 函数加载所有图像

    我试图让代码执行等待所有图像加载之前木偶师截屏 当调用 initData 函数时 我的 DOM 会被填充 该函数是在客户端 js 文件中定义的 延迟或超时是一种选择 但我确信必须有一种更有效的方法来做到这一点 async dataObj g