首页 > 解决方案 > $eval 未能在 foreach 循环内选择

问题描述

我有一个代码,我需要在 foreach 循环中执行 $eval 但它不工作,它抛出 item.$eval 不是函数的错误。

但是“项目”成功创建没有问题

let items = await newPage.$$eval('.slide', el => el);

items.forEach(async (item) => {

    let ProductName = '';
    try {
        ProductName = await item.$eval('.name', el => el.innerText);
    } catch (error) {
    }
});

标签: node.jspuppeteer

解决方案


函数中的参数page.$$eval()是一个元素数组。您只需将这个元素数组从浏览器上下文返回到 Node.js 上下文,但由于 DOM 元素不可序列化,您只会得到一个空对象数组,它们没有.$eval()方法。

您可以改为使用page.$$()来获取 ElementHandles 数组。此外,最好将 for-of 循​​环与异步函数一起使用,而不是.forEach()使流程更可预测:

let items = await newPage.$$('.slide');

for(const item of items) {
    let ProductName = '';
    try {
        ProductName = await item.$eval('.name', el => el.innerText);
    } catch (error) {
    }
}

推荐阅读