web-dev-qa-db-fra.com

Journal de la console de rapporteur

Je veux sortir le texte d'une div dans mon test de rapporteur, jusqu'à présent j'ai:

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

mais cela produit

[object Object]

J'ai essayé "toString ()" et le même résultat.

Existe-t-il un moyen de sortir le texte sur la console?

49
bmw0128

getText et la plupart des autres méthodes de Protractor renvoient des promesses. Vous voulez mettre votre console.log déclaration dans la résolution de la promesse:

En utilisant la nouvelle syntaxe de Protractor:

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

c'est assez vieux, mais en tant qu'ancien n00b chez le rapporteur, j'ai souhaité qu'il y ait plus de documentation.

vous pouvez aussi utiliser:

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

ou ce que j'aime faire pour la lisibilité est de mettre tous les objets d'une page dans leur propre fonction, section ou fichier:

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

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

viewContainer.then(console.log);

Cela répondra à la plupart de vos besoins en matière de débogage de variétés de jardin.

Pour les promesses en général, vous pouvez essayer d’utiliser protractor.promise.all()

disons que vous avez deux choses qui sont à la fois des promesses:

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

Cette seconde méthode est utile lorsque la situation devient plus complexe. personnellement, cependant, je trouve d'autres moyens de contourner ce problème. Bien que ce ne soit pas mauvais, c'est plutôt funky pour d'autres développeurs qui doivent lire mon code.

33
Zach Folwick

Je voudrais suggérer une légère amélioration aux autres réponses.

réponse courte: J'aime utiliser browser.sleep(0).then(..); où j'ai besoin d'insérer quelque chose dans le flux du rapporteur.

c'est générique et facile à déplacer.

tl; dr

en utilisant ce qui précède, vous pouvez facilement ajouter une fonction sur votre navigateur (ou votre ptor), par exemple:

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

ou quelque chose d'un peu plus sophistiqué avec apply - mais cela dépend de votre enregistreur.

vous pouvez évidemment améliorer cela un peu d'avoir enregistreur comme api

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

devrait être implémenté comme (supposons 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'), ... }
}

fondamentalement, le ciel est la limite.

Je suis sûr qu'il existe un moyen de raccourcir mon code beaucoup, il s'agit d'utiliser la méthode sleep.

5
guy mograbi

Vous pouvez toujours affirmer que le texte que vous obtenez est celui que vous attendez:

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

2
Vlad Alexa

vous pouvez essayer celui-ci:

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