如何等待特定选择器的所有实例加载到puppeteer?

时间:2018-02-12 11:51:09

标签: javascript node.js puppeteer

正如标题所说,有任何方法可以等待特定类的所有实例,比如一个名为" div.ticket"的选择器。载入。我尝试使用waitForNavigation({waitUntil: "networkidle2"});,但是它花了太长时间,我试图从页面中获取一个pdf,其中包含多个票据,所有这些都在一个div中,并且有#34; ticket"但是当我在没有任何waitFor的情况下运行它时,没有正确获得票证(图像和一些文本丢失)。我也试过page.waitFor('.ticket');,但它没有提供所需的输出。

1 个答案:

答案 0 :(得分:0)

如果您想等待所有元素,您必须知道它们应该有多少。以下是每1秒创建.ticket的示例。因此,当您知道页面上应该有3张票时,您应该等待page.waitFor('.ticket:nth-of-type(3)')

const puppeteer = require('puppeteer');

const html = `
<html>
    <head></head>
    <body>
        <div class="tickets"></div>
        <script>
            const ticketsContainer = document.querySelector('.tickets');
            let i = 0;
            const timeInterval = setInterval(
                () => {
                    const newTicket = document.createElement("div");
                    newTicket.innerHTML = "ticket" + i;
                    newTicket.className = "ticket";
                    ticketsContainer.appendChild(newTicket);
                    i++;
                    if (i >= 3) {
                        clearInterval(timeInterval);
                    }
                }, 
                1000
            );
        </script>
    </body>
</html>`;

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(`data:text/html,${html}`);
    // await page.waitFor('.ticket');
    await page.waitFor('.ticket:nth-of-type(3)');
    await page.screenshot({ path: 'image.png' });
    await browser.close();
})();