2015-11-08 4 views
2

У меня довольно простой тест Protractor, который должен проверять текстовое значение в строке ng-repeat.Protractor - getText() возвращает Array вместо String

Вот мой HTML:

<div ng-repeat="destination in destinations"> 
    <span>{{destination.city}}, {{destination.country}}</span> 
</div> 

А вот мои JS:

lastDestination = element.all(by.repeater('destination in destinations').row(1)); 
expect(lastDestination.getText()).toEqual("Madrid, Spain"); 

В documentation for getText() состояния:

Get the visible (i.e. not hidden by CSS) innerText of this element, including sub-elements, without any leading or trailing whitespace.

Так что я бы ожидать текст из диапазона тега в строке и для возврата, но при запуске теста Protractor я получаю следующую ошибку для утверждения:

Ожидаемый ['Мадрид, Испания'] равный 'Мадрид, Испания'.

GetText(), кажется, возвращает массив вместо строки.

Я попытался решения GetText() 'ы обещали, но все-таки получил ту же ошибку:

lastDestination = element.all(by.repeater('destination in destinations').row(1)); 

lastDestination.getText().then(function (text) { 
    expect(text).toEqual("Madrid, Spain"); 
}); 

я могу получить вокруг вопроса путем воздействия на первое значение в массиве:

expect(text[0]).toEqual("Madrid, Spain"); 

Но я все равно хотел бы знать, почему это не работает в первую очередь.

Любые идеи?

Обновление: A similar bug has been reported на странице Gractub на портале Protractor, поэтому может быть, что функция getText() просто не работает должным образом.

ответ

4

По документации:

// Returns a promise that resolves to an array of WebElements containing 
// the DIVs for the second book. 
bookInfo = element.all(by.repeater('book in library').row(1)); 

Вы пытаетесь использовать GetText на обещание, вам необходимо решить в первую очередь.

var lastDestination; 
element.all(by.repeater('destination in destinations').row(1)).then(
    function(elements){ 
      lastDestination = elements[0]; 
}); 
expect(lastDestination.getText()).toEqual("Madrid, Spain"); 

ИСТОЧНИК: http://angular.github.io/protractor/#/api?view=ProtractorBy.prototype.repeater

Это то, что происходит за кулисами. Предполагая, что вы вызываете getText() в классе WebElement. Значение element будет передано в core.text.getElementText

Селен (транспортир) обрабатывает какие параметры следует отправлять.

Это код, который получает контент, если используется WebElement. Я не знаю, что произойдет, если обещание, которое разрешает массив, является явным thisArg.

explicitThisArg.getText()//the explicit thisArg is the object that the function is called from. 

    core.text.getElementText = function(element) { 
    var text = ''; 
    var isRecentFirefox = 
     (goog.userAgent.GECKO && goog.userAgent.VERSION >= '1.8'); 

    if (isRecentFirefox || goog.userAgent.WEBKIT || goog.userAgent.IE) { 
    text = core.text.getTextContent_(element, false); 
    } else { 
    if (element.textContent) { 
     text = element.textContent; 
    } else { 
     if (element.innerText) { 
     text = element.innerText; 
     } 
    } 
    } 

    text = core.text.normalizeNewlines_(text); 
    text = core.text.normalizeSpaces_(text); 

    return goog.string.trim(text); 
}; 
+0

Ваш код работает, однако, документация для GetText() говорится, что «Получить видимый (т.е. не скрыт CSS) InnerText этого элемента, включая вложенные элементы, без каких-либо начальных или конечных пробелов». Поэтому я считаю, что getText() в строке также должен работать. Я нашел аналогичную проблему здесь https://github.com/angular/protractor/issues/1794, поэтому я думаю, что это может быть ошибкой. – Matt

+0

Я должен отметить, что вы вызываете getText на обещание, которое в любом случае не подразумевает использование документации. –

+0

Имеет смысл, спасибо за то, что вы вникаете в этот и подробный ответ :) – Matt

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