Prasanna
Prasanna

Reputation: 468

How to switch between two windows in browser using Selenium java

I'm working with Selenium Automation. In this, When i click a link in a current window, a new window opens. I just want to switch the control to the new window. But i can't do this.Actually the new window is an auto-generated one. That is, link will be generated dynamically. Help me friends...

Upvotes: 5

Views: 88216

Answers (8)

Ajeet Yadawa
Ajeet Yadawa

Reputation: 163

Here is the best methods to switch in window using index and title. you can add in base class and use it frequently.

public  void switchToWindow(String windowTitle) {
    Set<String> windows = driver.getWindowHandles();
    for (String window : windows) {
        driver.switchTo().window(window);
        if (driver.getTitle().contains(windowTitle)) {
            return;
        }
    }
}




  public void switchToWindow(int index) {
    Set<String> windows = driver.getWindowHandles();
    int totalWin= windows.size();
    String winTitle = null;
    for(int i=0;i<totalWin;i++) {
        if(i==index) {
        winTitle = windows.toArray()[i].toString();
    }
    }
    driver.switchTo().window(winTitle);
    System.out.println(winTitle);
}

Upvotes: 1

Avinash Pande
Avinash Pande

Reputation: 1538

To switch between windows we have method.

driver.switchTo().window("window name") 

To get the different windows handle, we have method.

driver.getWindowHandles()

Example:

    File file = new File("G:\\Selenium\\All_Jars\\chromedriver.exe");
    System.setProperty("webdriver.chrome.driver",file.getAbsolutePath() );
    driver = new ChromeDriver();

    //Maximize the window
    driver.manage().window().maximize();

    driver.get("http://www.rediff.com/");

    //Get all window handles
    Set<String> allHandles = driver.getWindowHandles();

    //count the handles Here count is=2
    System.out.println("Count of windows:"+allHandles.size());      

    //Get current handle or default handle
    String currentWindowHandle = allHandles.iterator().next();
    System.out.println("currentWindow Handle"+currentWindowHandle);

    //Remove first/default Handle
    allHandles.remove(allHandles.iterator().next());

    //get the last Window Handle
    String lastHandle = allHandles.iterator().next();
    System.out.println("last window handle"+lastHandle);

    //switch to second/last window, because we know there are only two windows 1-parent window 2-other window(ad window)
driver.switchTo().window(lastHandle);
    System.out.println(driver.getTitle());
    driver.findElement(By.tagName("body")).click();

Upvotes: 7

Lishani
Lishani

Reputation: 41

//to get the current/parent window

String parentWindowContact = driver.getWindowHandle();

//to switch to the new window from current/parent window

Set<String> handleswindow =driver.getWindowHandles();

for(String windowHandle : handleswindow)

{

   driver .switch To().window(windowHandle);

}

//to close the new window

driver.close();

//to switch back to the parent window

driver.switchTo().window(parentWindowContact);
          o switch back to the parent window

driver.switchTo().window(parentWindowContact);

Upvotes: 0

user
user

Reputation: 29

    // fetch all windows before clicking on new window link.
    Set<String> windowHandles = driver.getWindowHandles();
    // Click on link to open new window
    driver.findElement(By.tagName("a")).click();  // link to open new window

    Set<String> updatedWindowHandles = driver.getWindowHandles();
    updatedWindowHandles.removeAll(windowHandles);
    for (String window: updatedWindowHandles) {
        driver.switchTo().window(window);
    }

Upvotes: -1

vivek
vivek

Reputation: 1

      Set <String> set = driver.getWindowHandles();
      Iterator<String> it = set.iterator();
      String parentWindowId = it.next();
      String childWindowId = it.next();
      System.out.println(set);
      driver.switchTo().window(childWindowId);

Upvotes: 0

Prasanna
Prasanna

Reputation: 468

I finally found the answer, I used the below method to switch to the new window,

