首页 > 解决方案 > 我怎样才能让剧作家听消息事件

问题描述

我有一个通过 postMessage 命令进行通信的网站

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

使用剧作家时,我正在尝试做一个“on message”处理程序

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

控制台输出

Im here
setting return event MessageEvent
event was {}

我不能把我的期望放在page.evaluate()代码中,因为它是在它注入的 javascript 标记的上下文中执行的,而不是在规范的上下文中。

标签: javascriptplaywrightplaywright-test

解决方案


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'})")

推荐阅读