Focus on newly opened tab - selenium

I click a login button in my app that causes new tab to be openned but altough Chrome displays content of the new tab ChromeDriver still is operates on the old tab.
Question: How to make ChromeDriver "follow" newly opened tab so I can interact with elements in it?

when you open another tab using selenium, even though it opened another tab it will still operate on the parent tab(the one that is inside/invoked in the get method) in order to operate on the child tab(newly opened tab) you need to do this
//storing all the windows opened by default parent is index 0
Set<String>ids=driver.getWindowHandles();
Iterator<String> it = ids.iterator();
String parentId = it.next(); //1st one = parent tab
String childId = it.next(); //2nd one = child tab
driver.switchTo().window(childId); //switch to child window
System.out.println(driver.getTitle());
driver.switchTo().window(parentId); //switches back to parent window

You just need to switch to the new tab.
By default selenium driver will stay on the first tab that the driver has opened.
Selenium uses these 2 methods to handle it.
driver.getWindowHandle() [It will get the current tab handle]
driver.getWindowHandles() [It will get all the tab handles that are
open]
So, you need to store all the tabs in a variable and handle them one by one.
See the below example.
//I am using a set string "allWindowHandles1" to store all the tabs.
//I am using a simple string "handle1 " to handle the tabs one by one[if present]
//You can use the below for each loop in future if there is multiple child windows also
Set<String> allWindowHandles1 = driver.getWindowHandles();
for(String handle1 : allWindowHandles1) {
Thread.sleep(2000);
driver.switchTo().window(handle1);
//You can write your code to handle the elements in the child window here
//Now the driver will be in your child window
Thread.sleep(2000);
}

String winHandleNew = driver.getWindowHandle();
//Go through loop to get handle of newest window opened
for(String winHandle : driver.getWindowHandles()){
winHandleNew = winHandle;
}
// Switch to newest window opened
driver.switchTo().window(winHandleNew);

You need switch first, use .switchTo().window:
//handle original window
String original = driver.getWindowHandle();
//do something here to bring new window
btn.click();
for(String handle: driver.getWindowHandles()) {
driver.switchTo().window(handle);
if(!driver.getWindowHandle().equals(original)) {
//perform with new window
}
}
//back to original window
driver.switchTo().window(original);
With the above code you can switch again to original window.

Related

Handling a button that opens a new tab and redirects you to it

After clicking the create invoice button, it opens a new tab and redirects you to it. Next, it should click a button but it says no element exists. Did it search the element on the current page ? not on the new tab?
Tried explicit wait for that button and tried switching back and forth to the tab
#Test (priority=3)
public void ProductListExpress() {
driver.findElement(By.className("bttn-imp-create")).click();
System.out.println("Successful in proceeding to Purchase.php");
String newUrl1 = driver.getCurrentUrl();
if(newUrl1.equalsIgnoreCase("http://localhost:82/purchase.php")){
System.out.println("Successful in proceeding to Purchase page ");
}
else {
System.out.println("Failed in proceeding to Purchase page");
}
}
#Test (priority=4)
public void ClickInvoice() {
}
#Test (priority=5)
public void test() {
//Click create invoice button
driver.findElement(By.name("btncreateinvoice")).click();
System.out.println("Successful in clicking create invoice");
}
Expect to click button after redirecting.
First of all wait for 2nd window to open and be available to the WebDriver. You can use Explicit Wait for this like:
new WebDriverWait(driver,10).until(ExpectedConditions.numberOfWindowsToBe(2));
Check out How to use Selenium to test web applications using AJAX technology article for more information on the concept
Once you have the confidence that the number of windows is 2 you can use switchTo().window() function to change the context for the 2nd window:
driver.switchTo().window(driver.getWindowHandles().stream().reduce((f, s) -> s).orElse(null));
When you are clicking on new button, new tab is getting open. In this scenario, you need to use WindowsHandles. Try below code:
#Test (priority=3)
public void ProductListExpress() {
driver.findElement(By.className("bttn-imp-create")).click();
System.out.println("Successful in proceeding to Purchase.php");
Set<String> winHandles= driver.getWindowHandles();
Iterator<String> it = winHandles.iterator();
String parentWindowId = it.next();
String newWindowID= it.next();//Here you will get windows id of newly opened tab
driver.switchTo().window(newWindowID); //now your driver is switching to new tab
String newUrl1 = driver.getCurrentURL();
if(newUrl1.equalsIgnoreCase("http://localhost:82/purchase.php")){
System.out.println("Successful in proceeding to Purchase page ");
}
else {
System.out.println("Failed in proceeding to Purchase page");
}
}
You can switch to new tab with this way :
//Click create invoice button
driver.findElement(By.name("btncreateinvoice")).click();
System.out.println("Successful in clicking create invoice");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
during execution whenever a new tab or window opens, control of the driver still remains in the original tab or window unless we write couple of lines of code to manually switch the control to new tab or window.
In your case, Since the driver control is still in original tab and next element to click is in new tab, selenium is not able to find it, hence it says no element exists
#Test (priority=5)
public void test() {
WebDriverWait w= new WebDriverWait(driver, 10);
ArrayList<String> x = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(x.get(1)); // here x.get(1) indicates that
driver control is switched to new tab or new window
w.until(ExpectedConditions.elementToBeClickable("locator of button to be clicked"));
}
In case ,in your next steps if you can to continue execution in the original window or tab, you have to again switch selenium driver control back .
driver.switchTo().window(x.get(0));// during next steps if you want
driver control to switch back to original tab or window you have to write this line
of code
IDK if this is what you're asking, but it might be. I was CTRL+CLICKING a button to open a new tab. This is how I found the tab:
Set<String> curWindows = new HashSet<> (driver.getWindowHandles ());
String newWindowHandle = null;
a.keyDown(Keys.LEFT_CONTROL).click(THE_BUTTON).keyUp(Keys.LEFT_CONTROL).build().perform();
this.delay (500);
for (String windowHandle : driver.getWindowHandles ()) {
if (curWindows.contains (windowHandle) == false) {
newWindowHandle = windowHandle;
break;
}
}
if (newWindowHandle == null) {
log.error ("Unable to find the new window handle.");
return null;
}

