#javascript #node.js #async-await #puppeteer
#javascript #node.js #async-ожидание #puppeteer
Вопрос:
Я хочу сделать скриншот с помощью puppeteer, и это работает для одного поста. Но я хочу выполнить итерацию.
Если это обычная функция, я могу просто написать имя функции в последней части кода, чтобы она могла выполнять итерации. Но это асинхронная функция, поэтому я не знаю, как ее выполнить.
const puppeteer = require('puppeteer');
let postNumber = 1;
let by;
(async () => {
const browser = await puppeteer.launch({
executablePath: 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
userDataDir: 'C:\Users\{computerName}\AppData\Local\Google\Chrome\User Data',
headless: false
}); // default is true
const page = await browser.newPage();
await page.goto(`https://band.us/band/{someNumbers}/post/${postNumber}`, {
waitUntil: 'networkidle2'
});
let element = await page.$('.boardList');
by = await page.evaluate(() => document.getElementsByClassName('text')[0].textContent);
console.log(by);
await element.screenshot({
path: `./image/${postNumber}-${by}.png`
});
console.log(`SAVED : ${postNumber}-${by}.png`)
postNumber ;
await browser.close();
})();
После завершения функции переменная postNumber должна быть увеличена на единицу. А затем снова запустите код по новым URL.
Ответ №1:
Поскольку вы хотите запускать код одну итерацию за другой, можно использовать обычный цикл for (или while). код async / await отлично работает с ними.
В вашем случае вы можете использовать for следующим образом:
(async () => {
const browser = await puppeteer.launch(/* ... */);
const page = await browser.newPage();
for (let postNumber = 1; postNumber < 10; postNumber ) {
await page.goto(/* ... */);
let element = await page.$('.boardList');
// ...
}
await browser.close();
})();
Ответ №2:
Вы можете использовать любой подходящий цикл, например while
-loop:
'use strict';
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
executablePath: 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
userDataDir: 'C:\Users\{computerName}\AppData\Local\Google\Chrome\User Data',
headless: false
}); // default is true
const page = await browser.newPage();
let postNumber = 1;
while (postNumber <= 10) {
await page.goto(`https://band.us/band/{someNumbers}/post/${postNumber}`, {
waitUntil: 'networkidle2'
});
const element = await page.$('.boardList');
const by = await page.evaluate(() => document.getElementsByClassName('text')[0].textContent);
console.log(by);
await element.screenshot({
path: `./image/${postNumber}-${by}.png`
});
console.log(`SAVED : ${postNumber}-${by}.png`)
postNumber ;
}
await browser.close();
})();