how can I get playwright to listen to message events

I have a website that communicates through postMessage commands

       window.parent.postMessage(communication, this.origin);

When using playwright, I'm trying to do an "on message" handler

      function eventListener(returnEvent: any): any {
  window.addEventListener('message', function(event: MessageEvent) {
    console.log('Im here');
    if (event.data.messageId === 'payment-method') {
      console.log('setting return event', event);
      returnEvent = event;
      return returnEvent;
    }
  });
}

...

  let returnEvent: any = {};
  await page.evaluate(eventListener, returnEvent);
  await creditCardDetailsPage.fillFormValid();
  await page.waitForTimeout(5000); //give time for message event to fire
  console.log('event was', returnEvent);
  await expect(returnEvent).toEqual(<MY DATA OBJECT HERE>)

console output

      Im here
setting return event MessageEvent
event was {}

I cannot put my expects in the page.evaluate() code, because then it's executing within the context of the javascript tag that it's injecting, and not within the context of the spec.

2 ответа

Я хотел, в конце концов, довести его до evaluateили waitForEvent.

К сожалению, я не смог найти ничего для прослушивания события сообщения. Вместо этого мы просто идем на console.info.

Это решение обертывает page.on('console', ...)в асинхронную функцию, которую мы можем просто использовать как переключатель «разрешить в случае успеха, повесить в случае сбоя»

      // Return true if the page emits 'Hello, World!' to the console info level
async function waitForMessageAsync(): Promise<boolean> {
  return new Promise(function (resolve) {
    page.on('console', (msg) => {
      if (msg.type() === 'log' && msg.text() === 'Hello, World!') {
        resolve(true);
      }
    });
  });
}

await expect(await waitForMessageAsync).toBeTruthy();

Сюда, expectне пройдет тест, если время ожидания нашего 'Hello, World!'сообщение!

      async def print_args(msg):
    values = []
    for arg in msg.args:
        values.append(await arg.json_value())
    print(values)

page.on("console", print_args)
await page.evaluate("console.log('hello', 5, {foo: 'bar'})")
Другие вопросы по тегам