Я использую автоматизированную систему тестирования, Транспортер.
Я пришел к выводу, что Protractor часто использует promises
асинхронно разрешать оценку кода.
Вопрос: Как я могу вручную решить обещание определенного значения после выполнения условия?
Обновление: 09/08/2017
Извините, я был немного неясен по promises
. Теперь я смог правильно работать с этим:
// match variable
var match = false;
// get all elements with 'div' tag
var scanElements = element.all(by.css('div')).each(function(el) {
// get text content of element
el.getText().then(function(text) {
// split words into array based on (space) delimeter
var sp = text.split(' ');
for (var i = 0; i < sp.length; i++) {
if (sp[i] == 'Stack Overflow') {
match = true;
}
}
});
});
// on complete
scanElements.then(function() {
if (match) {
console.log('Status: Found match!');
}
else {
console.log('Status: No match');
}
});
Вы должны использовать map
вместо each
. Если вы посмотрите на исходный код, то each
них реализуется:
each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any> {
return this.map(fn).then((): any => {
return null;
});
}
Таким образом, как вы можете видеть, он внутренне использует map
и скрывает результат, возвращая null
. Это также указано в документации.
Также переименовать element
на что - то другое, только чтобы избежать неоднозначности с транспортиром element
объекта.
Здесь нет проблемы в соответствии с документацией типа возвращаемого элемента element.all(). Each() является null после того, как он выполняет итерацию через все.
Обещание, которое будет разрешено, когда функция была вызвана для всех ElementFinders. Обещание решит null.
Изменить 1: Действительно ли фильтр является допустимым?
element.all(by.css('div'))
.filter(function(element) {
return element.getText().then(function(text) {
var sp = text.split(' ');
for ( var i =0; i< sp.length; i++) {
if(sp[0] == 'protractor') return true;
}
return false;
});
}).first();
Сначала будет фильтровать и затем возвращать первый элемент, который соответствует
В вашем точном примере вы можете использовать .getText()
на ElementArrayFinder -
// calling .getText() exactly on ElementArrayFinder returns promise
let hasStackOverflow = $$('div').getText().then(texts=> {
// texts would be array of strings
return texts.includes('Your Text exact match')
})
hasStackOverflow.then(has=> {
if (has) {
console.log('Status: Found match!');
}
else {
console.log('Status: No match');
}
})
reject
путемreturn deferred.reject(data)
обещание и поймать статус с помощью.fail((data) =>)
обработчик. Или вы также можете разрешить обещание с другими значениями, такими какdeferred.resolve(myConditionalData1)
... илиdeferred.resolve(myConditionalData2)
. Вы могли бы решить обещание несколькими способами, с несколькими значениями данных, просто нужно правильно обработать. Не добавляю это как ответ, потому что я не работал с платформой, которую вы используете. Надеюсь это поможет