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

标签 javascript node.js screenshot puppeteer google-chrome-headless

puppeteer 截取屏幕截图之前,我试图让代码执行等待所有图像加载完毕。当调用 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)

提前致谢。

最佳答案

As mentioned in another answer ,图像元素具有 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)

关于javascript - 当使用客户端函数填充 DOM 时,如何等待从 page.evaluate 中的 page.evaluate 函数加载所有图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51651830/

相关文章:

javascript - 标准伪随机数生成器无法承受 jquery.js 文件中 math.random() 函数的加密攻击

c# - ScreenShot上的GDI +一般错误

c# - 网页截图的最佳方式

javascript - html页面连续滚动

Javascript 使用 Date() 返回未定义的递归函数

python - 有没有办法通过 JavaScript 在我的网站中使用 TensorFlow 模型?

node.js - Mongoose 填充多个嵌套文档

node.js - 使用nodeJS在Sequelize中创建一行后如何重新加载表?

continuous-integration - 即使指定了另一种颜色,Frameit 也始终以黑色打印标题/关键字

c# - 如何将 xml 字符串从 .cs 文件传递​​到 javascript 函数?