【问题标题】:How to pass required module object to puppeteer page.evaluate如何将所需的模块对象传递给 puppeteer page.evaluate
【发布时间】:2018-07-26 16:49:49
【问题描述】:
  • Puppeteer 版本:1.0.0
  • 平台/操作系统版本:Windows 10
  • Node.js 版本:8.9.3

这是我的代码:

const puppeteer = require('puppeteer');
const varname = require('varname');

...

const page = await browser.newPage();
await page.goto(url);
let generalInfo = await page.evaluate(() => {
        let elements = Array.from(document.querySelectorAll('#order-details > table > tbody > tr'));
        let res = {};
        elements.map((tr) => {
            let split = tr.innerText.trim().split('\t');
            res[varname.camelback(split[0])] = split[1]; // Here is: ... Error: Evaluation failed: ReferenceError: varname is not defined
        });
        return res;
    }); 

...

await browser.close();

显示错误:

UnhandledPromiseRejectionWarning:未处理的承诺 拒绝(拒绝 id:1):错误:评估失败:ReferenceError: varname 未定义

【问题讨论】:

标签: javascript node.js puppeteer


【解决方案1】:

您想在浏览器上下文中使用模块 varname。为此,您应该使用page.addScriptTag()varname 注入浏览器,如下所示:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.addScriptTag({ path: './node_modules/varname/build/varname.js' });
    const generalInfo = await page.evaluate(() => {
        return window.varname.camelback('foo_bar_baz');
    });

    console.log(generalInfo); // prints fooBarBaz
    await browser.close();
})();

【讨论】:

  • 是不是说evaluate之后puppeteer使用了自己的window等环境?而且 jQuery 注入似乎也不是那么必要。
  • 是的,可以通过在eval函数里面写console.log(window)来查看,看它在浏览器中打印出window对象(Node.js没有window的概念)。
  • @Everettss 在生产环境中,节点模块将不可用,对吗?因为 webpack 创建了一个包。我们如何在生产环境中提供路径?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多