Проблема в том, что setInterval()
работает не так, как вы ожидаете.В частности, он не возвращает Promise
, который вы могли бы await
.Он синхронно создает интервал, и затем возвращается вся функция, которую вы передаете page.evaluate()
.
Что вам нужно сделать, это создать Promise
самостоятельно и сообщить ему resolve
, как только вы получитеarray
ready.
//...
return new Promise((resolve, reject) => {
var timer = setInterval(async () => {
i = i + 1;
console.log(i);
await document.querySelector(".isgrP").scrollBy(0, window.innerHeight);
var ele = await document.querySelectorAll(".FPmhX.notranslate._0imsa ")
.length;
console.log("Now length is :" + ele);
console.log("Timer :" + i);
if (ele > 10 && i > 20) {
console.log("Break");
clearInterval(timer);
console.log("after break");
var array = [];
for (var count = 1; count < ele; count++) {
try {
var onlyuname = await document.querySelector(
`body > div.RnEpo.Yx5HN > div > div.isgrP > ul > div > li:nth-child(${count}) > div > div.t2ksc > div.enpQJ > div.d7ByH > a`
).innerText;
console.log(onlyuname);
var obj = {
username: onlyuname
};
console.log(obj);
await array.push(obj);
} catch (error) {
console.log("Not found");
}
}
console.log(JSON.stringify(array));
resolve(array); // <-----------------
}
}, 800);
})
//...
Обратите внимание, что приведенный выше пример не обрабатывает ошибки.Если какая-либо из функций в вашем setInterval
сгенерирует, вам нужно отловить эти ошибки и передать их во внешнюю область с помощью reject
.
Надеюсь, это поможет.