木偶无法控制第三个标签

时间:2019-03-12 14:12:43

标签: javascript node.js puppeteer

我正在尝试让我的操纵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'});

2 个答案:

答案 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