Estoy luchando por hacer algo con async WebdriverIO v7 que en modo de sincronización es bastante fácil.
Contexto: estoy usando un componente de entrada enmascarado de React que tiene un error (no puedo solucionarlo ni cambiar el componente), si escribo demasiado rápido, las teclas no se registran y el cursor va al final, así que necesito escribir a una velocidad relativamente lenta. Cuando uso await input.setValue('test') la escritura es demasiado rápida y solo escribe la primera letra y no puede escribir el resto, por lo que necesito escribir cada carácter por separado y esperar un poco entre pulsaciones de teclas.
Básicamente, quiero hacer esto en modo asíncrono:
[...textValue].forEach(char => { browser.keys(char); browser.pause(100); }); Intenté usar waitUntil() pero debido a que esta es una entrada enmascarada, si escribo 123456 , el valor en la entrada será 123.456.___-_ por lo que no puedo comparar directamente las dos cadenas y esperar hasta que sean iguales. Además, esto parece mucho trabajo para algo que era tan simple, así que me pregunto si hay una mejor manera .
¡Gracias!
EDITAR: Intenté comparar el texto de entrada guardado hasta ahora en cada navegador. clave browser.key(char) con la entrada real input.getValue() en la waitUntil() y todavía no funciona
Bien, resolví el problema. El problema era que el bucle forEach no puede esperar las operaciones asíncronas, así que ahora uso un bucle for..of ( referencia ).
async typeSlowly (input, content) { let inputSoFar = ''; for (const char of content) { inputSoFar = inputSoFar.concat(char); await browser.keys(char); await browser.waitUntil( async () => (await input.getValue()) === inputSoFar, { timeout: 500, timeoutMsg: 'expected text to be different after 500ms' } ); } }Omití la parte de la lógica de enmascaramiento porque eso es solo un detalle, lo importante aquí es la espera asíncrona dentro del ciclo.