【问题标题】:In which context does $eval & $$eval execute in page/frame/elementHandle?$eval & $$eval 在 page/frame/elementHandle 中的哪个上下文中执行?
【发布时间】:2019-03-15 17:38:47
【问题描述】:

这真的让我很感动。我无法访问 $$eval() 中的全局变量,也无法访问其他模块。

const util = require('util');
GlobalFlag=true;

.......

await page.$$eval(selector, (e) => { 
    console.log(e);
    GlobalFlag=false;
    console.log(util.inspect(e));
});

给我错误:评估失败:ReferenceError:未定义实用程序

【问题讨论】:

  • 您将无法访问util,因为它是 Node 包。这很可能是不需要的。还不清楚 GlobalFlag 在您的案例中的用途。

标签: javascript node.js google-chrome-devtools puppeteer


【解决方案1】:

$eval 在客户端上下文中评估函数。它被字符串化并使用eval 调用。它无权访问 Node GlobalFlag,因为它不存在于浏览器全局范围内。

$eval$$eval support additional arguments 将被传递给评估函数,以防应该在那里读取变量。为了写入变量,值应该从函数返回并在节点上下文中分配。

GlobalFlag = await page.$$eval(selector, (e) => { 
    console.log(JSON.stringify(e, null, 2));
    return false;
});

【讨论】:

  • 我现在明白了。这是否意味着,我什至不能在 page.$$eval() 内再做一次 eval - 在 elementHandle 上?
  • 好像是这样。我想这应该以另一种方式解决。
  • 它不应该工作,因为 elementHandlepuppeteer。不应该在浏览器中可用。您能否修复您的代码,utilpageFunc 中不可见?将接受作为答案。
  • 是的,当然,它是不可见的。添加了与浏览器兼容的替代方案。
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多