Тест кукловода в forEach - PullRequest
       27

Тест кукловода в forEach

1 голос
/ 13 июля 2020

У меня есть набор файлов в папке с указанными c именами, и я использую node, чтобы вернуть мне имена этих файлов, а затем для каждого файла я хочу запустить тест кукольника, который заполняет форму и отправляет ее, но Кажется, у меня проблемы с forEach, не дожидаясь, пока предыдущий тест завершит sh, и в итоге получил множество 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 Ответ

1 голос
/ 13 июля 2020

Сложно использовать Array.forEach с async / await, так как все итераторы будут выполнены, но forEach вернется до того, как все они завершат выполнение sh, что во многих случаях нежелательно. с функциями asyn c.

См. сравнительный анализ щелчков кукловода в map vs. forEach vs. for ... здесь , который дает картину того, что происходит.

Решения

I.) Пока вы повторяете основной сценарий кукловода, я бы решил его либо , рефакторинг forEach на for...of l oop, it приводит к немного худшей производительности, поскольку выполнение происходит в строгом порядке, а не параллельно, но оно все еще соответствует вашим ожиданиям:

дождитесь, пока кукольник завершит тест, а затем запустите следующий элемент

II.) Или вы можете создать свой собственный "asyn c forEach" метод.

Например:

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

источник метода asyncForEach: Себастьен Шопен: JavaScript: async / await с forEach () (codeburst.io)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...