【问题标题】:How to check if element exists inside async / await with Puppeteer如何使用 Puppeteer 检查元素是否存在于异步/等待中
【发布时间】:2020-01-20 06:43:19
【问题描述】:

在检查页面上的元素是否存在后,我无法记录它。我所指的代码块位于 "// phone" 注释下。

此代码循环遍历页面上的每个部分(部分的部分)并记录“公司”和“电话”。 “电话”可能不会出现在某些部分,所以我想我会通过 if 语句来检查它是否存在。这会产生一个错误 =“错误:未能找到匹配选择器“.mn-contact-phone”的元素”我该如何解决?

(async () => {
    try {
        const browser = await puppeteer.launch({ headless: true });
        const page = await browser.newPage();

        // loop through pages
        for (let pg = 1; pg < 5; pg++) {
            await page.goto("webpage");

            // record number of sections
            const sections = await page.$$("#mn-members-listings > div");

            // loop through each section
            for (const section of sections) {
                // company
                let company = await section.$eval(
                    "div.mn-searchlisting-title",
                    comp => comp.innerText
                );

                // phone --> THIS IF/ELSE THROWS AN ERROR
                if (section.$(".mn-contact-phone").length > 0) {
                    let phone = await section.$eval(".mn-contact-phone", phn => phn.innerText);
                } else {
                    let phone = "";
                }

                console.log(`Company = ${company} | Phone = ${phone}`);
            }
        }
        await browser.close();
    } catch (error) {
        console.log(`Our error is = ${error}`);
    }
})();

【问题讨论】:

    标签: javascript async-await puppeteer


    【解决方案1】:

    来自puppeteer docs

    该方法在页面内运行document.querySelector。如果没有元素 匹配选择器,返回值解析为null

    1) null 没有长度。

    2) ElementHandle.$ 返回一个承诺。

    将条件改为:

    if (await section.$(".mn-contact-phone"))
    

    或者如果有多个元素:

    if (await section.$$(".mn-contact-phone").length > 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-01-22
      • 2018-05-22
      • 2018-01-29
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多