Как выполнить итерацию асинхронной функции в puppeteer с помощью NodeJS

#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();
})();