web-dev-qa-db-fra.com

Protractor set global variables

J'essaie de définir une variable globale sur le rapporteur à utiliser dans tous les blocs de description.

var glob = 'test';

describe('glob test', function () {
    it('should set glob', function () {
        browser.get('http://example.com/test');
        browser.executeScript(function () {
            window.glob = glob;
        });
    });    
});

Mais cela me renvoie l'erreur suivante:

Message:
[firefox #2]      UnknownError: glob is not defined

J'ai également examiné cette question: variables globales angularJS du rapporteur

j'ai donc essayé de définir la variable glob dans conf.js de cette façon:

exports.config = {
  ...,
  onPrepare: function () {
      global.glob = 'test';
  }
};

Toujours, avoir la même erreur.

Comment puis-je ajouter des variables globales correctement dans les tests de rapporteur?

20
pietrovismara

Il est possible de définir des globaux à partir du fichier de configuration Protractor à l'aide de la propriété params:

exports.config = {
    // ...

    params: {
        glob: 'test'
    }

    // ...
};

Et vous pouvez y accéder dans les spécifications en utilisant browser.params.glob.

Voir fichier de configuration de référence .

L'objet params sera transmis directement à l'instance Protractor et sera accessible à partir de votre test en tant que browser.params. C'est un objet arbitraire et peut contenir tout ce dont vous pourriez avoir besoin dans votre test. Cela peut être modifié via la ligne de commande comme:

protractor conf.js --params.glob 'other test'

Mise à jour:

Depuis les documents pour browser.executeScript :

Si le script est fourni en tant qu'objet fonction, cette fonction sera convertie en une chaîne à injecter dans la fenêtre cible. Tous les arguments fournis en plus du script seront inclus comme arguments de script et peuvent être référencés à l'aide de l'objet arguments.

Ainsi, la portée JavaScript dans ce cas ne fonctionne pas, votre fonction est passée à browser.executeScript n'aura pas de variables de fermeture de spécification comme browser. Mais vous pouvez transmettre ces variables explicitement:

browser.executeScript(function (glob) {

    // use passed variables on the page
    console.log(glob);

}, browser.params.glob);
39
Michael Radionov

Vous pouvez également définir des variables globales dans onPrepare() à l'aide de global:

onPrepare: function () {
    global.myVariable = "test";
},

Ensuite, vous utiliserez simplement myVariable tout au long des tests tel quel.

C'est en fait ainsi que protractor, browser et d'autres variables globales intégrées ont été rendues disponibles globalement :

Runner.prototype.setupGlobals_ = function(browser_) {
  // Export protractor to the global namespace to be used in tests.
  global.protractor = protractor;
  global.browser = browser_;
  global.$ = browser_.$;
  global.$$ = browser_.$$;
  global.element = browser_.element;
  global.by = global.By = protractor.By;

  // ...
}

Notez qu'avec cette approche, vous polluez votre portée/espace de noms global, soyez prudent.

22
alecxe