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\'
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;
}
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);
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);
}
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.
//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);
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);