我在一个文件夹中有一组具有特定名称的文件,我使用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();
})();
});
});
答案 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)