【问题标题】:Could not find expected browser chrome locally无法在本地找到预期的浏览器 chrome
【发布时间】:2021-09-04 03:56:53
【问题描述】:

此 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_modules 文件夹并再次 npm install 会发生什么?
  • 删除 node_modules 和 npm install 后同样的问题。
  • 您也可以发布您的package.json 吗?我的意思是只要有一个木偶师就可以了,所以我们最好看看它。
  • 用 pacakge.json 更新了帖子
  • 遇到同样的问题,删除 node_modules 和 npm install 对我有用

标签: node.js meteor puppeteer


【解决方案1】:

也许你可以试试这个,它适用于我在 linux(centos)、puppeteer(10.2.0) 上。

cd ./node_modules/puppeteer
npm run install

它将铬下载到./node_modules/puppeteer/.local-chromium

【讨论】:

  • 仅供参考,这在运行 CentOS 的 AWS 实例上也起到了作用,非常感谢
【解决方案2】:

我遇到了同样的问题。我检查了我的环境变量,即使 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,
    });

【讨论】:

    【解决方案3】:

    抛出我的答案,希望它可以帮助人们不要像我一样浪费整个晚上。

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

    我通过将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()

    【讨论】:

    • 感谢您的回答。我正在测试一个不流行的设置 - Angular Universal,其中 Express 为 REST API 和 SSR 提供​​服务。将“puppeteer”添加到服务器应用的自定义 webpack 配置的 externals 解决了这个问题!
    【解决方案4】:

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

    npm install puppeteer --save-dev
    

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

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

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。对我有用的是将 Puppeteer 使用的本地铬的完整路径指定为 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'
      }
      

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

      【讨论】:

      • 这个答案被低估了。就我而言,我不想要完整的木偶。只是 puppeteer-core 没问题,但它只是在我的 ubuntu 18 上找不到浏览器。我只需要告诉它它在哪里然后它就可以工作了。谢谢。
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-20
        • 1970-01-01
        • 2012-05-11
        • 2019-01-17
        • 2014-12-18
        • 2021-06-10
        • 1970-01-01
        • 2016-05-18
        • 2017-08-12
        相关资源
        最近更新 更多