Согласно документам кукловода здесь , $$
Не возвращает список узлов, вместо этого он возвращает обещание массива ElementHandle .Он отличается от NodeList.
Есть несколько способов решения проблемы.
1.Использование встроенной функции для циклов с именем page.$$eval
Этот метод запускает Array.from(document.querySelectorAll(selector))
на странице и передает его в качестве первого аргумента pageFunction
.
Таким образом, получить innerText похоже наследующий,
// Find all .tweet, and return innerText for each element, in a array.
const tweets = await page.$$eval('.tweet', element => element.innerText);
2.Передайте elementHandle
в page.evaluate
Все, что вы получите от await page.$$('.tweet')
- это массив elementHandle.Если вы утешаетесь, в зависимости от типа будет написано JShandle
или ElementHandle
.
Забудьте о сложном объяснении, его легче продемонстрировать.
// let's just call them tweetHandle
const tweetHandles = await page.$$('.tweet');
// loop thru all handles
for(const tweethandle of tweetHandles){
// pass the single handle below
const singleTweet = await page.evaluate(el => el.innerText, tweethandle)
// do whatever you want with the data
console.log(singleTweet)
}
Конечно, есть несколько способовЧтобы решить эту проблему, Грант Миллер также ответил на некоторые из них в другом ответе.