Почему я получил ошибку document is not defined в puppeteer?

#javascript #node.js #async-await #puppeteer

#javascript #node.js #асинхронное ожидание #кукловод

Вопрос:

Я хотел бы имитировать щелчок по галерее ( <div class="image"> ), но когда я пытаюсь запустить этот код, я получаю ошибку document not defined.

 async function gallery(page) {
 await page.waitFor(3000);
 await page.click(document.querySelector('.div image'));
}
  

В чем здесь проблема? Как я могу использовать document.Выбор запроса корректен с помощью puppeteer?

Комментарии:

1. В узле нет документа.

2. Но в браузере puppeteer есть, правда? Поэтому я должен иметь возможность использовать document. querySelector

3. Я собрал другие элементы с кодом const partnersOnPage = await page.evaluate(() => Array.from(document.querySelectorAll('div.listing__card a.listing__thumbnail')) .map(element => element.href.substring(element.href.lastIndexOf('/') 1)) ); , поэтому в nodejs и puppeteer есть document.

4. Я думаю document , что он будет доступен только внутри page.avaluate (в соответствии с github.com/GoogleChrome/puppeteer ) Попробуйте: async function gallery(page) { await page.waitFor(3000); await page.evaluate(() => { document.querySelector('div.image').click(); }) }

5. But with puppeteer's browser there is, rigth? Нет, документа по-прежнему нет, у Chromium есть документ, и это то, что контролирует puppeteer. По сути, вам просто нужно вызвать click внутри экземпляра chromium, .. page.evaluate это один из способов, но есть более простой вариант page.$('div.image').click() . Я был на мобильном телефоне со своим первоначальным ответом, поэтому не мог дать полный ответ, но надеялся, что это могло дать вам подсказку о том, что было не так .. 🙂

Ответ №1:

Я думаю, что документ будет доступен только внутри page.evaluate (согласно документации puppeteer)

Попробуйте:

 async function gallery(page) {
   await page.waitFor(3000);
   await page.evaluate(() => {
      document.querySelector('div.image').click();
   })
}
  

Комментарии:

1. Как вы используете его при отладке в консоли? Кажется, он работает нормально, но когда в режиме отладки с разрывом внутри page.eval он выдает ошибку doc is not defined

Ответ №2:

вы вызываете недопустимый элемент, вы можете проверить этот документ

 await page.evaluate(() => {
  document.querySelector('div.image').click();
});
  

Комментарии:

1. У меня все еще есть документ, который тоже не определен div.image .

2. вы можете проверить это