Как перебрать асинхронную функцию в кукловоде с NodeJS - PullRequest
1 голос
/ 31 марта 2019

Я хочу сделать скриншот с кукловодом, и он работает на один пост. Но я хочу, чтобы это повторялось.

Если это нормальная функция, я могу просто написать имя функции в последней части кода, чтобы она могла повторяться. Но это асинхронная функция, поэтому я не знаю, как ее повторить.

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-адресам.

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

Поскольку вы хотите выполнять код одну итерацию за другой, можно использовать обычный цикл for (или while).Код async / await прекрасно работает с ними.

Вы можете использовать для в вашем случае, как это:

(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();
})();
1 голос
/ 31 марта 2019

Вы можете использовать любой подходящий цикл, например 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();
})();
...