bmw0128
bmw0128

Reputation: 13698

Protractor console log

I want to output the text of a div in my protractor test, so far I have:

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

but this outputs

[object Object]

I tried "toString()" and same result.

Is there a way to output the text to the console?

Upvotes: 53

Views: 77529

Answers (7)

Sergey Pleshakov
Sergey Pleshakov

Reputation: 8948

If you're in 2021, you will want to read this answer

According to protractors documentation, .getText() returns a promise. Promise is an Object is javascript. So this is what you're logging.

You need to get the value off the promise, by resolving it

The best way to handle a promise, as of 2021, is to use async/await keywords. This will make Protractor 'freeze' and wait, until the promise is resolved before running the next command

it('test case 1', async () => {
  let text = await ptor.findElement(protractor.By.id('view-container')).getText();
  console.log(text);
  // or directly
  console.log(await ptor.findElement(protractor.By.id('view-container')).getText(););
})

.then() can also be used, but using async/await will make your code a lot more readable and easier to debug.

Upvotes: 0

Ketan Pardeshi
Ketan Pardeshi

Reputation: 782

When user wants to log the expected and actual result in protractor always use then method implementation.

verifyDisplayedText(locator: Locator, expectedText: string) {
const text = this.getText(locator);
try {
text.then(function(value){
if (value.trim() === expectedText) {
verifyLog("VERIFICATION: PASSED. Expected: '" + expectedText + "' Actual: '" + value+"'");
} else {
errorLog("VERIFICATION: FAILED. Expected: '" + expectedText + "' Actual: '" + value+"'");
}
});
expect(text).toBe(expectedText);
}catch (error1) {
errorLog("VERIFICATION: FAILED. Expected: '" + expectedText + "' Actual: '" + text+"'");
throw error1;
}
}

Upvotes: 0

SeanRay
SeanRay

Reputation: 31

you can try this one:

const textInfo = element(by.id('view-container'));
console.log('text: ', textInfo.getText());

Upvotes: 0

Vlad A
Vlad A

Reputation: 154

You could always assert that the text you get is the text you expect:

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

Upvotes: 2

guy mograbi
guy mograbi

Reputation: 28608

I would like to suggest a small improvement to other answers.

short answer : I like to use browser.sleep(0).then(..); where I need to push something to protractor's flow.

it is generic and easy to move around.

tl;dr

so using the above, you can easily add a function on browser (or ptor) something like:

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

or something a bit more sophisticated with apply - but that depends on your logger.

you can obviously enhance that a bit to have logger like api

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

should be implemented like (lets assume 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'), ... }
}

basically, the sky is the limit.

I am sure there's a way to make my code a lot shorter, the point is using the sleep method as basis.

Upvotes: 6

Zach Folwick
Zach Folwick

Reputation: 921

this is pretty old, but as a former n00b at protractor, I wished there was more documentation.

you could also use:

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

or what I like to do for readability is put all the objects on a page in their own function, section, or file:

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

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

viewContainer.then(console.log);

That will take care of most of your garden-variety debugging needs.

For promises in general, you could try using protractor.promise.all()

let's say you have two things that are both promises:

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
});

This second method is useful for when things begin to get more complex. personally, however, I find other ways around this. Although it's not bad, it's kind of funky for other developers having to read my code.

Upvotes: 33

Jmr
Jmr

Reputation: 12108

getText and most other Protractor methods return promises. You want to put your console.log statement inside the promise resolution:

Using the new Protractor syntax:

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

Upvotes: 112

Related Questions