【问题标题】:Puppeteer: How to open tabs in an already active browser window?Puppeteer:如何在已经处于活动状态的浏览器窗口中打开选项卡?
【发布时间】:2020-11-22 02:50:25
【问题描述】:

我一直在编写一个简单的程序,它可以打开几个页面并执行一些简单的抓取和登录功能。运行浏览器后,我已经设法在新选项卡上打开新页面,但是当浏览器已经打开时,我无法在同一个浏览器中打开更多选项卡,必须在新的不同浏览器窗口中打开它们。

有什么解决方法吗?或者如果浏览器窗口已经打开,有什么方法可以让 puppeteer 在同一个浏览器窗口中打开新页面?提前致谢。

我的代码结构如下:

index.js(主应用程序文件)

async function runBrowser(pageID) {
    const browser = await puppeteer.launch({
        "headless": false,
        "defaultViewport": null,
        "args": ['--start-maximized'],
    });
//CHANGE THE PAGE THAT OPENS
    switch(pageID){
        case 0:
        login.openCursosPuntoD(browser);
        break;
        case 1:
        facebook.openFacebookPuntoD(browser);
        break;
        case 2:
        instagram.openInstagramPuntoD(browser);
        break;
        case 3:
        twitter.openTwitterPuntoD(browser);
        break;
        case 4:
        youTube.openYouTubePuntoD(browser);
        break;
        case 5:
        webPage.openPaginaWebPuntoD(browser);
        break;
        default:
        break;
    }
};
runBrowser(0);

instagramPuntoD.js(打开函数文件的示例)

function openInstagramPuntoD(browser){
actions.runPage('https://www.instagram.com/xxxx/',false,browser);
};
module.exports = {
  openInstagramPuntoD,
};

actions.js(包含爬虫可以执行的操作功能)

async function runPage(url,doLogin,browser){
    const page = [];
    const pageNumber = (await browser.pages()).length+1;
    page[pageNumber] = await browser.newPage();
    await page[pageNumber].goto(url);
      
if(doLogin == true){
    var user = getUsername();
    var pass = getPassword();
    login(user,pass,page[pageNumber]);
}
else{}
}

*注意代码中不相关的部分被排除在外。

【问题讨论】:

    标签: javascript node.js puppeteer chromium


    【解决方案1】:

    好的,经过一些研究,

    您必须使用 userDataDir 来重用缓存,并使浏览器重用当前活动窗口。否则它只是从传统的“打开一个新窗口”开始

    puppeteer.launch({
      userDataDir: 'PATH TO DATA FOLDER',
    })
    

    您可以找到带有chrome://version(配置文件路径)的数据文件夹,但不要忘记擦除路径末尾的/Default

    【讨论】:

    • 感谢@toykato 的回复,在这种情况下,我将浏览器传递给actions.js 中的runPage 函数,从这里我已经在执行const page = browser.newPage();page[pageNumber] = await browser.newPage();
    • 再次感谢@toykato 的帮助,我修改了代码以包含它,并获取目录,但这会产生 chrome 错误。 “无法启动 Chrome,因为您的个人资料出现问题。”
    • 另外,为了获取路径,我启动了一个浏览器实例并抓取路径。这种方法只有在浏览器窗口的 headless 属性设置为 false 时才有效。你能想到其他方法吗?由于这个解决方案也与我项目的其他部分发生冲突,因为我也在使用电子(它在后台运行铬)。
    • 你是这样写runBrowser函数的吗? async function runBrowser(pageID) { const browser = await puppeteer.launch({ "userDataDir": 'PATH TO DATA FOLDER', "headless": false, "defaultViewport": null, "args": ['--start-maximized'], });
    • 感谢您帮助我找到解决方案,您的指导对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2010-12-18
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多