Прослушивание автоматически запускаемых клиентских событий с page.on ('customEvent', fn) - PullRequest
0 голосов
/ 27 июня 2018

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

Я открываю страницу в PhantomJs, которая загружает библиотеку JavaScript и запускает процесс. Когда процесс завершается, эта библиотека запускает событие в контексте объекта экземпляра. Я бы хотел либо

(a) настроить PhantomJS на прослушивание нужного события в объекте экземпляра на странице клиента

OR

(b) добавить некоторый код на страницу клиента, который «всплывает» событие на window и настроить PhantomJS для прослушивания этого.

Вот что я попробовал для варианта B.

client.html:

<html>
<body>
  <script src='https://example.com/library.js'></script>
  <script>
    function sendWindowEvent() {
      // I've also tried document, top.parent, etc.
      window.dispatchEvent( new CustomEvent('myEvent', {
        detail: {
          message: "Hello World!",
          time: new Date(),
        },
        bubbles: true,
        cancelable: true
      }));
    }

    var instance = new myLibrary.constructor();
    instance.addEventListener("onInitialized", sendWindowEvent);
    instance.start();
  </script>
</body>
</html>

В приложении node.js:

const headlessBrowser = await phantom.create();
const page = await headlessBrowser.createPage();
await page.on('onResourceRequested', (requestData) => {
  console.info('Requesting', requestData.url);  // displays http://localhost:1337/client.html & https://example.com/library.js
});
await page.on('myEvent', async (evt) => {
  console.log('event detected:', evt);  // never triggered
});
const openStatus = await page.open('http://localhost:1337/client.html');
console.log('phantom status:', openStatus);  // displays true

Есть идеи о том, что мне не хватает? Это не поддерживаемая функция? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

window.callPhantom() было то, что я искал. Документация здесь .

client.html:

<html>
<body>
  <script src='https://example.com/library.js'></script>
  <script>
    function sendWindowEvent() {
      if (typeof window.callPhantom === 'function') {
        window.callPhantom({hello: 'world'});
      }
    }

    var instance = new myLibrary.constructor();
    instance.addEventListener("onInitialized", sendWindowEvent);
    instance.start();
  </script>
</body>
</html>

В приложении node.js:

const headlessBrowser = await phantom.create();
const page = await headlessBrowser.createPage();
page.on('onCallback', data => {
  console.log('CALLBACK: ' + JSON.stringify(data)); // Prints 'CALLBACK: {"hello":"world"}'
});
page.open('http://localhost:1337/client.html');
0 голосов
/ 27 июня 2018

page.on прослушиватели событий отвечают на конкретные технические события, генерируемые PhantomJS, а не его целевой страницей. Чтобы получать события собственной страницы, вам необходимо подписаться на них в контексте браузера:

await page.evaluate(function(){
    window.addEventListener("myEvent", function(e){ console.log(e)})
});

Обязательно подпишитесь на page.onConsoleMessage обратный вызов для получения этого сообщения.

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