【问题标题】:Click on every 'a' tag in page puppeteer单击页面 puppeteer 中的每个“a”标签
【发布时间】:2018-12-04 05:14:36
【问题描述】:

我试图让 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:错误:节点不可见或 不是 HTML 元素

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

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

【问题讨论】:

    标签: node.js xpath puppeteer


    【解决方案1】:

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

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

    循环遍历它们:

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

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

    注意

    await aTag.click()
    

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

    【讨论】:

    • 感谢您的回答。一件事,根据文档,1.5.0 中没有 $click 方法。这是点击()。该循环仅第一次工作,第二次出现错误Cannot find context with specified id undefined。我认为这是因为单击上一个元素更改了页面对象。是否有可能解决这个问题?
    • (感谢您发现 .click() 的错误语法。我编辑了我的帖子。)当它们的父上下文被导航时,所有 elementHandles 都被销毁(垃圾收集)。您可以做的是将初始页面加载移动到循环中。并且循环中的每一轮都增加一个计数器 N,然后单击第 N 个 a-tag。然后,您总是单击初始页面的新上下文。当您需要代码来执行此操作时,请告诉我。
    • 完美,这解释了问题。所以我将在循环中加载一个新页面。我会努力告诉你的,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多