遍历$$元素集合时Promise未正常执行完成的问题排查
问题根因
你拿不到预期单选按钮值、感觉Promise未执行完成的核心原因有3个:
- 被
async修饰的Array.map回调,返回值永远是Promise实例组成的数组,你没有用Promise.all等待这个Promise数组全部落定就直接打印结果,自然会拿到一堆[object Promise] - 代码里的
await Promise(await element.getValue())是无效写法:Promise作为构造函数必须配合new关键字调用,直接调用会抛出类型错误;且你已经await了element.getValue()拿到实际返回值,再套一层Promise完全是多余操作 - 如果用
forEach做迭代实现,forEach本身没有异步等待的设计,就算回调写了async,它也不会等待回调内的异步操作执行完,就会直接运行后续的打印逻辑,必然出现异步没跑完就拿结果的问题,错误写法参考:
// 错误示范:forEach无法感知、等待异步回调执行 const badRadioValues = [] radioButtons.forEach(async (element) => { const val = await element.getValue() badRadioValues.push(val) }) // 执行到这行时,上面的异步取值大概率还没跑完,打印结果不符合预期 console.log(badRadioValues)
正确实现代码
直接用Promise.all等待map返回的所有Promise执行完成,去掉无效的Promise包装即可:
// 获取所有单选按钮元素 const radioButtons = await $$('.radioButton') // 遍历触发所有取值逻辑,用Promise.all等待所有异步操作完成 const radioValues = await Promise.all( radioButtons.map(element => element.getValue()) ) console.log("Radio value==>", radioValues)
场景优化
如果你只需要获取当前选中的单选按钮值,不需要遍历所有单选按钮,直接匹配选中状态的选择器即可,执行效率更高:
const selectedRadio = await $('.radioButton:checked') const selectedValue = selectedRadio ? await selectedRadio.getValue() : null console.log("当前选中的单选框值==>", selectedValue)
内容的提问来源于stack exchange,提问作者Ramkumar
相关产品推荐
相关产品推荐

