2015-07-03 13 views
16

Próbuję ustawić globalną zmienną na kątomierzu do użycia we wszystkich blokach opisu.Zestaw globalnych zmiennych kątomierza

var glob = 'test'; 

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

Ale to zwraca mi następujący błąd:

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

ja również spojrzał na to pytanie: protractor angularJS global variables

tak starałem się ustawić zmienną glob w conf.js w ten sposób:

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

Nadal, mając ten sam błąd.

Jak mogę poprawnie wprowadzić zmienne globalne w testach kątomierza?

Odpowiedz

33

Możliwe jest ustawienie globalnych z pliku konfiguracyjnego Kątomierz z pomocą params nieruchomości:

exports.config = { 
    // ... 

    params: { 
     glob: 'test' 
    } 

    // ... 
}; 

I można do niego dostęp w specyfikacji korzystających browser.params.glob.

Zobacz reference config file.

The params object will be passed directly to the Protractor instance, and can be accessed from your test as browser.params. It is an arbitrary object and can contain anything you may need in your test. This can be changed via the command line as:

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

Aktualizacja:

Z docs for browser.executeScript:

If the script is provided as a function object, that function will be converted to a string for injection into the target window. Any arguments provided in addition to the script will be included as script arguments and may be referenced using the arguments object.

więc zakres JavaScript w tym przypadku nie działa, to funkcja, która jest przekazywana do browser.executeScript nie będzie mieć dowolne zmienne zamykające ze specyfikacji, takie jak browser. Ale można przekazać te zmienne wyraźnie:

browser.executeScript(function (glob) { 

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

}, browser.params.glob); 
+0

próbuję, jedynym problemem jest to, że gdy próbuję get browser object wewnątrz wywołania zwrotnego browser.executeScript, otrzymuję UnknownError: nieznany błąd: przeglądarka nie jest zdefiniowana – pietrovismara

+0

Dodałem rozwiązanie robocze dla 'browser.executeScript' do odpowiedzi. –

+0

Teraz działa idealnie! Dziękuję za Twój czas. – pietrovismara

16

Można również ustawić zmienne globalne w onPrepare() użyciu global:

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

Wtedy byłoby po prostu użyć myVariable całym testów, jak jest.

To jest rzeczywiście jak protractor, browser i innych wbudowanych zmiennych globalnych were made available globally:

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; 

    // ... 
} 

Należy zauważyć, że z takim podejściem jesteś zanieczyszczających swój globalny zakres/nazw, należy zachować ostrożność.

+0

Od pewnego czasu borykam się z tym problemem - używanie tego podejścia działa, z wyjątkiem sytuacji, gdy robię coś takiego jak 'global.foo = require ('./ foo.js');' gdzie 'foo.js' jest czymś prostym jak 'module.exports = 'asdf';' –

-4

Wiem, że jestem trochę późno na odpowiedź, ale tutaj jest inny sposób ustawiania zmiennych globalnych, które mogą być stosowane w całym pliku

describe("Some Global most outer describe", function(){ 
    var glob = "some global variable"; 
    var blob = "some other global variable"; 

    it('should test glob', function(){ 
     expecte(glob).toEqual("some global variable"); 
    }); 

    it('should test blob', function(){ 
     expecte(glob).toEqual("some other global variable"); 
    }); 

    describe('Some inner describe', function(){ 
     //Some other inner tests can also see glob and blob 
    }); 
}); 
+2

** glob ** i ** blob ** nie mogą być używane w zakresie opisanym poza ("Jakiś globalny najbardziej zewnętrzny opis", funkcja()) Zamiast tego deklaruj je na zewnątrz, zainicjuj i używaj ich wszędzie, gdziekolwiek jesteś przez ten plik. – Subhash

+0

Cóż, to jest to samo co mój przykład, z wyjątkiem przeniesienia deklaracji zmiennych wewnątrz funkcji opisującej. To nie działa. – pietrovismara

+0

Działa, jeśli masz inne opisy wewnątrz najbardziej zewnętrznej opisać. Tak to użyłem jakiś czas temu ... Zgadzam się, że to nie jest najlepsze rozwiązanie. – Haseeb