public String switchwindow(String object, String data){
        try {

        String winHandleBefore = driver.getWindowHandle();

        for(String winHandle : driver.getWindowHandles()){
            driver.switchTo().window(winHandle);
        }
        }catch(Exception e){
        return Constants.KEYWORD_FAIL+ "Unable to Switch Window" + e.getMessage();
        }
        return Constants.KEYWORD_PASS;
        }

To move to parent window, i used the following code,

 public String switchwindowback(String object, String data){
            try {
                String winHandleBefore = driver.getWindowHandle();
                driver.close(); 
                //Switch back to original browser (first window)
                driver.switchTo().window(winHandleBefore);
                //continue with original browser (first window)
            }catch(Exception e){
            return Constants.KEYWORD_FAIL+ "Unable to Switch to main window" + e.getMessage();
            }
            return Constants.KEYWORD_PASS;
            }

Upvotes: 3

SpartanElite
SpartanElite

Reputation: 624

Yes this is possible. First you need to save the refrence to current window.

String parentWindow= driver.getWindowHandle();

The after having clicked the link, you need to switch to the other window.

List<String> allWindows = driver.getWindowHandles();
for(String curWindow : allWindows){
    driver.switchTo().window(curWindow);
}

This is where you perform operations on new window, finally closing it with

driver.close();

and switch back to parent window

driver.switchTo().window(parentWindow);

Upvotes: 3

ddavison
ddavison

Reputation: 29032

In an excerpt from a getting started with selenium webdriver project on github,

    /**
     * Waits for a window to appear, then switches to it.
     * @param regex Regex enabled. Url of the window, or title.
     * @return
     */
    public AutomationTest waitForWindow(String regex) {
        Set<String> windows = driver.getWindowHandles();

        for (String window : windows) {
            try {
                driver.switchTo().window(window);

                p = Pattern.compile(regex);
                m = p.matcher(driver.getCurrentUrl());

                if (m.find()) {
                    attempts = 0;
                    return switchToWindow(regex);
                }
                else {
                    // try for title
                    m = p.matcher(driver.getTitle());

                    if (m.find()) {
                        attempts = 0;
                        return switchToWindow(regex);
                    }
                }
            } catch(NoSuchWindowException e) {
                if (attempts <= MAX_ATTEMPTS) {
                    attempts++;

                    try {Thread.sleep(1);}catch(Exception x) { x.printStackTrace(); }

                    return waitForWindow(regex);
                } else {
                    fail("Window with url|title: " + regex + " did not appear after " + MAX_ATTEMPTS + " tries. Exiting.");
                }
            }
        }

        // when we reach this point, that means no window exists with that title..
        if (attempts == MAX_ATTEMPTS) {
            fail("Window with title: " + regex + " did not appear after 5 tries. Exiting.");
            return this;
        } else {
            System.out.println("#waitForWindow() : Window doesn't exist yet. [" + regex + "] Trying again. " + attempts + "/" + MAX_ATTEMPTS);
            attempts++;
            return waitForWindow(regex);
        }
    }

    /**
     * Switch's to a window that is already in existance.
     * @param regex Regex enabled. Url of the window, or title.
     * @return
     */
    public AutomationTest switchToWindow(String regex) {
        Set<String> windows = driver.getWindowHandles();

        for (String window : windows) {
            driver.switchTo().window(window);
            System.out.println(String.format("#switchToWindow() : title=%s ; url=%s",
                    driver.getTitle(),
                    driver.getCurrentUrl()));

            p = Pattern.compile(regex);
            m = p.matcher(driver.getTitle());

            if (m.find()) return this;
            else {
                m = p.matcher(driver.getCurrentUrl());
                if (m.find()) return this;
            }
        }

        fail("Could not switch to window with title / url: " + regex);
        return this;
    }

These are 2 custom functions to help you get started. Or you can check out that project from github to make your selenium projects better designed and easier.

These functions can switch to, or wait for (if it doesn't exist) a window with a certain title / url.

Upvotes: 1

Related Questions