javascript - puppeteer 操纵者无法控制第三个选项卡

标签 javascript node.js puppeteer

我正在尝试让我的 puppeteer 脚本打开 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'});

最佳答案

问题

抛出错误是因为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'});

这将引发错误(无法读取未定义的属性“goto”),因为 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'});

关于javascript - puppeteer 操纵者无法控制第三个选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55123571/

相关文章:

javascript - 如何在不引入另一个滚动条的情况下使固定侧边栏可通过主滚动条滚动?

javascript - Node.js 中的同步 TCP 读取

node.js - Electron CustomScheme - 各种特权意味着什么?

node.js - 如何保持puppeteer浏览器运行后台而不跳到前台?

javascript - 无法获取元数据选择器文本

javascript - 如何 var FOO = FOO || {} 成语在 Javascript 中有用吗?

javascript - 通过 javascript 添加复杂的 html 列表

javascript - 将导入加载器和导出加载器与覆盖模块变量的库链接起来

javascript - Linux NodeJS 全局 NPM 包 ":No such file or directory"

google-chrome-devtools - 通过 Chrome DevTools 协议(protocol)读取 DOMStorage/LocalStorage