Кукловод не выполняет forEach

#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