代码之家  ›  专栏  ›  技术社区  ›  Fred J.

在本地找不到所需的浏览器

  •  0
  • Fred J.  · 技术社区  · 3 年前

    此Meteor代码使用“Puppeter 8.0.0”、“Puppeter core 10.0.0”、“Puppeter extra 3.1.18”和“Puppeter extra 2.7.8”,它给出了以下错误:

    错误:无法在本地找到所需的浏览器(chrome)。跑 npm install 下载正确的Chromium版本(884014)。

    尝试了“npm安装”但无效。通过在线阅读,尝试从软件包中删除“木偶核心”:“^10.0.0”。json依赖项无效。

    任何帮助都是非常感激的。谢谢

    const puppeteer = require('puppeteer-extra');
    const nameH = require('./NameH');
    
    const puppeteerOptions = {
        headless: true,
        ignoreHTTPSErrors: true,
        args: ['--no-sandbox', '--single-process', '--no-zygote', '--disable-setuid-sandbox']
    }
    
    let browser;
    let pageNameH;
    
    const init = async () => {
        const StealthPlugin = require('puppeteer-extra-plugin-stealth');
        console.log('1')         //>>>>>>>>>>>> Prints 1
        puppeteer.use(StealthPlugin());
        console.log('2')         //>>>>>>>>>>>> Prints 2
        
        browser = await puppeteer.launch(puppeteerOptions);
        console.log('3') //>>>>>>>>> DID NOT PRINT <<<<<<<<<<<<<<<
        pageNameH = await browser.newPage();
        console.log('4')
    
        await pageNameH.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
        await pageNameH.setViewport({ width: 1366, height: 768 });
        await pageNameH.setRequestInterception(true);
        blockResources(pageNameH);
    }
    
    const blockResources = page => {
        page.on('request', (req) => {
        if (req.resourceType() == 'stylesheet' || req.resourceType() == 'font' || req.resourceType() == 'image') {
            req.abort();
        }
        else {
            req.continue();
        }
        });
    }
    
    
    export const abc = async (nm, loc) => {
        try {
        console.log('name try')       //>>>>>>>>>>>> Prints "name try"
        if (!(browser && pageNameH))
            await init();
        //use "required" nameh here
    
        } catch (error) { // print the error <<<<<<<<<<<<<<<<<<<<<<<<<
        console.log("Could not launch Puppeteer or open a new page.\n" + error);
        if (browser && browser.close === 'function') await browser.close();
        }
    }
    
    
    
    // included in package.json
    "dependencies": {
        "@babel/runtime": "^7.11.2",
        "axios": "^0.21.1",
        "check": "^1.0.0",
        "cheerio": "^1.0.0-rc.6",
        "jquery": "^3.5.1",
        "meteor-node-stubs": "^1.0.1",
        "nightmare": "^3.0.2",
        "pending-xhr-puppeteer": "^2.3.3",
        "puppeteer": "^8.0.0",
        "puppeteer-core": "^10.0.0",
        "puppeteer-extra": "^3.1.18",
        "puppeteer-extra-plugin-adblocker": "^2.11.11",
        "puppeteer-extra-plugin-block-resources": "^2.2.9",
        "puppeteer-extra-plugin-stealth": "^2.7.8"
    },
    
    0 回复  |  直到 3 年前
        1
  •  32
  •   Jin Liu    3 年前

    也许你可以试试这个,它在linux(centos)和Puppeter(10.2.0)上对我有效。

    cd ./node_modules/puppeteer
    npm run install
    

    它将把铬下载到/节点_模块/puppeter/。局部铬

        2
  •  6
  •   Alx    3 年前

    我也有同样的问题。我检查了我的env变量,即使Puppeter_SKIP_CHROMIUM_DOWNLOAD设置为false,它仍然不起作用。在我删除变量(unset puppeter\u SKIP\u CHROMIUM\u DOWNLOAD for mac)后,它就工作了。

    相关依赖性:

      "dependencies": {
        "chrome-aws-lambda": "^10.0.0",
        "puppeteer-core": "^10.0.0",
      },
      "devDependencies": {
        "puppeteer": "^10.0.0",
      }
    

    推出Chrome:

        import chromium from "chrome-aws-lambda";
    
        const browser = await chromium.puppeteer.launch({
            executablePath: await chromium.executablePath,
        });
    
        3
  •  4
  •   jackdbd    3 年前

    我也有同样的问题。对我有效的是指定 executablePath 木偶师启动选项木偶师使用的本地Chrome的完整路径。

    比如:

    const launchOptions = {
      // other options (headless, args, etc)
      executablePath: '/home/jack/repos/my-repo/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux/chrome'
    }
    

    如中所述 another answer ,似乎引用一个chromium本地二进制文件也可以,但我认为这是一个更糟糕的解决方案,因为Puppeter是 guaranteed to work only with the local bundled version of Chromium .

        4
  •  2
  •   TJBlackman    2 年前

    把我的答案扔进去,希望它能帮助别人不要像我一样浪费整个晚上。

    我在写一个使用Puppeter的Typescript服务器 ESBuild 从TS传输到JS。在构建步骤中,esbuild试图将所有内容捆绑到一个文件中,但我必须指示它保留节点_模块中的Puppeter导入。

    我是通过标记来实现的 puppeteer 作为外部的。 See docs here .

    自从 npm i 将chromium的兼容版本下载到node_modules文件夹,一旦我保留了这个导入,它就能够在node_modules文件夹中找到chromium。

    我的生成文件如下所示:

    require("esbuild").buildSync({
      entryPoints: ["src/index.ts"],
      outdir: "build",
      bundle: true,
      platform: "node",
      target: "node16",
      external: ["puppeteer"],
    });
    

    我用它运行 node prod-build.js .

    现在在我的代码中,我可以直接调用launch!
    const browser = await puppeteer.launch()

        5
  •  1
  •   fung933    3 年前

    如果您在本地进行测试,请确保已将Puppeter安装为开发人员依赖项。明确地

    npm install puppeteer --save-dev
    

    https://github.com/alixaxel/chrome-aws-lambda/wiki/HOWTO:-Local-Development#workaround

    这种方法使我们能够依靠木偶师进行本地开发,并依靠木偶师核心进行生产部署。

        6
  •  0
  •   Petronella    2 年前

    我在电脑上使用了安装的版本(可能不是你想要的)

    const browser = await puppeteer.launch({headless:false,  executablePath: 
               'C:/Program Files/.../chrome.exe' });