2016-01-26 2 views
2

Здесь actualLevels массив бросает пустой массив в line.I ожидать нужны actualLevels быть заполнены и возвращены к утверждению только aftr массив полностью заполняетсяПреобразовать массив элементов пообещать и вернуть его

Код:

var expected = ['Level 2', 'Level 3', 'Level 4']; 
var actualLevels=[]; 

element.all(by.css('somecssid')).each(function(elm) { 
    elm.getText().then(function (textValue) { 
     console.log(textValue); // prints texts of the css i.e.Level1 
     actualLevels.push(textValue); 
    }) 
} 
expect(actualLevels).toBe(expected); // jasmine expect assertion 
+0

Вы используете транспортир? – epascarello

+0

да я использую транспортир. – divya

ответ

0

Поскольку ваша getText функция асинхронная, ваша expect в строке 10 вызывается прежде чем что-проталкивается в textValue.

Кроме того, при заказе вставка textValue не гарантируется, так как каждый вызов асинхронный. Вы могли бы получить что-то вроде ['Level 4', 'Level 2', 'Level 3']. Чтобы исправить это, вы захотите использовать что-то вроде Promise.map. Вы могли бы сделать что-то вроде

Promise.map(arrayOfThings, function(elm) { return elm.getText(); }).then(function(actualLevels){ expect(actualLevels).toBe(expected); });

В идеале вы должны использовать дополнительный параметр обратного вызова из вашей среды тестирования, чтобы проверить этот код.

0

Не уверен, что в контексте Жасмин, но в целом картина, что вы ищете является

Promise.all(element.map(actualLevel)) . 
    then(actualLevels => console.log(actualLevels)); 
1

Вы можете позвонить getText() на ElementFinderArray непосредственно:

expect(element.all(by.css('somecssid')).getText()).toEqual(expected); 

Заметим, что нет необходимо решить обещание вручную, в Protractor expect() исправлено, чтобы понять и решить обещания неявно.

Примечание 2: toBe будет проверять, указывают ли обе переменные на один и тот же точный объект - вам нужно toEqual.


Просто FYI, each() не был хороший выбор, map() будет более подходящим:

var expected = ['Level 2', 'Level 3', 'Level 4']; 
var actualLevels = element.all(by.css('somecssid')).map(function(elm) { 
    return elm.getText(); 
}); 
expect(actualLevels).toEqual(expected); // jasmine expect assertion 

Если вы хотите дополнительно регистрировать тексты на консоли один на один, решить getText():

var actualLevels = element.all(by.css('somecssid')).map(function(elm) { 
    return elm.getText().then(function (text) { 
     console.log(text); 
     return text; 
    }); 
}); 

Просто FYI 2: вы можете заменить element.all(by.css('somecssid')) с ярлыком:

$$('somecssid') 
+0

работа безупречный! thnaks – divya

+0

Почему оператор log перед возвратом elm.getText(); печатает мне информацию об экспоненте obract, а не текст? – divya

+0

@divya okay, обновленный ответ, также см. Http://stackoverflow.com/help/someone-answers. – alecxe

Смежные вопросы