从Puppeteer中的page.evaluate获取元素?

Bon*_*000 3 html javascript dom node.js 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();
Run Code Online (Sandbox Code Playgroud)

Gra*_*ler 6

该函数page.evaluate()只能返回可序列化的值,因此无法NodeList使用此方法从页面环境返回元素或返回。

您可以改用page.$$()获取ElementHandle数组:

const nodes = await page.$$(`${selector} > *`); // selector children
Run Code Online (Sandbox Code Playgroud)

如果length常量nodes0,则请确保您正在等待选择器指定的元素添加到DOM中,方法是page.waitForSelector()

await page.waitForSelector(selector);
Run Code Online (Sandbox Code Playgroud)