WebDriverIO 5中如何同时对多个选择器调用waitForExist()方法
问题根因
WebDriverIO v5 对元素操作API做了不兼容旧版的重构:
waitForExist不再支持直接传入选择器字符串作为入参,必须绑定到通过$()/$$()获取的WDIO封装元素实例上调用- 直接对两个WDIO元素实例执行
+运算,得到的是普通字符串值,不挂载WDIO元素原型方法,因此会抛出waitForExist is not a function的类型错误
可落地方案
方案1:CSS并集选择器(完全对齐v4原有逻辑)
v4版本中传入拼接选择器的写法,本质是利用CSS选择器的逗号并集规则(即多个选择器用,分隔时,会匹配所有命中任意一个选择器的元素),配合reverse: true参数即可实现「等待两个选择器对应的元素全部消失」的原有逻辑。
注意v5的waitForExist改为对象形式传参,不再支持v4的位置参数写法,代码示例:
addIdeCommand('ideOpenFolder', async function (folder, treeCls, fuzzy) { // 这里sel1、sel2为原始选择器字符串,不要提前用$()包装 const combinedSelector = `${sel1}, ${sel2}`; const waitTarget = await browser.$(combinedSelector); const sel1El = await browser.$(sel1); await sel1El.waitForDisplayed(); // reverse: true 对应原逻辑中等待元素不存在的要求,timeout:0 沿用全局默认超时配置 await waitTarget.waitForExist({ timeout: 0, reverse: true }); await this.waitUntil(async function () { // 原有业务判断逻辑 }); });
提示:如果你的选择器包含XPath、accessibilityId 等非CSS类型定位符,不要用这个方案,跨类型选择器无法通过CSS逗号规则合并。
方案2:分别等待多元素(适配所有定位类型,逻辑更直观)
不需要拼接选择器,拿到两个元素实例后分别触发等待逻辑,用Promise.all保证两个等待条件都满足后再往下执行,效果和原逻辑完全一致,且不限制选择器类型:
addIdeCommand('ideOpenFolder', async function (folder, treeCls, fuzzy) { const sel1El = await browser.$(sel1); const loadingEl = await browser.$(sel2); await sel1El.waitForDisplayed(); // 并行等待两个元素都不存在 await Promise.all([ sel1El.waitForExist({ timeout: 0, reverse: true }), loadingEl.waitForExist({ timeout: 0, reverse: true }) ]); await this.waitUntil(async function () { // 原有业务判断逻辑 }); });
避坑提示
- 不要对已经通过
$()获取的WDIO元素实例做字符串拼接,这类实例是框架封装的代理对象,强制转字符串后会丢失所有元素方法 - v5及以上版本的元素等待方法,统一使用对象格式传参,不要沿用v4的按位置传参写法,避免参数映射错误导致逻辑不符合预期
内容的提问来源于stack exchange,提问作者Nik Patel
相关产品推荐
相关产品推荐

