2013-11-12 2 views
40

Я хочу, чтобы вывести текст DIV в моем транспортир тесте, до сих пор у меня есть:транспортир журнала консоли

console.log(ptor.findElement(protractor.By.id('view-container')).getText()); 

, но это выводит

[object Object] 

Я попытался «ToString()» и такой же результат.

Есть ли способ вывода текста на консоль?

ответ

92

getText и большинство других методов притяжения возвращают обещания. Вы хотите разместить console.log заявления в резолюции обещания:

Используя новый синтаксис транспортира:

element(by.id('view-container')).getText().then(function(text) { 
    console.log(text); 
}); 
+4

Как обернуть это в (синхронно) объекта страницы? –

+0

оберните его в объект страницы синхронизации с помощью browser.wait (function() {element (selector) .getText(). Then (function (text) {console.log (text)});}), timeoutms); –

29

это довольно старый, но как бывший n00b в транспортире, я хотел было больше документации.

вы также можете использовать:

element(by.id('view-container')).getText().then(console.log); 

или что мне нравится делать для удобства чтения помещается все объекты на странице в своей собственной функции, раздела или файла:

//top declaration of variables 
var viewContainer = element(by.id('view-container')).getText(); 

.... //bunch of code 
.... 

viewContainer.then(console.log); 

Это позаботится о большинстве ваших отладочных потребностей в саду.

Для обещаний в целом, вы можете попробовать использовать protractor.promise.all()

скажем, у вас есть две вещи, которые являются обещания:

var getTime  = element(by.xpath(theTimeXpath)).getText(); 
var getPageTitle = element(by.xpath(thePageTitle)).getInnerHtml(); 

protractor.promise.all([getTime, getPageTitle]).then(function(theResultArray){ 

    var timeText   = result[0]; 
    var pageTitleInnerHtml = result[1]; 

    console.log(timeText);   // outputs the actual text 
    console.log(pageTitleInnerHtml); //outputs the text of the Inner html 
}); 

Этот второй метод полезен, когда вещи начинают становиться более сложным. лично, однако, я нахожу другие способы обойти это. Хотя это и не плохо, для некоторых разработчиков нужно читать мой код.

5

Я хотел бы предложить небольшое улучшение для других ответов.

короткий ответ: Мне нравится использовать browser.sleep(0).then(..);, где мне нужно толкать что-то к потоку транспортира.

это общий и простой способ передвижения.

Т.Л., др

так, используя выше, вы можете легко добавить функцию в браузере (или PTOR) что-то вроде:

browser.log = function(logger, level, msg){ 
    browser.sleep(0).then(function(){ logger[level](msg); }); 
} 

или что-то немного более сложным с apply - но это зависит от вашего регистратора.

вы можете, очевидно, что улучшить немного, чтобы иметь регистратор как апи

var logger = browser.getLogger('name'); 

должны быть реализованы как (предположим log4js)

browser.getLogger = function(name){ 
     var logger = require('log4js').getLogger(name); 

     function logMe(level) { 
       return function(msg){ 
         browser.sleep(0).then(function(){ logger[level](msg); }); 
       } 

     } 

     return { info : logMe('info'), ... } 
} 

в основном, небо это предел.

Я уверен, что есть способ сделать мой код намного короче, точка использует метод sleep в качестве основы.

+2

Это совершенно обман. Почему бы не использовать фактическую функцию, чтобы поместить ее в поток управления? 'browser.controlFlow(). execute (function() {...});' – mvndaai

+1

@mvndaai, я бы не назвал это изменой. Это не изящно. Согласен. Причина, по которой мне нравится использовать сон, - это то, что 'controlFlow' для меня - частный случай, когда sleep равен 0. –

1

Вы всегда можете утверждать, что текст, который вы получаете текст, который вы ожидаете:

expect(element(by.id('view-container')).getText()).toBe('desired-text');

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