木偶操纵者无法控制第三个选项卡

puppeteer cannot control 3rd tab

我正在尝试让我的人偶脚本打开 4 个选项卡,每个选项卡都指向不同的 url。我遇到的是,我可以让脚本成功控制在我的 chrome 驱动程序中打开的前 2 个选项卡。但是,每当它到达第三个选项卡时,我都会收到一条错误消息

"(node:8141) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'goto' of undefined (node:8141) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code."

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'});

这些问题可能是因为 http 错误或浏览器版本。请检查下面link那些可能对你有帮助

如果是http错误试试,

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

或者如果它与浏览器有关,请检查此 post https://github.com/GoogleChrome/puppeteer/issues/1182

问题

抛出错误是因为 browser.pages() 解析为所有当前打开的页面的数组。如果我们逐行查看它,会发生以下情况(假设您从 "fresh" 浏览器开始):

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'});