web-dev-qa-db-ja.com

Puppeteerでpage.evaluateから要素を取得しますか?

Node.jsおよびPuppeteerを初めて使用していて、_page.evaluate_から外部スコープに値を出力する方法が見つかりません。

私のアルゴリズム:

  1. ログインする
  2. URLを開く
  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();
_
4
Bong2000

関数 page.evaluate()serializable 値のみを返すことができるため、要素またはNodeListをページから返すことはできませんこのメソッドを使用する環境。

代わりに page.$$() を使用して ElementHandle 配列を取得できます:

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

定数lengthnodesが_0_である場合、セレクタによって指定された要素が page.waitForSelector()

_await page.waitForSelector(selector);
_
9
Grant Miller