首页 > 解决方案 > 如何传递此变量以从我的模块中使用它?

问题描述

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

目标是能够像page其他模块一样使用 puppeteer 对象。

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');与 await 一起使用,我会得到同样的错误。所以我尝试添加另一个异步执行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:这是我正在使用的实际代码(由@Hongarrc 建议),它不会引发错误,但还不能正常工作。

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>)内部。如果它工作,它会没事的。foomymodule

标签: javascriptnode.jsecmascript-6puppeteer

解决方案


面对现实吧,以下函数将在浏览器上下文中运行代码

page.evaluateOnNewDocument

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

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

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

还要确保您拥有节点版本 7.6 或更高版本。


推荐阅读