24

I'm running tests with protractor, but it seems impossible to access the JS 'window' object. I even tried adding a tag in my html file that would contain something like

var a = window.location;

and then try expect(a) but I couldn't make it work, I always get undefined references...

How should I process to access variables that are in the browser scope ?

hilnius
  • 2,165
  • 2
  • 19
  • 30

1 Answers1

30

Assuming you are using a recent version of Protractor, let's say >= 1.1.0, hopefully >= 1.3.1

Attempting to access Browser side JS code directly from Protractor won't work because Protractor runs in NodeJS and every Browser side code is executed through Selenium JsonWireProtocol.

Without further detail, a working example:

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

One-liner promise that, as of today, resolves to '1.3.0-rc.3'

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

You can use it directly in an expect statement given Protractor's expect resolves promises for you:

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

Longer example passing a function instead of a string plus without expect resolving the promise for you. i.e. for more control and for doing some fancy thing with the result.

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
});
Leo Gallucci
  • 16,355
  • 12
  • 77
  • 110
  • 1
    Actually with the protractor version I'm using, I had to use `browser.executeScript('return myvar;').then(function(myvar) { ... });` but worked perfectly, thanks! – hilnius Oct 10 '14 at 09:06
  • 2
    if i return just the window object using this method, i get "Maximum call stack size exceeded" :( – chrismarx Apr 07 '15 at 20:26
  • 1
    Is probably a bad idea anyway @chrismarx, return only what you really need ;) – Leo Gallucci Apr 08 '15 at 07:43
  • @LeoGallucci, what can you suggest if I need to get window variable which is not exist at this time? For example `window.angular.version.full;` but version will be populated some time in the future. – Yaroslav Basovskyy Oct 24 '18 at 18:33
  • sorry idk, it's been years since I used Protractor – Leo Gallucci Oct 25 '18 at 14:45