我正在努力做一些async WebdriverIO v7,在同步模式是很容易的。
上下文:我正在使用一个React屏蔽输入组件,它有一个错误(我不能修复也不能改变组件),如果我输入太快,键没有注册,光标走到最后,所以我需要以相对较慢的速度输入。当我使用await input.setValue('test')
时,输入速度太快,它只输入第一个字母,不能输入其余的,所以我需要分别输入每个字符,并在每次按键之间稍等一下。
基本上我想在异步模式下做这个:
[...textValue].forEach(char => {
browser.keys(char);
browser.pause(100);
});
我尝试使用waitUntil()
,但因为这是一个屏蔽输入,如果我输入123456
,输入中的值将是123.456.___-_
,所以我不能直接比较两个字符串并等待直到它们相等。而且,对于这么简单的事情,这似乎要做很多工作,所以我想知道是否有一个更好的方法。
谢谢!
编辑:到目前为止,我尝试将每个browser.key(char)
上保存的输入文本与waitUntil()
条件下的实际input.getValue()
进行比较,它仍然不起作用
好了,问题解决了。问题是forEach
循环不能等待异步操作,所以我现在使用for..of
循环(参考)。
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'
}
);
}
}
我省略了屏蔽逻辑部分,因为这只是一个细节,这里重要的一点是循环中的异步等待。