package jp.vmi.selenium.selenese.subcommand; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.NoSuchWindowException; import org.openqa.selenium.WebDriver; import jp.vmi.selenium.selenese.Context; /** * "getAllWindowNames". */ public class GetAllWindowNames extends AbstractSubCommand<List<String>> { /** * Constructor. */ public GetAllWindowNames() { super(); } private static boolean switchToWindow(WebDriver driver, String handle) { try { driver.switchTo().window(handle); return true; } catch (NoSuchWindowException e) { return false; } } private static String getNameOrHandle(WebDriver driver, String handle) { String name = ((JavascriptExecutor) driver).executeScript("return window.name").toString(); return (name == null || name.isEmpty()) ? handle : name; } @Override public List<String> execute(Context context, String... args) { WebDriver driver = context.getWrappedDriver(); String initHandle = context.getInitialWindowHandle(); String currentHandle = driver.getWindowHandle(); Set<String> handles = driver.getWindowHandles(); List<String> result = new ArrayList<String>(handles.size()); result.add(getNameOrHandle(driver, currentHandle)); handles.remove(currentHandle); if (!currentHandle.equals(initHandle) && handles.contains(initHandle)) { switchToWindow(driver, initHandle); result.add(0, getNameOrHandle(driver, initHandle)); handles.remove(initHandle); } for (String handle : handles) { if (switchToWindow(driver, handle)) result.add(getNameOrHandle(driver, handle)); } switchToWindow(driver, currentHandle); return result; } }