For automation purposes, I am working on creating a script that finds a row in a table. This row is clickable and opens a new tab/adress.
With selenium, I am now able to find the table row, click on the link, and the new tab opens. The problem is that I can't find any way to switch the focus to the newly opened tab. I tried to get all windowHandles and see if I could switch, but even after the new tab has opened, there is only 1 windowHandle.
Below is my code:
WebElement tableRow=driver.findElement(By.xpath("/html/body/div[1]/table/tbody/tr[2]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", tableRow);
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
The Arraylist always contains 1 single windowHandle, not 2. So I am not able to switch focus to the new tab. Is there any way to solve this?
To properly switch to the newly opened Tab you need to induce WebDriverWait for the New Tab to render and then through a for()
loop you need to iterate through the available WindowHandles and invoke switchTo().window()
with the WindowHandle which is not the previous TAB through the following code block :
String first_handle = driver.getWindowHandle();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", tableRow);
new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> allHandles = driver.getWindowHandles();
for(String winHandle:allHandles)
{
if (!first_handle.equalsIgnoreCase(winHandle)
{
driver.switchTo().window(winHandle);
}
}
Maybe you just have to wait until a second window is created? Maybe selenium checks window handles too fast?
Try with WebDriverWait
Example:
String currentHandle = driver.getWindowHandle();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> allHandles = driver.getWindowHandles();
for (String handle : allHandles) {
if (!handle.equals(currentHandle)) driver.switchTo().window(handle);
}
If a number of windows will be less or more than 2, TimeoutException
will occur.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With