在Protractor中如何排除另一ElementArrayFinder中的元素?
解决Protractor过滤禁用菜单项的问题
你遇到的报错核心原因很明确:getDisabledMenuItems().getText()返回的是Promise对象,而非直接的字符串数组——Promise本身没有indexOf方法,直接调用自然会报错。下面给你两种最简的实现方案:
方案一:用Async/Await简化异步逻辑(推荐)
现在Protractor完全支持async/await语法,这种写法直观易读,是当前最主流的异步处理方式:
async function getEnabledMenuItems() { // 先等待禁用项文本数组的Promise解析完成,拿到真实数组 const disabledTexts = await getDisabledMenuItems().getText(); const allItems = getAllMenuItems(); // 过滤出不在禁用列表里的菜单项 return allItems.filter(async (elem) => { const itemText = await elem.getText(); return !disabledTexts.includes(itemText); }); }
方案二:直接通过CSS选择器定位(更高效)
其实你可以跳过"先查所有项再过滤"的步骤,直接用CSS选择器在元素定位阶段就排除禁用项,减少额外的异步操作,性能更优:
function getEnabledMenuItems() { // 定位所有属于menu-ui下、父元素不带ui-state-disabled类的menu-item-text return getCustomGrid().all(by.css('.menu-ui :not(.ui-state-disabled) .menu-item-text')); }
补充:原代码报错的细节
你原来的代码里const disabledText = getDisabledMenuItems().getText();,这里的disabledText是一个未解析的Promise,不是真实的字符串数组。必须通过await或者.then()获取Promise内部的实际数据后,才能调用indexOf或includes这类数组方法。
内容的提问来源于stack exchange,提问作者matandked
相关产品推荐
相关产品推荐

