Puppeteer - 使用等待内部循环

时间:2018-06-05 13:34:34

标签: javascript node.js async-await puppeteer

我正在尝试检查是否存在具有特定类名的特定数量的元素。如果它们小于数字,请继续向下滚动。

这是我使用的代码。

await page.evaluate(() => {
        while (await page.$$('.Ns6lhs9 _gfh3').length < counter) { 
            window.scrollBy(0, window.innerHeight);
        }
    }); 

这段代码包含在异步函数中。

不幸的是,我收到此错误消息:

C:\pup\test.js:27
        while (await page.$$('.Ns6lhs9 _gfh3').length < counter) {
                     ^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3

2 个答案:

答案 0 :(得分:3)

错误

你需要标记你在async内传递的函数,async函数只是在词法上限定为函数本身。

您在其中调用的任何函数(在本例中为.forEachevaluate)都需要自己标记为async(假设它们支持它):

//            Here
page.evaluate(async () => {

解决更大的问题

在您的特定情况下,您应该提取评估的 以外的循环以避免超时:

while(await page.$$('.Ns6lhs9 _gfh3').length < counter) {
  await page.evaluate(() => window.scrollBy(0, window.innerHeight);
}

如果evaluate花费太长时间,木偶操作者会超时,通常最好不要在evaluate内执行昂贵的工作。

答案 1 :(得分:1)

试试这个:

await page.evaluate( async () => {
    while (await page.$$('.Ns6lhs9 _gfh3').length < counter) { 
        window.scrollBy(0, window.innerHeight);
    }
}); 

评估的回调需要异步前缀。