How to close popup windows in Selenium?

I'm doing a test with java and popup windows appear (ads) and I do not know how to close them to continue with my test.
I have to click on a button but I change the focus to the window.
The url is www.orbitz.com
Please help!
orbitz
Java solution:
//switch to opened tab
ArrayList<String> tabs_windows = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs_windows.get(1));
//close current tab and switch driver back to original
((JavascriptExecutor)driver).executeScript("close();");
for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle);
}
I haven't tested this for a while, but in different browsers getWindowHandles() used to return different orders for the tabs. Not sure if you can assume 0 is the first tab for all browsers. Change the index accordingly, or store the current handle before popup, and close all that don't match that.

Unable to move focus using Action class in selenium webdriver

Hello I am working with popup which are made by
So while I click on one button i.e. "click1" it pops up one div window ..
So on this pop up I can play with element by using action class
WebElement element = wd.findElement(By.className("qx-window"));
Actions actions = new Actions(wd);
actions.moveToElement(element).click().perform();
Now from this popup while i click on another button it again pops up another popup and again I tried with action class but unable to set focus on the new pop up
So scenario is main window->popup->popup
can I able to remove focus from first pop up
Hear below selenium code is not working that's why I use action
for (String popup : wd.getWindowHandles())
{
wd.switchTo().window(popup);
}
Try with below flow
//Store main window handle in one variable
String mainWindowHandle = driver.getWindowHandle();
//click something on window to open popup1
Set<String> windowHandles = driver.getWindowHandles(); //It returns Set of available window handles
//from above set get popup1 handle and switch control to popup1
//==switch control to pop-up1
windowHandles.remove(mainWindowHandle);
String popup1Handle=(String)windowHandles.toArray()[0];
driver.switchTo().window(popup1Handle);
//do your operations in popup1
//===== YOUR ACTIONS GOES HERE FOR POPUP1
//click on button in popup1 which will open popup2
//switch the control to popup2
windowHandles = driver.getWindowHandles(); //It returns Set of available window handles, here it returns 3 window handles
windowHandles.remove(mainWindowHandle);
windowHandles.remove(popup1Handle);
String popup2Handle=(String)windowHandles.toArray()[0];
driver.switchTo().window(popup2Handle);
//do your operations in popup2
//===== YOUR ACTIONS GOES HERE FOR POPUP2
driver.close(); // this will close popup2 as control is in popup2
//switch the control to main window again
driver.switchTo().window(mainWindowHandle);

Close a Window in MSCRM 2013 by Selenium Webdriver

MY Test case is like on click of one Button(Update Customer) a new Window will open,after opening user verifies Data and will CLose the Window. The control need to back to Previous Window
I Have Written driver.close() . but it's not working
I think you problem is that the WebDriver is not focusing on the previous window.
Save your previous window handle:
String myWindowHandle = driver.getWindowHandle();
You can do this after you close the window:
driver.SwitchTo().window(myWindowHandle);
Update
String myWindowHandle = driver.getWindowHandle();
// click operation that opens new window
// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
// Do stuff
driver.close(); // This will close the current window (new one)
// Switch back to first window
driver.switchTo().window(myWindowHandle);

Selenium - how to change driver instance from parent to child window

I have a situation in Selenium , where we are launching new browser instance using Internet explorer driver .
normally the load URL is given in the same instance of IE that is launched this becomes the parent window , Now my issue is in parent window on click of a button a child window will open I need to give my second URL in child window which will continue to be my main page
The language we are using is Java
Used the below code to switch window from parent to child window
public static boolean handleMultipleWindows(WebDriver Driver) throws InterruptedException
{
Thread.sleep(4000);
String currentWindow= Driver.getWindowHandle(); // Storing parent window reference into a String Variable
System.out.println(" Check title " + Driver.getTitle() + Driver.getWindowHandles().size());
for (String popUpHandle : Driver.getWindowHandles()) {
if(popUpHandle.equalsIgnoreCase(currentWindow))
continue;
Driver.switchTo().window(popUpHandle);
String sTitle = Driver.getTitle();
but the problem in our application is the parent window gets close and when i try to play back the recording getting the below error
org.openqa.selenium.WebDriverException: Unable to get browser (WARNING: The server did not provide any stacktrace information).
Use method switchTo().window() method to switch between IE windows.
You didn't specify programming language that you use so my example is in Java:
//get window handlers as list
List<String> browserWindows = new ArrayList<String> (driver.getWindowHandles());
//switch to new window
driver.switchTo().window(browserTabs.get(1));
//do something
//then close window and get back
driver.close();
driver.switchTo().window(browserTabs.get(0));