无法将模块函数传递给页面

2023-11-30

我有一个名为util用方法getMutedColor和其他一些。getMutedColor依赖于另一个称为rand在同一模块中。

page.includeJs('https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.10/d3.min.js', function() {
    var util = require('./util');
    var svg = page.evaluate(pageContext.pageExec, data, meta, util);
    /** ... **/
}

我可以打电话util.getMutedColor()在这个范围内就很好,但在我的pageContext.pageExec功能,util.getMutedColor不复存在。这util参数仍然是一个对象,但我无法调用any导出的方法:

类型错误:“未定义”不是函数(评估“util.getMulatedColor()”)

有没有办法将独立模块传递到页面?


不,这真的不可能。正如在docs:

Note:评估函数的参数和返回值必须是一个简单的原始对象。经验法则:如果可以通过 JSON 序列化,那就没问题了。

您传递给评估的函数必须是独立的,并且您传递的数据不能包含使用创建的函数或对象new。那些被剥夺了。

这意味着您必须复制util物体完全进入pageExec功能。

If util太大而无法复制,或者如果您使用多个功能util, 你可以试试不同的 things:

  1. 序列化函数并将它们作为字符串传递给评估回调,您可以在其中实例化它们new Function(string)并将它们绑定到util object.

    var funcNames = [];
    for(var prop in util) {
        if (util.hasOwnProperty(prop) && typeof util[prop] === "function") {
            funcNames.push(prop);
            util[prop] = util[prop].toString();
        }
    }
    util.__funcNames = funcNames; // make it a property of util
    page.evaluate(pageContext.pageExec, data, meta, util);
    

    和里面的pageContext.pageExec:

    util.__funcNames.forEach(function(funcName){
        util[funcName] = new Function(util[funcName]);
    });
    
  2. 只有一个pageContext函数包含所有内容,您可以使用switch case带有每次传递的参数evaluate选择单个函数内的正确函数pageContext功能。

  3. Use page.injectJs注入实用程序。有必要通过检查是否来命名实用程序window存在类似的东西:

    var util = {...};
    if (window) {
        window.util = util
    } else if(module) {
        module.exports = util;
    }
    

    根据环境的不同,可能有更好的脚本可以做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将模块函数传递给页面 的相关文章

  • Scrapy 使用 selenium,webdriver 无法实例化

    我正在尝试将 selenium phantomjs 与 scrapy 一起使用 但我遇到了很多错误 例如 采用以下代码片段 def parse self resposne while True try driver webdriver Ph
  • 使用 PhantomJS 运行 RequireJS/WireJS 应用程序

    我正在尝试执行一个使用 RequireJS 2 1 8 WireJS 0 10 2 和 PhantomJS 1 9 2 的基本应用程序 当使用 PhantomJS 运行应用程序时 这是我的目标 WireJS 无法加载 请参见下面的错误 使用
  • 如何将 POST 数据发送到 phantomjs 脚本

    我正在使用 PHP CURL 并希望通过设置下面的 postfields 数组将 POST 数据发送到我的 phantomjs 脚本 ch curl init curl setopt ch CURLOPT COOKIEJAR cookieF
  • Python 中的 Selenium PhantomJS 自定义标头

    我想在 python 中向 Selenium PhantomJS 添加 自定义标头 这些是我想添加的标题 headers Accept Accept Encoding gzip deflate sdch Accept Language en
  • 如何在 PhantomJS 中转到下一页进行抓取

    我正在尝试从具有多个页面的网站中获取多个元素 我目前正在使用 PhantomJS 来完成这项工作 我的代码几乎可以工作 但问题是我的代码在第一页上刮了两次 即使 根据日志 似乎我已经移到了第二页 这是代码 var page require
  • Windows 上 Node 的 PhantomJS

    我使用 Node 编写了一个 Electron 应用程序 电子样板 https github com szwacz electron boilerplate and phantom https www npmjs com package p
  • Puppeteer、cloudflare 网站返回 403(禁止)

    我正在尝试从 cloudflare 网站上抓取数据 但无论我做什么 我都会收到 403 禁止错误 我读到这是因为无头请求 有什么办法可以绕过这个吗 我将在下面保留我当前的设置 我还能做些什么来防止被发现吗 const puppeteer r
  • 如何在node.js中生成PDF

    我想生成一个模块 该模块将通过将输入作为我的发票来生成 PDF 并且该 PDF 文件会自动发送给客户的邮件 ID 在第一步中 我得到了一些代码并尝试生成 PDF 该代码工作正常 我能够生成 PDF 但我无法打开该文件 对于代码 我使用此链接
  • 如何在 phantomJS 中执行 jQuery Promise?

    我正在尝试在服务器端使用 nodejs 和 phantomjs 来对我们的网站进行 SEO 虽然 ajax 工作正常 但我无法执行我在代码中使用的自定义承诺 我如何让 phantomJS 等到承诺得到解决 下面是我编码的内容 body ad
  • 使用 PhantomJS 嵌入网页的所有图像会产生警告,但可以工作

    我试图通过嵌入所有图像 以及通过这一点后的其他外部资源 将网页转换为单个文件 以下是我运行 PhantomJs 的方式 phantomjs web security false embed images js http localhost
  • PhantomJS 多个页面的意外加载行为

    我有一个脚本 如下 可以通过 3 个步骤来抓取网站 当设置为一次最多一页时效果很好 然而 当我将其增加到一次 2 个时 事情开始变得不稳定 onFinished 的触发时间比我预期的要早 并且页面尚未完全加载 因此 我的脚本的其余部分被破坏
  • Karma/Jasmine/PhantomJs:未定义不是构造函数

    我有一个应用程序在运行测试时引发奇怪的错误 错误如下 TypeError undefined is not a constructor evaluating allKeys i match 0 9 in node modules jasmi
  • Karma 用于自动用户交互测试?

    我正在测试一个设置Karma http karma runner github io Mocha http visionmedia github io mocha 其中一件事是这个可能 要做的是在各种浏览器上测试用户交互 包括Phantom
  • 尝试使用 Phantom.js 生成 PDF 时 Vue.js 未渲染

    在这个带有硬编码 url 的简单示例中 我的 Vue js 组件未渲染 纯 html 被渲染 但我有组件的所有位置都显示为空白 Phantomjs 应该能与 Vue js 正常工作吗 var webPage require webpage
  • 我们如何在phantomjs中使用evaluateAsync

    有什么用evaluateAsync以及什么时候我们必须使用这个功能以及使用这个功能有什么好处 在下面我们看到一个可怜的文档 http phantomjs org api webpage method evaluate async html为
  • 如何在 PhantomJS 中使用 JavaScript 检测网页上的声音?

    我需要检测带有横幅的网页中的所有声音 我怎样才能做到这一点 我查看 PhantomJS 但找不到浏览器声音的 API PhantomJS 1 x 和 2 不支持 Flash
  • Phantom JS 50% 的时间失败

    我搜索一个文本框 然后尝试用字符串填充它 这是代码 var fname driver FindElement By Name iFirstName 50 if fname null do System Threading Thread Sl
  • 不可靠/不稳定的 Capybara/AngularJS 集成测试与计时问题

    如何使这些测试可靠地通过 目前这些测试很不稳定 有时他们会过去 有时他们会失败 下面是演示此问题的设置 代码和输出 克服这个问题的建议将不胜感激 我相信也会帮助许多其他人 所以请发表评论 测试代码环境 轨道3 2 RSpec 2 x 水豚
  • httplib.BadStatusLine: '' 在 Linux 上,但在 Mac 上则不然

    这个错误已经困扰我几个小时了 我决定编写一个单独的项目 只是为了看看我是否可以复制它 而且我可以 但只能在我的服务器上复制 这适用于我的 Mac Mac OSX El Capitan 10 11 6 服务器 CentOS 7 2 1511
  • 如何配置 Angular2 Quickstart 来运行 phantomjs?

    我想弄清楚如何运行测试Angular2 快速入门 https github com angular quickstart与 phantomjs 我认为这些步骤足以配置 Karma 1 克隆存储库 git clone https github

随机推荐