我试图让我的木偶脚本打开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