Node.jsおよびPuppeteerを初めて使用していて、_page.evaluate
_から外部スコープに値を出力する方法が見つかりません。
私のアルゴリズム:
ul
を取得li
をループしてクリックします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
_
定数length
のnodes
が_0
_である場合、セレクタによって指定された要素が page.waitForSelector()
:
_await page.waitForSelector(selector);
_