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

问题描述 投票:0回答:13

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

错误:无法在本地找到所需的浏览器(chrome)。运行

npm install
下载正确的 Chromium 版本 (884014)。

尝试“npm install”无济于事。在线阅读,尝试从 package.json 依赖项中删除 "puppeteer-core": "^10.0.0" 但无济于事。

非常感谢任何帮助。谢谢

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"
},
node.js meteor puppeteer
13个回答
86
投票

也许你可以尝试这个,它对我在 linux(centOS)、puppeteer(10.2.0) 上有效。

cd ./node_modules/puppeteer
npm run install

如果失败,您还可以尝试运行:

cd ./node_modules/puppeteer
npm install

这会将 chromium 下载到 ./node_modules/puppeteer/.local-chromium


12
投票

通过运行此命令手动安装 chromium 来修复它。

node node_modules/puppeteer/install.js

9
投票

我也有同样的问题。我检查了我的环境变量,即使 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 设置为 false,它仍然无法工作。删除变量后(对于 mac 取消设置 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD),它起作用了。

相关依赖:

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

推出 Chromium:

    import chromium from "chrome-aws-lambda";

    const browser = await chromium.puppeteer.launch({
        executablePath: await chromium.executablePath,
    });

6
投票

如果您在本地测试,请确保您已安装 puppeteer 作为开发依赖项。具体来说

npm install puppeteer --save-dev

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

这种方法使我们能够依靠 puppeteer 进行本地开发,并依靠 puppeteer-core 进行生产部署。


4
投票

我也有同样的问题。对我有用的是将 Puppeteer 使用的本地 chromium 的完整路径指定为

executablePath
Puppeteer 启动选项。

类似这样的:

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

另一个答案中所述,似乎引用 chromium 本地二进制文件也可以工作,但我认为这是一个更糟糕的解决方案,因为 Puppeteer 保证仅适用于 Chromium 的本地捆绑版本


3
投票

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

我正在编写一个使用 Puppeteer 的 Typescript 服务器,并且我正在使用 ESBuild 从 TS 转换为 JS。在构建步骤中,esbuild 试图将所有内容捆绑到一个文件中,但我必须指示它保留从 node_modules 导入的 Puppeteer。

我通过将

puppeteer
标记为外部来做到这一点。 请参阅此处的文档

由于

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()


0
投票

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

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

0
投票

您可能需要根据您的操作系统安装一些依赖项。请查看 Puppeteer 的故障排除页面了解更多详细信息。


0
投票

我也遇到了这个错误,我注意到在将我的节点从 Dockerfile 更新到版本 ^16(我的 puppeteer 在容器中)后,我开始收到这样的错误。我是怎么解决的?我将节点从 Dockerfile 降级到版本 12。 希望这能解决它......

OBS:我在机器上使用Ubuntu 21.04。

编辑------

在最新版本的node中,您需要进入./node_modules/puppeteer并运行命令npm install,然后将安装正确的软件包。 我正在使用该解决方案。


0
投票

如果您在 AWS SAM 中使用 puppeteer 并且依赖项中没有

puppeteer
,则可以使用
puppeteer-core

中安装相同的内容
   node node_modules/puppeteer/install.js

要使此设置起作用,您必须在

chrome-aws-lambda
中添加
devDependencies

    "devDependencies": {
        "chrome-aws-lambda": "^10.1.0"
     }

另外,在投入生产之前,请不要忘记在

template.yaml
文件中添加图层:

Layers:
     - !Sub 'arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda:25'

0
投票

对我来说,问题是我运行了 npm install,尽管我不应该运行。刚刚删除了 node_modules 文件夹,然后再次运行 - 现在可以工作了


0
投票

puppeteer-extra
不包括
chromium
。 (Chromium 是 Chrome 浏览器的无头版本)

你需要安装

puppeteer

npm 安装 puppeteer

或者如果您不想安装 chromium,只需简单添加

executablePath
(我假设您的系统中有 Chrome 浏览器

const CHROME_EXECUTALBE_PATH = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
const browser = await puppeteer.launch({
            executablePath: CHROME_EXECUTALBE_PATH,
            headless: true
        });

要获取路径,请打开浏览器,输入

chrome://version/


-1
投票

删除

node_modules
文件夹并运行

npm install
© www.soinside.com 2019 - 2024. All rights reserved.