javascript - 在 Puppeteer 中从 page.evaluate 获取元素?

标签 javascript html node.js dom puppeteer

我是第一次使用 Node.jsPuppeteer,但找不到从 page.evaluate 输出值的方法到外部范围。

我的算法:

  1. 登录
  2. 打开网址
  3. 获取ul
  4. 遍历每个 li然后点击它
  5. 等待innetHTML设置并添加它的src数组的内容。

如何从 page.evaluate() 返回数据?

const puppeteer = require('puppeteer');

const CREDENTIALS = require(`./env.js`).credentials;
const SELECTORS = require(`./env.js`).selectors;
const URLS = require(`./env.js`).urls;

async function run() {
    try {
        const urls = [];
        const browser = await puppeteer.launch({headless: false});
        const page = await browser.newPage();

        await page.goto(URLS.login, {waitUntil: 'networkidle0'});
        await page.type(SELECTORS.username, CREDENTIALS.username);
        await page.type(SELECTORS.password, CREDENTIALS.password);
        await page.click(SELECTORS.submit);
        await page.waitForNavigation({waitUntil: 'networkidle0'});
        await page.goto(URLS.course, {waitUntil: 'networkidle0'});

        const nodes = await page.evaluate(selector => {
            let elements = document.querySelector(selector).childNodes;
            console.log('elements', elements);
            return Promise.resolve(elements ? elements  : null);
        }, SELECTORS.list);

        const links = await page.evaluate((urls, nodes, VIDEO) => {
            return Array.from(nodes).forEach((node) => {
                node.click();
                return Promise.resolve(urls.push(document.querySelector(VIDEO).getAttribute('src')));
            })
        }, urls, nodes, SELECTORS.video);
        const output = await links;
    } catch (err) {
        console.error('err:', err);
    }
}

run();

最佳答案

函数page.evaluate()只能返回一个serializable值,因此无法使用此方法从页面环境返回元素或 NodeList

您可以使用 page.$$()而不是获得 ElementHandle数组:

const nodes = await page.$$(`${selector} > *`); // selector children

如果常量nodeslength0,那么确保你正在等待选择器指定的元素被添加使用 page.waitForSelector() 到 DOM :

await page.waitForSelector(selector);

关于javascript - 在 Puppeteer 中从 page.evaluate 获取元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53032903/

相关文章:

jquery - 使用 JQuery 在 HTML 周围添加 Span

javascript - 无法使用 jQuery 访问页面表单和 iframe 表单

javascript - 该 block 在首次加载时显示在上 block 的顶部,并在页面刷新时固定

node.js - 如何将音频数据从 Wavesurfer 区域复制到新的音频缓冲区?

mysql - 如何在 sequelize 中创建类似于 mysql 数据类型的列?

javascript - 使用函数作为参数

javascript - Lodash 过滤并省略

javascript - Highcharts:添加自定义导出选项时在导出菜单中获取重复项目

javascript - 等待函数未并行发生

javascript - 如何使用 Inquirer 使我的 "if else"语句在此 Node 文件中正常工作?