当前位置: 首页 > 知识库问答 >
问题:

错误:计算失败:ReferenceError:未定义util

董法
2023-03-14

我试图将util模块对象传递给puppeteerpage.evaluate,但没有成功。我知道这个问题是在如何将所需的模块对象传递给puppeteer page.evaluate中提出的,但提供的解决方案在我的情况下不起作用。MWE:

const puppeteer = require("puppeteer");

const path = "http://books.toscrape.com/";

// scrape funs 
(async () =>{
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.goto(path, {waitUntil: "networkidle2", timeout: 0});
    await page.waitFor(1000);
    await page.addScriptTag({path: './node_modules/util/util.js'});
    // selector with replaceable element
    const buttonText = await page.evaluate(() => {
        let selectorButton = "#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(%s) > article > div.product_price > form > button";
        let buttons = [];
        for(let i = 1; i < 21; i ++){
            let textOut = document.querySelector(util.format(selectorButton, i)).innerText;
            buttons.push(textOut);
        };
        return buttons;  
    });

// return
await browse.close();
console.log(buttonText);
})();

显示错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):错误:计算失败:ReferenceError:未定义util

谢谢

在初始行中添加const util=require(“util”);并不像如何将required module object传递给puppeteer page.evaluate中所示的那样起作用。

即使在使用browserify时,我似乎也无法将util模块注入到puppeteer页面中。步骤:

在项目path上,创建main.js,如下所示:var util=require('util');

然后在终端中的path上:browserify main.js-o bundle.js。文件bundle.js出现在项目path中。

然后运行以下操作:

const puppeteer = require("puppeteer");
const path = "http://books.toscrape.com/";

// scrape funs 
(async () =>{
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.goto(path, {waitUntil: "networkidle2", timeout: 0});
    await page.waitFor(1000);
    await page.addScriptTag({path: "main.js"});
    await page.addScriptTag({path: "bundle.js"});
    // selector with replaceable element
    const buttonText = await page.evaluate(() => {
        let buttons = [];
        let selectorButton = "#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(%s) > article > div.product_price > form > button";
        for(let i = 1; i < 21; i ++){
            let textOut = document.querySelector(util.format(selectorButton, i)).innerText;
            buttons.push(textOut);
        };
        return buttons;  
    });

// return
await browse.close();
console.log(buttonText);
})();

错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):错误:计算失败:TypeError:无法读取未定义的属性“Format”(位于:5:55)

共有1个答案

权胜泫
2023-03-14

您需要包含./node_modules/util/util.js的浏览器兼容构建。您可以使用Browserify来完成此操作,或者使用他们的在线服务Browserify wizard-util下载Browserify版本。

https://try-puppeteer.appspot.com/上的代码

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("http://books.toscrape.com/", {waitUntil: "networkidle2", timeout: 0});
await page.waitFor(1000);

//Copy of https://wzrd.in/standalone/util@latest
await page.addScriptTag({url: "https://cdn.rawgit.com/brahma-dev/099d0d6d43a5d013603bcd245ee7a862/raw/b0c6bb82905b5b868c287392000dc2487c41994d/util.js"});

// selector with replaceable element
const buttonText = await page.evaluate(() => {
    let buttons = [];
    let selectorButton = "#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(%s) > article > div.product_price > form > button";
    for(let i = 1; i < 21; i ++){
        let textOut = document.querySelector(util.format(selectorButton, i)).innerText;
        buttons.push(textOut);
    };
    return buttons;  
});

// return
await browser.close();
console.log(buttonText);
 类似资料:
  • 问题内容: 我收到此错误消息, 这是我的标题。 以下是我的JavaScript代码 以下是HTML 我想在输入标签上显示日期选择器。 我正在使用Bootstrap V3.1。 问题答案: 在使用$或jQuery的脚本之前 添加jQuery库 , 以便可以在脚本中标识$。

  • 问题内容: 我正在Ubuntu平台中使用jquery,javascript,php。在页面中,我通过jquery发送一个ajax请求到php文件并获取响应文本。该程序已在Windows-(Wamp)平台和联机环境中成功运行。但是在Ubuntu中,我遇到了JavaScript错误。代码如下… 在Ubuntu中,我收到此错误, “ Uncaught ReferenceError:$未定义” 。该错误显

  • 我在node.js中编译代码时出现了这个错误,我该如何修复它呢? RefernceError:未定义fetch 这就是我正在做的函数,它负责从特定的电影数据库中恢复信息。

  • 问题内容: 我正在尝试从Java代码调用Java脚本函数。 这是我的Java代码 这是我的Java脚本文件: 但是当我运行驱动程序类的主要方法时,它给我错误如下: 我所知道的是它需要一些脚本引擎来执行它。 为此,我在类路径中添加了rhino.jar文件,但这不起作用。 我没有得到如何解决这个错误。请帮助。谢谢。 问题答案: 不是JavaScript的一部分,而是Web浏览器提供的对象的一部分。所以

  • 我试图显示一个关于成功promise的弹出式通知,但我一直收到“ReferenceError:doNotification未定义”。如果我在html中单击按钮时触发doNotification,它就会工作。我的电子邮件功能和控制台一样工作。日志将适当的参数打印到控制台。我不确定在我的电子邮件功能中调用doNotification时为什么会出现此错误?

  • 问题内容: 我有以下Angular函数: 但是无论何时调用此函数,我都会进入 控制台。有人可以帮助我了解我在做什么错吗? 问题答案: 可能您尚未向控制器注入服务。有几种方法可以做到这一点。 请阅读有关DI的参考。然后,它变得非常简单: