Tengo un sitio web que se comunica a través de comandos postMessage
window.parent.postMessage(communication, this.origin);Cuando uso dramaturgo, estoy tratando de hacer un controlador "en mensaje"
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>)salida de la consola
Im here setting return event MessageEvent event was {} No puedo poner mis expectativas en el código page.evaluate() , porque entonces se está ejecutando dentro del contexto de la etiqueta javascript que está inyectando, y no dentro del contexto de la especificación.
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'})")Eventualmente quería llegar a una expect , más bien una evaluate o una waitForEvent por evento.
Lamentablemente, no pude encontrar nada para escuchar un evento de mensaje. En su lugar, simplemente vamos a console.info .
Esta solución envuelve page.on('console', ...) en una función asíncrona que simplemente podemos usar como un interruptor de 'resolver si tiene éxito, colgar si falla'
// 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(); De esta manera, expect fallará la prueba si se agota el tiempo de espera de nuestro 'Hello, World!' ¡mensaje! 🥳