#javascript #node.js #puppeteer
#javascript #node.js #кукловод
Вопрос:
Я пытаюсь заставить мой скрипт puppeteer открыть 4 вкладки, каждая из которых переходит на другой URL. С чем я столкнулся, так это с тем, что я могу заставить скрипт успешно управлять первыми 2 вкладками, открытыми в моем драйвере Chrome. Однако всякий раз, когда дело доходит до 3-й вкладки, я получаю сообщение об ошибке
«(узел: 8141) Необработанное предупреждение promiserejectionwarning: отклонение необработанного обещания (идентификатор отклонения: 1): TypeError: не удается прочитать свойство ‘goto’ undefined (узел:8141) [DEP0018] Предупреждение об устаревании: отклонения необработанных обещаний не рекомендуются. В будущем отклонения обещаний, которые не обрабатываются, приведут к прекращению Node.js процесс с ненулевым кодом завершения.»
let pages = await browser.pages();
const p1 = 'https://www.page.com/tab1';
const p2 = 'https://www.page.com/tab2';
const p3 = 'https://www.page.com/tab3';
const p4 = 'https://www.page.com/tab4';
const ptest = 'https://www.test.com';
await browser.newPage();
await browser.newPage();
await browser.newPage();
await browser.newPage();
await pages[0].goto(p1, {waitUntil: 'load'});
await pages[1].goto(p1, {waitUntil: 'load'});
await pages[2].goto(p1, {waitUntil: 'load'});
await pages[3].goto(p1, {waitUntil: 'load'});
Ответ №1:
Проблема
Ошибка возникает из-за того, что browser.pages() преобразуется в массив всех открытых в данный момент страниц. Если мы посмотрим на это построчно, то получится следующее (при условии, что вы начинаете с «нового» браузера):
let pages = await browser.pages();
pages
теперь это массив с одной страницей (пустая страница по умолчанию после запуска браузера).
await browser.newPage();
await browser.newPage();
await browser.newPage();
await browser.newPage();
Вы создаете четыре новые страницы, но это не приводит к автоматическому обновлению вашего pages
массива. pages
по-прежнему содержит только одну страницу.
await pages[0].goto(p1, {waitUntil: 'load'});
Первый вызов работает, так как pages[0]
содержит страницу.
await pages[1].goto(p1, {waitUntil: 'load'});
Это выдаст ошибку ( Cannot read property 'goto' of undefined
), поскольку pages[1]
значение не определено.
Исправление (и улучшение кода)
Переместите свою строку let pages = await browser.pages();
вниз в вашем коде, который будет вызываться перед использованием страниц. Чтобы улучшить свой код, вы также можете удалить один browser.newPage()
вызов, поскольку одна страница уже присутствует (прямо сейчас у вас фактически пять открытых страниц), а для ускорения вашего кода вы можете использовать Promise.all
:
const p1 = 'https://www.page.com/tab1';
const p2 = 'https://www.page.com/tab2';
const p3 = 'https://www.page.com/tab3';
const p4 = 'https://www.page.com/tab4';
const ptest = 'https://www.test.com';
await Promise.all([ // opens all pages at once
browser.newPage(),
browser.newPage(),
browser.newPage(),
]);
let pages = await browser.pages(); // now resolves with four pages
await pages[0].goto(p1, {waitUntil: 'load'});
await pages[1].goto(p1, {waitUntil: 'load'});
await pages[2].goto(p1, {waitUntil: 'load'});
await pages[3].goto(p1, {waitUntil: 'load'});
Ответ №2:
эта проблема может быть из-за ошибок http или версии для просмотра. пожалуйста, проверьте ссылку ниже, они могут вам помочь
Если это ошибка http, попробуйте,
const browser = await puppeteer.launch({ignoreHTTPSErrors: true});
или, если это связано с браузером, проверьте это сообщение
https://github.com/GoogleChrome/puppeteer/issues/1182