You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:26:07