Эта суть , кажется, охватывает то, что я хочу сделать, но это скорее мысленный эксперимент, чем рабочий код. В любом случае у меня проблемы с тем, чтобы заставить его работать на меня.
Я открываю страницу в 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
Есть идеи о том, что мне не хватает? Это не поддерживаемая функция? Заранее спасибо.