Protractor console log

2020-01-30 04:37发布

问题:

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?

回答1:

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


回答2:

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.



回答3:

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.



回答4:

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

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



回答5:

you can try this one:

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


回答6:

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