javascript - 我如何传递这个变量以从我的模块中使用它?

标签 javascript node.js ecmascript-6 puppeteer

我已经设置了一个基本的 puppeteer 代码来自动化 chrome。我正试图通过 page使用 mymodule.foo(page) 将变量作为我的模块方法的参数但它没有抛出您可以在下面看到的错误:

目标是能够使用 puppeteer 对象,例如 page来自其他模块。

E:\scripts\node\myproject\mymodule.js:3
    await page.evaluateOnNewDocument(() => {
          ^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:607:28)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3)
    at Module.require (module.js:587:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (E:\scripts\node\myproject\app.js:3:18)
PS E:\scripts\node\myproject>

这是文件 app.js :

// app.js
const puppeteer = require('puppeteer');

const mymodule = require('./mymodule');

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
  });
  const page = await browser.newPage();

  await mymodule.foo(page);

  await browser.close();
})();

这是文件 mymodule.js :

更新:我已更新此文件以添加 asyncfoo功能。但是如果我尝试使用 await page.goto('http://www.google.com');等待我得到同样的错误。所以我尝试添加另一个异步操作 page.evaluateOnNewDocument(async ()然后它运行,打开浏览器,但它不导航到页面,也不等待。

// mymodule.js
module.exports = {
  foo: async function (page) {
    await page.evaluateOnNewDocument(async () => {
      await page.goto('http://www.google.com');
      await page.waitFor(10000);  // That's Evil, I know
    });
  }
};

更新 2:这是我正在使用的实际代码(由@HonGac建议),它不会引发错误,但还不能工作。

module.exports = {
  foo: function (page) {
    return page.evaluateOnNewDocument(async () => {
      await page.goto('http://www.google.com');
      await page.waitFor(10000);  // That's Evil, I know
    });
  }
};

另一种方法是可以接受的,同时我们可以使用 ie. page.goto(<url>) foo 内部mymodule的功能.如果它有效,那就没问题。

最佳答案

让我们面对现实吧,以下函数将在浏览器上下文

上运行一段代码
page.evaluateOnNewDocument

错误不在模块本身,而在于您如何使用它。 page 对象在浏览器上下文中不可用。所以调用它不是解决方案。

如果你想使用page.在另一个模块中,您可以安全地这样做,

// mymodule.js
module.exports = {
  foo: async function (page) {
      await page.goto('http://www.google.com');
      await page.waitFor(10000);
  }
};

还要确保您的 Node 版本为 7.6 或更高版本。

关于javascript - 我如何传递这个变量以从我的模块中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52667360/

相关文章:

node.js - Knex.js 迁移将现有数据复制到其他表

javascript - 用空格或字符分隔文本并包含该字符

javascript - 检查值是否与 JS ES6 中数组中的任何其他值匹配

node.js - Nodejs无法访问方法内的对象成员

javascript - 将 URL 返回值记录到 Firebug 控制台中

node.js - 在 NodeJS 中读取连续的二进制数据流

angularjs - 如何在带有 Electron 的 AngularJS 应用程序中使用 fs Node 模块?

javascript - 如何改变一些元素异步使用jquery的位置

javascript - 使用 JSBuilder 或 Apache ANT 构建 Sencha Touch 应用程序

javascript - 如何使用 Javascript 根据元素的颜色更改 ID