Puppeteer无法控制第三次选项卡



我试图让我的木偶脚本打开4个选项卡,每个选项卡都转到其他URL。我遇到的是,我可以让脚本成功控制我的Chrome驱动程序中打开的第一个2个选项卡。但是,只要到达第三个选项卡时,我都会发现一个错误说

"(节点:8141)未经手的反应辩护:未经手的承诺 拒绝(拒绝ID:1):TypeError:无法读取属性的" goto" 未定义(节点: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'});

问题

由于browser.pages()解决了当前所有打开页面的数组,因此出现了错误。如果我们逐行查看IT,则会发生以下内容(假设您从"新鲜"浏览器开始):

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

这些问题可能是由于HTTP错误或浏览版本。请检查下面的链接,这些链接可能会帮助您

如果是http错误,请尝试,

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

或与浏览器有关的查看此帖子https://github.com/googlechrome/puppeteer/issues/1182

最新更新