Как исключить элементы ElementArrayFinder, которые существуют в другом ElementArrayFinder в Protractor?

matandked спросил: 28 апреля 2018 в 09:36 в: protractor

Я хотел бы получить элементы меню-ui, которые пользователь может щелкнуть.

К сожалению, метод isEnabled всегда возвращает true для всех моих элементов Вот почему я пробую другой подход. Я заметил, что инвалиды всегда имеют класс "ui-state-disabled". Как следствие, я могу получить все отключенные элементы, используя следующую функцию:

function getDisabledMenuItems() {
  return getCustomGrid().all(by.className('menu-ui')).all(by.className('ui-state-disabled')).all(by.className('menu-item-text'));
}

, а затем все пункты меню, используя следующий:

function getAllMenuItems() {
  return getCustomGrid().all(by.className('menu-ui')).all(by.className('menu-item-text'));
}

Теперь я хотел бы исключить элементы, возвращаемые getDisabledMenuItems из элементов, возвращаемых getAllMenuItems.


Вопрос

Что является самым простым способом исключить элементы ElementArrayFinder, которые существуют в другом ElementArrayFinder?

Я пытаюсь сделать это с помощью метода filter следующим образом :

const disabledText = getDisabledMenuItems().getText();
const allItems = getAllMenuItems();  allItems.filter(function(elem, index) {
    return elem.getText().then(function(text) {
      return disabledText.indexOf(text) < 0 ;
    });
  });

, но мой код не работает (indexOf does not exists on type Promise<string>). Интересно, что это самый простой способ сделать это.


1 ответ

Есть решение
yong ответил: 28 апреля 2018 в 01:15

Поскольку getDisabledMenuItems().getText() возвращает обещание, вы должны использовать его возможное значение в then():

const disabledText = getDisabledMenuItems().getText();
const allItems = getAllMenuItems();const enableItems = allItems.filter(function(elem, index) {
  return elem.getText().then(function(text) {
    return disabledText.then(function(txts){
      return txts.includes(text) === false;
      // or use  return txts.indexOf(text) < 0;
    });
  });
});