1

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

Это то, что у меня есть в моем тесте, что делает работу :

element.all(by.css('_cssSelector_')).filter(function(elms, index) { 
     return elms.getAttribute('height').then(function(height) { 
      return parseInt(height) > 0; 
     }); 
    }).then(function(validElms) { 
     browser.actions().mouseMove(validElms[0]).perform(); 
    } 

... но если бы я действовал на это, он не работает:

getValidElm = function() { 
    var validElm = element.all(by.css('_cssSelector_')).filter(function (elms, index) { 
     return elms.getAttribute('height').then(function (height) { 
      return parseInt(height) > 0; 
     }); 
    }).then(function (validElms) { 
     return validElms[0]; 
     }); 

    return validElm; 
} 

Если Затем я запускаю:

var validElmFromPage = getValidElm(); 
console.log(validElmFromPage); 

я получаю: Promise :: 2046 {[[PromiseStatus]]: «до»}

Что указывает на вопрос о чем-то внутри функции не решения перед тем, как используется переменная вне функции. Прочитав (широко) через сообщения здесь, и даже этот замечательный пост в блоге (http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/), я до сих пор не могу понять, что это за сделка. Я знаю, что это что-то простое, скорее всего, controlFlow?

Благодарим за помощь.

ответ

1

Позвольте функции вернуть обещание. Поскольку filter() возвращает ElementArrayFinder, вы должны быть в состоянии использовать first():

getValidElm = function() { 
    return element.all(by.css('_cssSelector_')).filter(function (elms, index) { 
     return elms.getAttribute('height').then(function (height) { 
      return parseInt(height) > 0; 
     }); 
    }).first(); 
} 

first() возвратит ElementFinder, который вы можете перейти к mouseMove():

var elm = getValidElm(); 
browser.actions().mouseMove(elm).perform(); 
Смежные вопросы