Кукловод - используя ожидание внутри цикла - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь проверить, есть ли определенное количество элементов с определенным именем класса.Если они меньше номера, продолжайте прокручивать вниз.

Это код, который я использовал.

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 голосов
/ 05 июня 2018

Ошибка

Вам нужно пометить передаваемую функцию как async, функция async ограничена только лексической областью самой функции.

Любые функции, которые вывызов внутри него (например, .forEach или evaluate в этом случае) должен быть помечен как async (если они поддерживают это):

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

Исправление более крупной проблемы

В вашем конкретном случае вы должны извлечь цикл за пределами оценки, чтобы избежать тайм-аутов:

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

Если у вашего evaluate слишком длинный кукловод, время ожидания истечет, и обычнопредпочтительнее не делать дорогих вещей внутри evaluate.

0 голосов
/ 05 июня 2018

попробуйте это:

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

Обратный вызов оценки требует асинхронного префикса.

...