2014-09-29 10 views
20

Ich führe Tests mit Winkelmesser, aber es scheint unmöglich, Zugriff auf das JS 'Fenster' Objekt. Ich habe sogar versucht, einen Tag in meiner HTML-Datei hinzufügen, die so etwas wieZugriff auf Fensterobjekt/Browser-Bereich von Winkelmesser

var a = window.location; 

und dann versuchen, erwarten (a), aber ich konnte nicht damit es funktioniert, habe ich immer undefinierte Referenzen bekommen ...

enthalten würden Wie sollte ich auf Variablen im Browserbereich zugreifen?

Antwort

21

Angenommen, Sie eine aktuelle Version von Protractor verwenden, lassen Sie uns sagen,> = 1.1.0, hoffentlich> = 1.3.1

den Zugriff auf Browser-Seite JS-Code Der Versuch, direkt von Protractor wird nicht funktionieren, weil Protractor in läuft NodeJS und jeder Browser-Side-Code wird durch Selenium JsonWireProtocol ausgeführt.

Ohne weiteres Detail, ein funktionierendes Beispiel:

browser.get('https://angularjs.org/'); 

Einzeiler Versprechen, dass, wie von heute, zu '1.3.0-rc.3'

browser.executeScript('return window.angular.version.full;'); 

lösen Sie können es direkt in einer erwarten Anweisung gegeben Protractor des erwarten löst Versprechungen für Sie:

expect(browser.executeScript('return window.angular.version.full;')). 
    toEqual('1.3.0-rc.3'); 

Lange Beispiel: Übergeben einer Funktion anstelle einer Zeichenfolge plus ohne expect Lösen des Versprechens für Sie. d. h. für mehr Kontrolle und um etwas Fantastisches mit dem Ergebnis zu machen.

browser.driver.executeScript(function() { 
    return window.angular.version.full; 
}).then(function(result) { 
    console.log('NodeJS-side console log result: ' + result); 
    //=> NodeJS-side console log result: 1.3.0-rc.3 
}); 
+1

Eigentlich mit der Transporteur Version ich verwende, hatte ich 'browser.executeScript zu verwenden ('return myvar;'), dann (function (myvar) {...});.' Aber funktionierte perfekt , Vielen Dank! – hilnius

+2

Wenn ich nur das Fenster-Objekt mit dieser Methode zurückgebe, bekomme ich "Maximale Call-Stack-Größe überschritten" :( – chrismarx

+1

Ist wahrscheinlich eine schlechte Idee sowieso @chrismarx, nur das zurückgeben, was Sie wirklich brauchen;) –