кукловод не может контролировать 3-ю вкладку - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь, чтобы мой сценарий кукловода открывал 4 вкладки, каждая из которых идет по отдельному URL.Я столкнулся с тем, что скрипт может успешно контролировать первые две вкладки, открытые в моем драйвере chrome.Однако всякий раз, когда он попадает на 3-ю вкладку, я получаю сообщение об ошибке:

"(узел: 8141) UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 1): TypeError: Невозможно прочитать свойство 'goto'of undefined (узел: 8141) [DEP0018] DeprecationWarning: Необработанные отклонения обещаний устарели. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс 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'});

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Проблема

Ошибка выдается, потому что 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'});
0 голосов
/ 12 марта 2019

эти проблемы могут быть из-за ошибок http или версии просмотра. пожалуйста, проверьте ссылку ниже, они могут помочь вам

Если это ошибка http, попробуйте,

const browser = await puppeteer.launch({ignoreHTTPSErrors: true});

или, если это связано с браузером, проверьте этот пост https://github.com/GoogleChrome/puppeteer/issues/1182

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...