Selenium切换焦点到标签,点击链接后打开

时间:2018-02-28 13:45:52

标签: java selenium tabs focus

出于自动化目的,我正在创建一个在表中查找行的脚本。此行可单击并打开新标签/地址。

使用selenium,我现在能够找到表格行,点击链接,然后打开新标签页。问题是我无法找到将焦点切换到新打开的标签的方法。我试图获取所有windowHandles并查看是否可以切换,但即使在新选项卡打开后,也只有1个windowHandle。

以下是我的代码:

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);
    }

Arraylist总是包含1个单一的windowHandle,而不是2.所以我无法将焦点切换到新标签。有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

要正确切换到新打开的选项卡,您需要为新标签引导 WebDriverWait 进行渲染,然后通过{{1你需要循环遍历可用的 WindowHandles 并使用 WindowHandle 调用for(),而不是之前的TAB通过以下代码块调用switchTo().window()

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);
    }
}

答案 1 :(得分:1)

也许你只需要等到第二个窗口创建?也许selenium检查窗口句柄太快了?

尝试使用WebDriverWait

示例:

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);
}

如果窗口数量少于或大于2,则会出现TimeoutException

答案 2 :(得分:1)

 **Try this code:**

   public static void switchToNewWindow(WebDriver driver, WebElement 
   causeOfNewWindow) {

    // Get Handles before opening new window
    Set<String> oldHandles = driver.getWindowHandles();

    // Click element to open new Window
    causeOfNewWindow.click();

    // Get Handles after opening new window
    Set<String> newHandles = driver.getWindowHandles();

    for (String handle : newHandles) {

        if (!oldHandles.contains(handle)) {
            driver.switchTo().window(handle);
        }

    }
}