кукловод не может контролировать 3-ю вкладку

#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