I am testing a web application that creates a new window long after a button is clicked. The sequence is the following
window 1: (parent window) click button to create window 2
window 2: progress window appears until background process on server returns data
window 3: progress window turns into 3rd window (with different handle)
I want to properly wait for the 3rd window to appear. I know what the 'title' of all 3 windows will be however in order to get the titles from WebDriver I have to use the following code:
while(timeout has not occured...){
for (String handle : _driver.getWindowHandles()) {
String myTitle = driver.switchTo().window(handle).getTitle();
if(3rdWindowTitle.equalsIgnoreCase(myTitle)){
return true;
}
}
}
This will effectively switch the active window back and forth every time it loops because of the 'switchTo'. This causes the firefox windows to cycle back and forth really quickly and is obnoxious. What I need is a way to get the title's of the windows that are available without having to 'switchTo' each window in a loop waiting for the 3rd window. Any ideas?
I basically want a method (waitForWindowByTitle(titleIWant)) which will block until the window with the title I want appears.
Well, Better you can wait for your window to appear by checking the number of windows. Like:
for(int i=0; i<noOfTrials;i++){
noOfWindows = driver.getWindowHandles().size();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
if(noOfWindows>currentNoOfWindows){
break;
}
}
}
then for the first and last time you can browse through the windows (using switchTo) and navigate to the window you want.
Related
Selenium webdriver | driver().switchTo().defaultContent() method is not switching the control back to parent window from multiple child windows.
I am facing problem with respect to no of windows and not frames. When I click a button on parent window say wp, a new web window say w1 is getting generated and eventually one more window gets generated say w2 , I want to switch to control to wp so I am using
driver.switchTo.defaultContent()
but its not switching control to parent window.
i have this problem to.
and i find answer
try this, and give me feedback - maybe i can help you
const number1 = await driver.wait(until.elementLocated(By.xpath('your xpath')))
await driver.executeScript("arguments[0].click()", number1).then(() =>{
console.log(driver.executeScript, 'Click done');
})
are you looking for switching to window tabs or iframe ?
for frames : we need to do,
driver.switchTo().defaultContent();
driver.switchTo.parentFrame();
for windows :
String parentwindow = driver.getWindowHandle();
List<String> allwindows = new ArrayList<>(driver.getWindowHandles());
driver.switchTo().window(allwindows.get(1));
driver.switchTo().window(parentwindow);
There are two similar methods that can be used while switching to parent frames, but there is a slight difference between them.
driver.switchTo().defaultContent()
driver.switchTo().parentFrame()
E.g.: You have three frames i1,i2,i3 and you are on frame i3,
when you use driver.switchTo.defaultContent(), it will take you to i1, whereas with
driver.switchTo.parentFrame() control will switch to i2 i.e. immediate parent frame (parent frame of the current frame).
If the process opens multiple browser tabs, we need to use switchTo().window(window reference); to switch focus between the tabs.
// Save the initial tab as parentwindow
String parentwindow = driver.getWindowHandle();
// Collect the tabs opened in a list
List<String> windows = new ArrayList<>(driver.getWindowHandles());
// Switch to window other than parentwindow
driver.switchTo().window(windows.get(1));
// Switch back to parentwindow
driver.switchTo().window(parentwindow);
I was using RemoteWebDriver for my cloud session where VM were running tests. Locally, it worked for me using $ driver.switchTo().defaultContent() $, but all of a sudden, it did not work with RemoteWebDriver. I resolved my issue using:
driver.switchTo().parentFrame();
I am writing a code using selenium.
On a particular click there are chances of coming one of two windows. and both the windows takes around 20-50 seconds of time to appear.
so i want to switch to whichever window appears.
I have no way to predict which window is going to appear
Current process - i am searching for main window for some seconds and if it is not found i am trying to search small pop up window with ok button on it. If found click on it. if not found again try to find main window it is taking time.
If i have a way to switch to latest window and by checking its title which window it is and do the appropriate action.
Edited - main window is not the original window. There are total 3 windows in picture . One og window where i have to click . now after clicking main window can appear or small popup window can apear with ok button.
You can try something like this for your problem
// Store the current window handle
String mainWin = driver.getWindowHandle();
// Perform the click operation that opens new window
//Wait till driver.getWindowHandles() returns 2 windows
// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
//Get current window to take decision on the next actions
String currentWin= driver.getWindowHandle();
// Perform the actions on new window
// Close the new window
driver.close();
// Switch back to original first window
driver.switchTo().window(mainWin);
To handle windows size, you can use .getWindowHandles(), and try use while loop to wait the new windows appear, then you can iteration again all current window.
int sizeBefore = driver.getWindowHandles().size();
elemnt.click();//to bring up new windows
//until current windows size>before, please keep adding timeout
while(driver.getWindowHandles().size()==sizeBefore) {
//wait in milliseconds
Thread.sleep(500);
}
//handle current size windows
ArrayList<String> hnds = new ArrayList<String> (driver.getWindowHandles());
//iteration windows
for(String hnd: hnds) {
driver.switchTo().window(hnd);
System.out.println(driver.getTitle());
}
To switch to particular windows, use:
driver.switchTo().window(hnds.get(index));
You should save the window handle for the main window before any action is done.
String mainWindow = driver.getWindowHandle();
Now click and do the following:
You can poll for 30 seconds max time with interval say 5 seconds, break the polling the moment you get more than one window handle.
Set<String> windows = driver.getWindowHandles();
let me know in which language you are working.
I can help you with the code.
Hi you can use Javascript for switching wondow: below are the code:
((JavascriptExecutor)LoginDriver).executeScript("window.open('about:blank', '-blank')");
// To switch to the new tab
ArrayList<String> tabs = new ArrayList<String>(LoginDriver.getWindowHandles());
LoginDriver.switchTo().window(tabs.get(1));
I am working with Selenium, now there is a condition:
when I hit a button in my webpage a window pop up opens up.
Now I have to click a radio button (one out of two, it will work even if we send a TAB ) and then click an OK button. I searched in the net and got to know about "driver.getWindowHandle()".
But I don't have any idea dealing with the newly opened window popup.
Need help in this.
For switching purpose u can use enhanced for loop:
for (String winHandle : objDriver.getWindowHandles()) {
objDriver.switchTo().window(winHandle);
}
So it will switch the control from one driver window to child windows.
To interact with elements on the window try to find element with whatever tool u r using and perform the required action after switching to the window.
To return back to parent window you can use the same loop or use:
driver.switchTo().defaultContent();
Check my answer in this post and also read the comments to help you understand the difference between getWindowHandle() and getWindowHandles()
Java: focus is not on pop-window during window handling
We handled this situation using AutoItX - https://www.autoitscript.com/site/ in our Windows/IE C# project:
AutoItX3 autoIt = new AutoItX3();
var handle = autoIt.WinWaitActive("[window title]", "", 20);
Assert.IsTrue(handle != 0", string.Format("Was not able to find: {0}", [window title]);
autoIt.Send("{ESCAPE}"); // tab may work as well for selection
The pop up was a Windows window, and not part of IE, therefore the WebDriver didn't know about it.
Hope this helps.
I am trying to automate initial configuration(of my server) through webpage. After hitting my server ip https:/localhost:4443 and entering my credentials ,i get a window to change password(overlay/popup window).
Problem:- if i browse the same ip from another m/c or from another browser , i get a window over window i.e one more window over change password window(Please click the link to see the screenshot).
What i tried is to get the handle of the window but its not working, its providing one handle only.
**Its not frame also.
HTML code -- https://dl.dropboxusercontent.com/u/91420517/Html_Code.JPG
Here's my code
WebDriver driver=new FirefoxDriver();
driver.get("https://localhost:4443/ControlPoint/");
driver.findElement(By.xpath("//*[#id='name']")).sendKeys("xxxxxx");
driver.findElement(By.xpath("//*[#id='pass']")).sendKeys("xxxxxx");
driver.findElement(By.xpath("//*[#id='loginForm123']/div[6]/div[1]/div")).click();
Set<String> winIds = driver.getWindowHandles();
System.out.println("Total Windows --- " + winIds.size()); // its resulting the size as 1 which is not correct.
Iterator<String> it = winIds.iterator();
String mainWin=it.next();
String changeWin=it.next();
String shareWin =it.next();
driver.switchTo().window(shareWin);
String warning = driver.findElement(By.xpath("html/body/div[4234]/div[1]/span")).getText(); // to get the text on 3 window
System.out.println(warning);
How to resolve this issue .Please help. Any other way to click on buttons on window 3.
If the additional window is opened asynchronously, then possibly you are checking for it (with getWindowHandles()) too early, before it has been created - this is a common issue with Selenium tests and asynchronous page updates.
If this is the issue, it can be solved by trying a few times with a wait in between, checking each time whether a new window has appeared.
Let's say
I have a window 1. I have performed an event on the window 1 that makes window 2 to appear.
Now I switched to the window 2 and clicked a button on it which closes window 2.
If I use driver.close() after I performed an event which caused the window to close, sometimes it throws NoSuchWindowException.
If I don't use the driver.close() then sometimes driver.getWindowHandles().size() returns 2 even when there is only one window and I have waited enough time to number of windows become 1.
I refresh driver.getWindowHandles() and check for the driver.getWindowHandles().size() to become 1 but it doesn't sometimes.
My question is, do I need to use the method driver.close() after I clicked the button that caused the window to close? How to use the driver.close() correctly.
EDIT: Yes, it is a problem. If selenium doesn't realize window2 has been closed, it keeps returning the handles to be 2. Suppose that I closed window2 and switched back to window1 and performed an event which opens window3. Now I want to switch to window3. Here is the problem because Selenium still think windows2 exists and now there are three windows according to the Selenium.
String window1Handle = driver.getWindowHandle();
//Now I have oepend window3
//According to the Selenium there are 3 windows
// So driver.getWindowHandles().size() returns 3
for (String window : driver.getWindowHandles() {
if (!window.equals(window1Handle)) {
driver.switchTo().window();
The above line may throw exception because driver is trying to switch to a window which has already been closed"
No you don't need to perform a driver.close(), if anything is left open, when you perform a driver.quit() at the end of your test WebDriver will clean up and make sure that everything is shut down correctly.
Selenium can track how many windows are open, if you are seeing window handles for windows that are closed that sounds like a potential bug. Bear in mind that it may take some time for Selenium to realise that the window has been closed, you could try using an explicit wait to wait for the count of window handles to drop back down to 1, you'll need to add the following ExpectedCondition:
public static ExpectedCondition<Boolean> numberOfWindowsToBe(final int numberOfWindows) {
return new ExpectedCondition<Boolean>() {
#Override
public Boolean apply(WebDriver driver) {
return driver.getWindowHandles().size() == numberOfWindows;
}
};
}
Then you can use it by doing:
WebDriverWait wait = new WebDriverWait(driver, 15, 100);
wait.until(numberOfWindowsToBe(1));
or you could just try closing the window by performing a driver.close() and catching the NoSuchWindowException e.g.
try{
driver.close();
} catch(NoSuchWindowException ignored){
System.out.println("Window already closed");
}
This should give Selenium the kick it needs to realise that the window has been closed (Although to be honest I wouldn't bother).
*EDIT*
So it sounds like the problem is that you have multiple window handles and you don't know which one is the window that has been closed, and which one is your newly opened window. One workaround would be to track the window handles in a Map. Every time you open a new window store the window handle in the map like this:
Map<String, String> openedWindows = new HashMap<String, String>();
openedWindows.put("Window 1", driver.getWindowHandle());
You will then know which window handle is associated with your window, you can then remove windows from the map as they are closed. You will know which handles that are still being reported are actually closed and which are being reported in error.
Really this sounds like a bug in Selenium window handling and I would suggest you raise an issue on the issue tracker with a minimal test script that reproduces the problem. Of course the other option above is still valid, try and close the window but catch the exception and see if that gives Selenium the kick it needs to remove it from the list of window handles.
I had the same exact issue You are facing.
Before i perform an action which pops up second window, i intiated
String window = driver.getWindowHandle();
Later i clicked link 1 which populates window 2 and i switch to that window
driver.switchTo().window(window name);
i performed my action in Window 2 and when i click the link in Window 2 my window closes automatically and if i use driver.close() it wont happen as webdriver will throw error as u said
so instead of trying to close the second window, i try to switch back to window 1 with
driver.switchTo().window(window);
This is because since window 2 is closed automatically and since the control does not pass to window 1 the error will happen.. So there is no necessity to close window 2. instead we can switch back to our default window and continue or close the default window..
I know that this is a bit of a hack...but I've never seen something like what you are describing, so I think its worth a try. Change this code:
driver.switchTo().window();
to something like this:
try{
driver.switchTo().window();
perform action that will throw error
return; //will return if error wasn't thrown
catch(Error thrown if on bad window){
//continue in your for loop to switch to the next window;
}
I wrote a method that is working pretty good for me.
public static boolean letWebDriverRealizeThisWindowHasBeenClosed(WebDriver driver,
String closedWindowHandle) {
/**
* to avoid infinite loop, do write a break when definite time has been passed
*/
/**
* Generally, this method returns true given that window is closed
*/
boolean isWebDriverRealized = false;
long start = System.currentTimeMillis();
long end = start + (30 * 1000); //30 seconds
while (!isWebDriverRealized
&& System.currentTimeMillis() < end) {
try {
driver.switchTo().window(closedWindowHandle);
} catch (NoSuchWindowException nswe) {
isWebDriverRealized = true;
}
}
return isWebDriverRealized;
}
If this method returns true, then it means WebDriver has realized that window has been closed. driver.getWindowHandles.size() returns the correct number of windows once the above method returns true.
No, you don't need to do that. Because second window is already close, and if you will use method driver.close() it will close your first window and the browser itself(because there is only one tab left in browser window).
Its depends upon the Window,
some Window close while click on outside Window content, in that case no need of driver.close() method.
but for some Window, click on outside the Window content, Window unable to close (i.e. Window gets close after click on close button), in that case need to close such Window using thedriver.close() method.