forEach中的木偶测试

时间:2020-07-13 09:55:55

标签: node.js asynchronous puppeteer

我在一个文件夹中有一组具有特定名称的文件,我使用node向我返回这些文件的名称,然后针对每个文件,我要运行一个伪造者测试,该测试将填写表格并提交,但是我似乎forEach遇到问题,没有等待上一个测试完成,并最终加载Execution context was destroyed,这显然使我的测试无法完成。我最终让用户登录,但是在某些情况下page.type页面未运行...

我该如何等待伪人完成测试,然后在forEach中运行下一个元素?

请参见下面的代码:

fs.readdir(testFolder, async (err, files) => {
  files.forEach(file => {
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({
    width: 1920,
    height: 1080
  });
  await page.goto('www.mypage.com');
  //login
  // some login code here
  await page.click('#register')
  await page.waitForNavigation();
  console.log('New Page URL:', page.url());

  await page.waitForSelector('#firstName');
  await page.waitFor(1000);

  await page.type('#firstName', file);
  // register and wait for nagivation (in my case it is a page reload)
  await page.waitForSelector('#updateProfile');
  await page.click('#updateProfile');
  await page.waitForNavigation();
  await browser.close();
})();
});

});

1 个答案:

答案 0 :(得分:1)

Array.forEach与async / await一起使用是棘手的,因为所有迭代对象都将被执行,但是forEach将在它们全部完成执行之前返回,这在许多情况下不是可取的行为。异步功能。

here的map vs.forEach vs.for ...中查看伪造者点击的基准,它给出了发生的情况。


解决方案

I。)当您迭代主要的伪操纵者脚本时,我会通过将forEach重构为for...of循环来解决执行时的性能是严格执行的,而不是并行执行的,但是仍然符合您的期望:

等待木偶完成测试,然后运行下一个元素

II。),也可以创建自己的“异步同步” 方法。

例如:

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array)
  }
}

asyncForEach方法的来源:Sebastien Chopin: JavaScript: async/await with forEach() (codeburst.io)