我正在尝试让我的操纵up脚本打开4个选项卡,每个选项卡均使用不同的URL。我遇到的是,我可以让脚本成功控制chrome驱动程序中打开的前两个标签。但是,只要进入第三个标签,我都会收到一条错误消息
”(节点:8141)UnhandledPromiseRejectionWarning:未处理的承诺 拒绝(拒绝ID:1):TypeError:无法读取的属性“ goto” 未定义(节点: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'});
答案 0 :(得分:1)
由于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'});
答案 1 :(得分:0)
这些问题可能是由于http错误或浏览版本引起的。请检查下面的链接可能对您有帮助
如果是http错误,请尝试
const browser = await puppeteer.launch({ignoreHTTPSErrors: true});
或者如果它与浏览器有关,请检查此帖子 https://github.com/GoogleChrome/puppeteer/issues/1182