10

Looking for some help on how I should be getting ahold of a new "pop-up" window that is triggered to display after I click a "login" button.

I am able to get to when the window is displaying but I do not believe that the code I am currently using to grab the window "handle" is working properly. My situation is a bit different in that I am using protractor inside my pages, but the new window comes up is NOT angular based, so I must switch over to using just selenium WebDriver while I am in that window. (Anyone have any idea if there could be issues with this approach?)

Below you can find the code snippet that I am using to create the selenium driver, as well as below that trying to "switch to / grab handle" of the new window that is popping up. I know that it is not working correctly because I keep receiving "No Such Element" errors in the code that follows trying to find a form on the page.

    // Create selenium webdriver / driver
    var webdriver = require('selenium-webdriver');

    var driver = new webdriver.Builder().
        withCapabilities(webdriver.Capabilities.chrome()).
        build();

  // Now make sure that the new window is popping up and we are navigating   correctly to it
      var handlePromise = browser.driver.getAllWindowHandles();
      handlePromise.then(function (handles) {
        // parentHandle = handles[0];
        var popUpHandle = handles[1];

        // Change to new handle
        browser.driver.switchTo().window(popUpHandle);

        var popUpHandleFinal = browser.driver.getWindowHandle();
        expect(popUpHandleFinal).toEqual(popUpHandle);
    });

Couple things about this:

  1. If I remove the "browser" in the line "browser.driver.switchTo().window(popUpHandle)" so it reads as "driver.switchTo().window(popUpHandle)" I receive back and error that reads as" UnknownError: unknown error: 'name' must be a nonempty string" After doing some searching on this it is because the "switchTo()" method on driver cannot be null. This error is cleared up if I just use the code shown above.

  2. I am not 100% sure if I should be using protractor (global "browser" var) or using the straight "driver" (Selenium) that I set before this as the way to get the windows.

Thank you for your help

gariepy
  • 3,576
  • 6
  • 21
  • 34
parchambeau
  • 1,141
  • 9
  • 34
  • 56
  • May be smth related: http://stackoverflow.com/questions/28511013/non-angular-page-opened-after-a-click. – alecxe Mar 01 '15 at 06:44
  • 1
    If you're already in the context of a working protractor driver, you do not need to start a separate webdriver-instance internally. (That will probably confuse the browser to have two remote controllers). Protractor exposes the raw webdriver its using via `browser.driver` so that should be correct to use. – P.T. Mar 01 '15 at 17:31
  • This was my main issue. Thank you. Once I took out setting the other driver then went back to using browser.driver after a few iterations I was able to get it to work. – parchambeau Mar 01 '15 at 23:25

4 Answers4

17

As of latest version of Protractor (v2.2) there should not be an issue in using protractor window handles, which returns an array of windows that are currently being displayed. As P.T has pointed out there is no need to invoke a separate driver instance but a browser global variable will work. The window that invokes popup has array index of 0 and popup window will have an array index of 1. Below is a sample of switching to the pop up window to work on it.

browser.getAllWindowHandles().then(function(handles){
    browser.switchTo().window(handles[1]).then(function(){
        //do your stuff on the pop up window
    });
});

Hope this helps.

giri-sh
  • 6,934
  • 2
  • 25
  • 50
  • Thank you, this really helps – lonewarrior556 Oct 16 '15 at 18:57
  • Hi I tried the code but getting the same error: UnknownError: unknown error: 'name' must be a nonempty string" Below is the code var handlePromise = browser.driver.getAllWindowHandles(); handlePromise.then(function (handles) { // parentHandle = handles[0]; var popUpHandle = handles[1]; // Change to new handle browser.driver.switchTo().window(popUpHandle); }); – anuvrat singh May 17 '16 at 13:56
  • @anuvratsingh can you debug a little more and tell me on which line you are facing this error? Also can you check the `handles` array length? I think you don't have two windows there but just one and so you cannot switch to `handles[1]`. Thanks – giri-sh May 17 '16 at 14:02
  • @GirishSortur - Can you suggest how to make it a generic function? I want this function to be used and switch to next tab irrespective of its position in chrome window. So if my browser is creating a new tab, i should switch to that new tab and if my new tab is creating another tab then my browser focus should switch to that new tab. – NewWorld Oct 19 '16 at 18:25
  • @NewWorld create a function that just calls switch to new window and you can use it whenever you want to switch to new window, which would be the last window array element. To get last array element use `array.length-1` operation. Example - `browser.switchTo().window(handles[handles.length-1])` - this will switch to last window thats opened. Hope it helps. – giri-sh Oct 20 '16 at 11:23
  • it('some spec', async () => { `await browser.switchTo().window(handles[1]);` // do your stuff }); – ViES Dec 11 '18 at 10:55
7

If you are clicking any link or button in order to open a pop up window, add some wait after click using browser.sleep(ms).

This worked for me and got rid of an error "missing 'handle' parameter"

element(by.className("name")).click();
browser.sleep(10000); //This line is important
var winHandles=browser.getAllWindowHandles();
winHandles.then(function(handles) 
{
    var parentWindow=handles[0];
    var popUpWindow=handles[1];
    browser.switchTo().window(popUpWindow);
    browser.switchTo().window(parentWindow);
})
Tunaki
  • 132,869
  • 46
  • 340
  • 423
Ajay Patil
  • 159
  • 1
  • 7
0

If you are calling https:// url and again redirect to http:// url then this popup is coming because of security issue.

1 - You have to configure both application in https:// or http://

-1

Check if the window is available coz count starts from 0 for window. So, try decrementing the count and use, it might work.. ;) As it worked for me doing that..