Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switching to new window with Selenium/Protractor Javascript

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

like image 904
parchambeau Avatar asked Feb 28 '15 23:02

parchambeau


People also ask

How do I switch one window to another in protractor?

switchTo(). window() : switchTo() method in protractor helps user to switch between windows, frames, elements, alerts. switchTo(). window(GU ID) method switches the control from the current browser window to the target browser window, which has the specified "GU ID".

How do I switch to next window in Selenium?

Use the SwitchTo command to switch to the desired window and also pass the URL of the web page.

How do you switch tabs with a protractor?

switchTo() method enables easy management of windows, tabs, and switch between the two. It shifts the control from the current window to the target windows. The GUID is passed as an argument to indicate the Protractor about the target window or tabs.

How does Selenium handle open a new window?

Open a New Tab await driver. get('https://selenium.dev'); // A new tab is opened and switches to it await driver. switchTo(). newWindow('tab'); // Loads Sauce Labs open source website in the newly opened window await driver.


Video Answer


2 Answers

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.

like image 156
giri-sh Avatar answered Oct 20 '22 15:10

giri-sh


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);
})
like image 39
Ajay Patil Avatar answered Oct 20 '22 15:10

Ajay Patil