Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium switch focus to tab, which opened after clicking link

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?

like image 523
Jelleko Avatar asked Jan 02 '23 17:01

Jelleko


2 Answers

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);
    }
}
like image 112
undetected Selenium Avatar answered Jan 05 '23 16:01

undetected Selenium


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.

like image 32
Fenio Avatar answered Jan 05 '23 18:01

Fenio