【问题标题】:Get elements from page.evaluate in Puppeteer?从 Puppeteer 中的 page.evaluate 获取元素?
【发布时间】:2019-04-01 15:23:33
【问题描述】:

我是第一次使用 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();

【问题讨论】:

  • Wait for innetHTML to be set,你在哪里做这个?

标签: javascript html node.js dom puppeteer


【解决方案1】:

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

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

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

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

await page.waitForSelector(selector);

【讨论】:

    【解决方案2】:
    let elementsHendles = await page.evaluateHandle(() => document.querySelectorAll('a'));
    let elements = await elementsHendles.getProperties();
    let elements_arr = Array.from(elements.values());
    

    【讨论】:

      【解决方案3】:

      使用 page.evaluateHandle()

      API 是:here

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 2020-01-25
        • 2023-03-22
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 2021-05-26
        相关资源
        最近更新 更多