2016-04-04 2 views
1

У меня есть следующий код, который фильтрует элементы, содержащие текст:отсчет транспортир() ожидание терпит неудачу неожиданно

var myspan = searchChoices.filter(function(elem, index) { 
     return elem.getText().then(function(text) { 
      //console.log('index text:' +text); 
      return text === 'Consultant 110'; 
     }); 
    }); 

    expect(myspan).not.toBe(null); 
    myspan.count().then(function (x) { 
     console.log('count:'+x); 
    }); 

    expect(myspan.count()).toBe(1); // this succeeds 
    expect(myspan.count()===1).toBe(true); // <---This fails 

Самое странное в том, что ожидание на линии перед последней строкой прошла успешно, но последний не удается. Какова причина ?

+0

[ 'COUNT()'] (https://angular.github.io/protractor/#/ api? view = ElementArrayFinder.prototype.count) возвращает обещание, а не целое число. 'ожидать()' знает, как обрабатывать обещание, но 'count() === 1' всегда будет терпеть неудачу – Phil

+0

Да, но не ожидается, что предполагается решить все обещания перед оценкой? – chrisl08

+0

Да, но это логическое значение, которое вы передаете ему, а не обещание – Phil

ответ

3

Помните, что все, что связано с webdriver в Protractor , возвращает обещание - объект, который будет помещен в Control Flow, который будет разрешен позже в очереди обещаний. Фактическое значение не доступно сразу.

Теперь expect() имеет особое поведение - в транспортир (на самом деле в jasminewd2) это исправлен, чтобы понять Promise с - это разрешило бы обещание, прежде чем сделать ожидание. Вот почему expect(myspan.count()).toBe(1) работает в вашем случае. И myspan.count()===1 всегда будет false - так как myspan.count() сам по себе является обещанием, и он всегда не равен 1.

FYI, если вы хотите иметь === 1 чек, вы можете вручную разрешить обещание:

myspan.count().then(function (actualCountValue) { 
    expect(actualCountValue === 1).toBe(true); 
}); 
Смежные вопросы