Обработка событий из контекста страницы кукловода вне метода оценки - PullRequest
0 голосов
/ 05 июля 2018

Моя цель - открыть экземпляр puppeteer-chromium в качестве дочернего процесса в среде nodejs и прослушивать все щелчки, которые пользователь сделает так, чтобы эти события были доступны из родительского процесса. Поэтому я думаю, что поток событий необходим, но я не знаю, как отправить их из метода оценки (объект процесса недоступен в этом контексте - «процесс не определен» в журналах хрома).

В настоящее время я пытаюсь добавить прослушиватель кликов внутри контекста страницы, но есть ли способ получить эти события вне метода оценки?

Я знаю, что метод оценки может вернуть обещание, но это только одно значение, поэтому этого недостаточно. Я хотел бы собрать все щелчки, пока я не закрою окно хрома.

Заранее благодарим за все советы.

Мой пример кода:

  // parent.js
  const child = require('child_process');
  const childprocess = child.fork('./childprocess.js');
  childprocess.on('message', (msg) => {
      console.log('Message from child', msg);
      // here I'd like to get click events from childprocess
      // eg. saving them in database
  });

  // childprocess.js
  const puppeteer = require('puppeteer');
  (async () => {
      await process.on('message', (m) => {
        process.send(m)
      })
      const browser = await puppeteer.launch(options);
      const page = await browser.newPage();
      await page.goto('http://someurl.com');
      await page.evaluate( (processHandle) => {
        document.addEventListener('click', (event) => {
          console.log(event);  // event is logged in chromium dev console
          processHandle.send({msg: event}); // nothing happens
        })
      }, process);
  })()

1 Ответ

0 голосов
/ 06 июля 2018

Проблема с примером кода заключается в том, что processHandle не будет сериализовано таким образом, чтобы JavaScript в контексте документа мог его использовать. Вместо этого вы можете выставить функцию на window, которая будет делать то, что вы хотите:

await page.exposeFunction("sendEventToProcessHandle", (event) => {
    processHandle.send({ msg: JSON.parse(event) });
})

await page.evaluate((processHandle) => {
    document.addEventListener('click', function (e) {
        window.sendEventToProcessHandle(JSON.stringify(e));
    });
}, process)

Здесь window.sendEventToProcessHandle - это функция, которая будет запускаться в контексте процесса Node.JS, где вы можете получить доступ к processHandle, но может быть вызвана документом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...