首页 > 解决方案 > 单击页面 puppeteer 中的每个“a”标签

问题描述

我试图让 puppeteer 转到页面中的所有标签并加载它们,将它们添加到数组中并返回它。我的 puppeteer 版本是 1.5.0。这是我的代码:

module.exports.scrapeLinks = async (page, linkXpath) => {

    page.waitForNavigation();
    linksElement = await page.$x(linkXpath);
    var url_list_arr = [];
    console.log(linksElement.length);
    i=1;
    for(linksElementItem in linksElement)
    {
        const linksData = await page.$x('(' + linkXpath + ')[' + (i + 1) +']');
        if (linksData.length > 0) {
            linksData[0].click();
            console.log(page.url());
            url_list_arr.push(page.url());
        } 
        else {
          throw new Error('Link not found');
        }



    }

    return url_list_arr;

};

但是,使用此代码,我得到了

UnhandledPromiseRejectionWarning:错误:节点不可见或不是 HTMLElement

我还通过文档发现无法在 page.click 函数上使用 xpath。有没有办法做到这一点?

如果有从页面获取所有链接的功能也可以,但我在文档中找不到它。

标签: node.jsxpathpuppeteer

解决方案


要获取a数组中所有 -tags 的句柄:

const aTags= await page.$$('a')

通过它们循环:

for (const aTag of aTags) {...}

在循环内部,您可以elementHandle分别与其中的每一个进行交互。

注意

await aTag.click()

elementHandles导航页面上下文时将全部销毁(垃圾收集) 。在这种情况下,您需要一种解决方法,例如在循环中加载初始页面以始终从新实例开始。


推荐阅读