Как я могу передать эту переменную, чтобы использовать ее из моего модуля? - PullRequest
0 голосов
/ 05 октября 2018

Я установил базовый код кукловода для автоматизации Chrome.И я пытаюсь передать переменную page в качестве параметра в метод моего модуля, используя mymodule.foo(page), но она не выдает ошибку, которую вы видите ниже:

Цель состоит в том, чтобы иметь возможность использоватьобъекты кукловода, такие как 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:

ОБНОВЛЕНИЕ: Я обновил этот файл, добавив async к функции foo.Но затем, если я пытаюсь использовать 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: Это фактический код (предложенный @Hongarc), который я использую, который не выдает ошибок, но еще не работает.

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
    });
  }
};

Другой подход был бы приемлемым, в то время как мы можем использовать т.е.page.goto(<url>) внутри foo функция mymodule.Если это сработает, все будет хорошо.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Посмотрим правде в глаза, следующая функция будет запускать код в контексте браузера

page.evaluateOnNewDocument

Ошибка не в самом модуле, а в том, как вы его используете.page Объект недоступен в контексте браузера.Так что назвать это не решение.

Если вы хотите использовать страницу.в другом модуле вы можете безопасно сделать это следующим образом:

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

Также убедитесь, что у вас версия узла 7.6 или выше.

0 голосов
/ 05 октября 2018

Вы должны отметить, что ваша функция async, чтобы использовать await.Попробуйте это:

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

Этот код исправит синтаксис вашего кода, но это неправильно в логике.

  • Вам не нужно await в module.exports.foo из mymodule.js.
  • async не имеет возможности использовать функции внутри него.

Вы можете попробовать:

// mymodule.js
module.exports = {
  foo: function (page) {
    return page.evaluateOnNewDocument(async () => {
      await page.goto('http://www.google.com');
      await page.waitFor(10000);
    });
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...