如何使用NodeJS在puppeteer中迭代异步函数

时间:2019-03-31 15:40:29

标签: javascript node.js async-await 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变量加1。然后通过新的URL再次运行代码。

2 个答案:

答案 0 :(得分:2)

由于您要一次又一次地运行代码,因此可以使用常规的for(或while)循环。异步/等待代码可以很好地解决这些问题。

您可以在这种情况下使用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();
})();

答案 1 :(得分:1)

您可以使用任何合适的循环,例如while-循环:

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