#javascript #puppeteer
#javascript #кукловод
Вопрос:
У меня есть этот код
...
const page = await browser.newPage();
page.on('console', msg => {
if (msg._type === 'log') {
console.log(msg._text);
}
});
...
await page.evaluate(() => {
document.querySelectorAll('.foo').forEach(bar => {
console.log('This logs not');
if (bar.querySelector('div > p').innerHTML === 'foo bar') {
bar.querySelector('.dropdown').click();
}
});
});
Но он ничего не регистрирует. Когда я делаю
await page.evaluate(() => {
const test = document.querySelectorAll('.foo')
console.log('This logs');
test.forEach(bar => {
console.log('This logs not');
if (bar.querySelector('div > p').innerHTML === 'foo bar') {
bar.querySelector('.dropdown').click();
}
});
});
Он регистрирует первый console.log()
.
Почему# он не выполняет forEach
?
Комментарии:
1. Я запустил некоторый тестовый код (просмотр StackOverflow и получение якорей), и у меня это сработало. Ваш селектор может быть неправильным.
Ответ №1:
document.querySelectorAll('.foo')
пусто, потому что нет элемента с этим селектором. Вот почему вы не получаете никакого результата при протоколировании.
Комментарии:
1. Когда я выполняю это в консоли в браузере, она не пуста. Я получаю
NodeList
2. Вы должны предоставить общий доступ к остальной части вашего кода или веб-сайту / странице. Возможно, он не закончил загрузку, когда вы запускаете его на puppeteer.
3. Я жду загрузки страницы с
await page.waitForNavigation({ waitUntil: 'load' });
4. Вот в чем проблема. Вы должны использовать
networkidle0
вместоload
, и мой ответ будет идеальным для вашей проблемы: D