Промисы и циклы for — попытка проверить текст нескольких элементов

Я работаю над функцией, которая будет читать текст элементов после использования функции фильтра. Я распечатал возвращенный текст, и он получает элементы, однако я не думаю, что понимаю обещания js. ActiveFilters - это переменная, которую я уже идентифицировал.

this.verifyColorFilterFunctional = function(color) {
    var bool = true;
    activeFilters.count().then(function (count) {
        var amt = count - 1;
        for (var i = 0; i < amt; i++){
            activeFilters.get(i).getText().then(function(text) {
                bool = (color === text);
                console.log(bool);
            });
            if (!bool) {
                break;
            }
        }
    });
    return expect(bool).to.become(true);
};

В console.log выводятся значения true и false по желанию, однако я заметил две вещи. Когда false, он не ломается, как я сказал в операторе if. Кроме того, я получаю typeError: true не является допустимой ошибкой. Я считаю, что логика звучит хорошо в моей голове, но не для JS. Любая помощь будет принята с благодарностью.


person Tree55Topz    schedule 14.11.2016    source источник
comment
Здесь две проблемы: во-первых, вы не можете использовать стандартный цикл for для асинхронного метода, а во-вторых, !bool выполняется еще до того, как обещание выполнено.   -  person Keith    schedule 14.11.2016
comment
Мой javascript чрезвычайно слаб... Я пытался инициализировать переменные в обещании, а затем использовать цикл for, но переменные не инициализировались   -  person Tree55Topz    schedule 14.11.2016
comment
@Nico, может быть несколько элементов для проверки. фильтр обновляет результаты, которые мне нужны, чтобы убедиться, что все они из них, однако многие из них (скажем, 9 или более) имеют нужный фильтр.   -  person Tree55Topz    schedule 14.11.2016
comment
Я не написал этот комментарий, как я хотел. Просто удалите его сейчас.   -  person Nico    schedule 14.11.2016


Ответы (1)


Protractor element.all() поддерживает метод getText(), который вернет вам текст, отображаемый в элементах в виде массива. Затем вы можете легко сравнить результирующий массив, используя метод expect.

this.verifyColorFilterFunctional = function(color) {
    activeFilters.getText().then(function (textArray) {
     expect(textArray).to.equal(Array(textArray.length-1).fill(color));
   });
}
person Sudharsan Selvaraj    schedule 14.11.2016
comment
Разве getText() также не возвращает обещание? Этот код тоже не работал :( - person Tree55Topz; 14.11.2016
comment
да, getText() вернет вам обещание. но метод expect будет ждать разрешения обещания, а затем использует результат для утверждения. так какую ошибку вы получаете, когда пробовали вышеуказанное решение? - person Sudharsan Selvaraj; 14.11.2016
comment
Не уверен, что .toEqual будет ждать разрешения. Было бы проще сначала разрешить activeFilters.getText().then(function (texts) {, а затем утвердить против ожидаемого массива expect(texts).toEqual(Array(texts.length - 1).fill(color)); - person Florent B.; 14.11.2016
comment
Я использую chai, поэтому я изменил toEqual на to.equal, и это ошибка утверждения, означающая, что сравнение возвращается ложным. Я считаю, что, возможно, текст, который я сравниваю, не тот же самый. - person Tree55Topz; 14.11.2016
comment
Да, это будет просто. должно быть Array(texts.length - 1) вместо Array(filters.length - 1) наверное? @ФлорентБ. - person Sudharsan Selvaraj; 14.11.2016
comment
@FlorentB, можете ли вы опубликовать сегмент кода для того, что вы предлагаете? - person Tree55Topz; 14.11.2016
comment
@ Tree55Topz, вы должны принять этот ответ, так как он почти правильный. Судхарсан Селварадж, ты можешь это исправить? - person Florent B.; 14.11.2016
comment
@FlorentB. Обновил ответ. Спасибо!! - person Sudharsan Selvaraj; 14.11.2016
comment
@Florent, ваше предложение сработало, когда я использовал .toString для массива и текстов. Благодарю вас! - person Tree55Topz; 14.11.2016
comment
@ Tree55Topz, это может быть связано с тем, что textArray.length-1 никогда не будет давать одинаковое количество элементов между текущим массивом и ожидаемым массивом. - person Florent B.; 14.11.2016